diff --git a/Web/Models/Entities/Log.php b/Web/Models/Entities/Log.php
deleted file mode 100644
index eabfd36f..00000000
--- a/Web/Models/Entities/Log.php
+++ /dev/null
@@ -1,190 +0,0 @@
-getRecord()->id;
- }
-
- function getUser(): ?User
- {
- return (new Users)->get((int) $this->getRecord()->user);
- }
-
- function getObjectTable(): string
- {
- return $this->getRecord()->object_table;
- }
-
- function getObjectId(): int
- {
- return $this->getRecord()->object_id;
- }
-
- function getObject()
- {
- $model = $this->getRecord()->object_model;
- return new $model(DatabaseConnection::i()->getContext()->table($this->getObjectTable())->get($this->getObjectId()));
- }
-
- function getTypeRaw(): int
- {
- return $this->getRecord()->type;
- }
-
- function getType(): string
- {
- return ["добавил", "отредактировал", "удалил", "восстановил"][$this->getTypeRaw()];
- }
-
- function getTypeNom(): string
- {
- return ["Создание", "Редактирование", "Удаление", "Восстановление"][$this->getTypeRaw()];
- }
-
- function getObjectType(): string
- {
- return [
- "albums" => "Альбом",
- "groups" => "Сообщество",
- "profiles" => "Профиль",
- "comments" => "Комментарий",
- "ip" => "IP-адрес",
- "posts" => "Запись",
- "tickets" => "Вопрос",
- "tickets_comments" => "Комментарий к тикету",
- ][$this->getRecord()->object_table] ?? $this->getRecord()->object_model;
- }
-
- function getObjectName(): string
- {
- $object = $this->getObject();
- if (method_exists($object, 'getCanonicalName'))
- return $object->getCanonicalName();
- else return "[#" . $this->getObjectId() . "] " . $this->getObjectType();
- }
-
- function getLogsText(): string
- {
- return $this->getRecord()->logs_text;
- }
-
- function getObjectURL(): string
- {
- $object = $this->getObject();
- if (method_exists($object, "getURL") && $this->getObjectTable() !== "videos")
- return $this->getObject()->getURL();
- else
- return "#";
- }
-
- function getObjectAvatar(): ?string
- {
- $object = $this->getObject();
- if (method_exists($object, 'getAvatarURL'))
- return $object->getAvatarURL("normal");
- else return NULL;
- }
-
- function getOldValue(): ?array
- {
- return (array) json_decode($this->getRecord()->xdiff_old, true, JSON_UNESCAPED_UNICODE) ?? null;
- }
-
- function getNewValue(): ?array
- {
- return (array) json_decode($this->getRecord()->xdiff_new, true, JSON_UNESCAPED_UNICODE) ?? null;
- }
-
- function getTime(): DateTime
- {
- return new DateTime($this->getRecord()->ts);
- }
-
- function diff($old, $new): array
- {
- $matrix = array();
- $maxlen = 0;
- foreach ($old as $oindex => $ovalue) {
- $nkeys = array_keys($new, $ovalue);
- foreach ($nkeys as $nindex) {
- $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ?
- $matrix[$oindex - 1][$nindex - 1] + 1 : 1;
- if ($matrix[$oindex][$nindex] > $maxlen) {
- $maxlen = $matrix[$oindex][$nindex];
- $omax = $oindex + 1 - $maxlen;
- $nmax = $nindex + 1 - $maxlen;
- }
- }
- }
- if ($maxlen == 0) return array(array('d' => $old, 'i' => $new));
- return array_merge(
- $this->diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)),
- array_slice($new, $nmax, $maxlen),
- $this->diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen)));
- }
-
- function htmlDiff($old, $new): string
- {
- $ret = '';
- $diff = $this->diff(preg_split("/[\s]+/", $old), preg_split("/[\s]+/", $new));
- foreach ($diff as $k) {
- if (is_array($k))
- $ret .= (!empty($k['d']) ? "" . implode(' ', $k['d']) . " " : '') .
- (!empty($k['i']) ? "" . implode(' ', $k['i']) . " " : '');
- else $ret .= $k . ' ';
- }
- return $ret;
- }
-
- function getChanges(): array
- {
- $result = $this->getOldValue();
- $_changes = [];
-
- if ($this->getTypeRaw() === 1) { // edit
- $changes = $this->getNewValue();
-
- foreach ($changes as $field => $value) {
- $new_value = xdiff_string_patch((string) $result[$field], (string) $value);
- $_changes[$field] = [
- "field" => $field,
- "old_value" => $result[$field],
- "new_value" => strlen($new_value) > 0 ? $new_value : "(empty)",
- "ts" => $this->getTime(),
- "diff" => $this->htmlDiff((string) $result[$field], (string) $new_value)
- ];
- }
- } else if ($this->getTypeRaw() === 0) { // create
- foreach ($result as $field => $value) {
- $_changes[$field] = [
- "field" => $field,
- "old_value" => $value,
- "ts" => $this->getTime()
- ];
- }
- } else if ($this->getTypeRaw() === 2) { // delete
- $_changes[] = [
- "field" => "deleted",
- "old_value" => 0,
- "new_value" => 1,
- "ts" => $this->getTime(),
- "diff" => $this->htmlDiff("0", "1")
- ];
- }
-
- return $_changes;
- }
-}
diff --git a/Web/Models/Repositories/Logs.php b/Web/Models/Repositories/Logs.php
deleted file mode 100644
index 13d2f592..00000000
--- a/Web/Models/Repositories/Logs.php
+++ /dev/null
@@ -1,96 +0,0 @@
-context = DatabaseConnection::i()->getContext();
- $this->logs = $this->context->table("logs");
- }
-
- private function toLog(?ActiveRow $ar): ?Log
- {
- return is_null($ar) ? NULL : new Log($ar);
- }
-
- function get(int $id): ?Log
- {
- return $this->toLog($this->logs->get($id));
- }
-
- function create(int $user, string $table, string $model, int $type, $object, $changes, ?string $ip = NULL, ?string $useragent = NULL): void
- {
- if (OPENVK_ROOT_CONF["openvk"]["preferences"]["logs"] === true) {
- $fobject = (is_array($object) ? $object : $object->unwrap());
- $nobject = [];
- $_changes = [];
-
- if ($type === 1) {
- foreach ($changes as $field => $value) {
- $nobject[$field] = $fobject[$field];
- }
-
- foreach (array_diff_assoc($nobject, $changes) as $field => $value) {
- if (str_starts_with($field, "rate_limit")) continue;
- if ($field === "online") continue;
- $_changes[$field] = xdiff_string_diff((string)$nobject[$field], (string)$changes[$field]);
- }
-
- if (count($_changes) === 0) return;
- } else if ($type === 0) { // if new
- $nobject = $fobject;
- foreach ($fobject as $field => $value) {
- $_changes[$field] = xdiff_string_diff("", (string)$value);
- }
- } else if ($type === 2 || $type === 3) { // if deleting or restoring
- $_changes["deleted"] = (int)($type === 2);
- }
-
- $log = new Log;
- $log->setUser($user);
- $log->setType($type);
- $log->setObject_Table($table);
- $log->setObject_Model($model);
- $log->setObject_Id(is_array($object) ? $object["id"] : $object->getId());
- $log->setXdiff_Old(json_encode($nobject));
- $log->setXdiff_New(json_encode($_changes));
- $log->setTs(time());
- $log->setIp($ip ?? CurrentUser::i()->getIP());
- $log->setUserAgent($useragent ?? CurrentUser::i()->getUserAgent());
- $log->save();
- }
- }
-
- function find(string $query, array $pars = [], string $sort = "id DESC", int $page = 1, ?int $perPage = NULL): \Traversable
- {
- $query = "%$query%";
- $result = $this->logs->where("id LIKE ? OR object_table LIKE ?", $query, $query);
-
- return new Util\EntityStream("Log", $result->order($sort));
- }
-
- function search($filter): \Traversable
- {
- foreach ($this->logs->where($filter)->order("id DESC") as $log)
- yield new Log($log);
- }
-
- function getTypes(): array
- {
- $types = [];
- foreach ($this->context->query("SELECT DISTINCT(`object_model`) AS `object_model` FROM `logs`")->fetchAll() as $type)
- $types[] = str_replace("openvk\\Web\\Models\\Entities\\", "", $type->object_model);
-
- return $types;
- }
-}
diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php
index 8ad00380..8d2dd477 100644
--- a/Web/Presenters/AdminPresenter.php
+++ b/Web/Presenters/AdminPresenter.php
@@ -1,5 +1,7 @@
users = $users;
$this->clubs = $clubs;
@@ -22,7 +24,7 @@ final class AdminPresenter extends OpenVKPresenter
$this->gifts = $gifts;
$this->bannedLinks = $bannedLinks;
$this->chandlerGroups = $chandlerGroups;
- $this->logs = $logs;
+ $this->logs = DatabaseConnection::i()->getContext()->table("ChandlerLogs");
parent::__construct();
}
@@ -590,7 +592,7 @@ final class AdminPresenter extends OpenVKPresenter
$this->template->type = $type;
}
if ($this->queryParam("uid")) {
- $user = (int) $this->queryParam("uid");
+ $user = $this->queryParam("uid");
$filter["user"] = $user;
$this->template->user = $user;
}
@@ -600,17 +602,12 @@ final class AdminPresenter extends OpenVKPresenter
$this->template->obj_id = $obj_id;
}
if ($this->queryParam("obj_type") !== NULL && $this->queryParam("obj_type") !== "any") {
- $obj_type = "openvk\\Web\\Models\\Entities\\" . $this->queryParam("obj_type");
+ $obj_type = CHANDLER_ROOT_CONF["preferences"]["logs"]["entitiesNamespace"] . $this->queryParam("obj_type");
$filter["object_model"] = $obj_type;
$this->template->obj_type = $obj_type;
}
- if (count($filter) === 0) {
- $this->template->logs = $this->searchResults($this->logs, $this->template->count);
- } else {
- $this->template->logs = $this->logs->search($filter);
- }
-
+ $this->template->logs = (new Logs)->search($filter);
$this->template->object_types = (new Logs)->getTypes();
}
}
diff --git a/Web/Presenters/templates/Admin/Logs.xml b/Web/Presenters/templates/Admin/Logs.xml
index e30df251..982b790c 100644
--- a/Web/Presenters/templates/Admin/Logs.xml
+++ b/Web/Presenters/templates/Admin/Logs.xml
@@ -9,7 +9,6 @@
{/block}
{block content}
- {var $logs = iterator_to_array($logs)}
{var $amount = sizeof($logs)}