Compare commits

..

2 Commits

4 changed files with 64 additions and 67 deletions

View File

@ -50,10 +50,10 @@ class journal
* Инициализация * Инициализация
* *
* @param _connection $session Сессия соединения с базой данных * @param _connection $session Сессия соединения с базой данных
* @param string $document Идентификатор документа * @param string $document Идентификатор документа для которого нужен журнал
* @param bool $create Создавать коллекции при их отсутствии * @param bool $create Создавать коллекции при их отсутствии?
* *
* @return static|null Объект с инстанцией журнала * @return static|null Инстанция журнала
*/ */
public static function init(_connection $session, string $document, bool $create = true): ?static public static function init(_connection $session, string $document, bool $create = true): ?static
{ {
@ -66,22 +66,16 @@ class journal
} }
if (empty($journal = static::search($session, $document))) { if (empty($journal = static::search($session, $document))) {
// Не найден журнал (подразумевается, что его не существует) // Не найден журнал (подразумевается, что его не существует или истёк срок использования)
if (empty($journal = document::write($session, static::COLLECTION_JOURNAL, [ // Создание журнала
if (empty(document::write($session, static::COLLECTION_JOURNAL, [
'events' => [], 'events' => [],
'expires' => strtotime('first day of next month 00:00') 'expires' => strtotime('first day of next month 00:00')
]))) { ])) || empty($journal = static::search($session, $document))) return null;
// Не удалось создать документ
return null; // Cоздание ребра: {$document} -> ЖУРНАЛ
} if (empty(document::write($session, longpoll::COLLECTION_ACCESSED, ['_from' => $document, '_to' => $journal->getId()]))) return null;
if (empty(document::write($session, longpoll::COLLECTION_ACCESSED, ['_from' => $document, '_to' => $journal]))) {
// Не удалось создать ребро: {$document} -> ЖУРНАЛ
return null;
}
} }
// Инициализация инстанции журнала и возврат // Инициализация инстанции журнала и возврат
@ -94,7 +88,7 @@ class journal
* Находит актуальный документ журнала * Находит актуальный документ журнала
* *
* @param _connection $session Сессия соединения с базой данных * @param _connection $session Сессия соединения с базой данных
* @param string $document Идентификатор документа * @param string $document Идентификатор документа для которого нужен журнал
* *
* @return _document|null Инстанция (static::COLLECTION_JOURNAL) или его идентификатор * @return _document|null Инстанция (static::COLLECTION_JOURNAL) или его идентификатор
*/ */
@ -117,7 +111,7 @@ class journal
FOR a IN $collection FOR a IN $collection
LET b = ( LET b = (
FOR vertex, edge IN INBOUND a $edge FOR vertex, edge IN INBOUND a $edge
FILTER vertex._id == $document FILTER vertex._id == "$document"
LIMIT 1 LIMIT 1
RETURN vertex RETURN vertex
) )

View File

@ -25,7 +25,7 @@ use ArangoDBClient\Document as _document,
class account class account
{ {
/** /**
* Инициализировать * Инициализация
* *
* @param _connection $session Сессия соединения с базой данных * @param _connection $session Сессия соединения с базой данных
* @param int $id Идентификатор ВКонтакте * @param int $id Идентификатор ВКонтакте
@ -43,7 +43,7 @@ class account
collection::init($session, longpoll::COLLECTION_ACCOUNTS); collection::init($session, longpoll::COLLECTION_ACCOUNTS);
} }
// Поиск // Поиск аккаунта
if ($account = static::search($session, $id)); if ($account = static::search($session, $id));
else if ($account = document::write($session, longpoll::COLLECTION_ACCOUNTS, ['id' => $id]) and $journal) else if ($account = document::write($session, longpoll::COLLECTION_ACCOUNTS, ['id' => $id]) and $journal)
journal::init($session, $account)->write('create', [ journal::init($session, $account)->write('create', [
@ -62,12 +62,13 @@ class account
] ]
]); ]);
// Поиск
// Поиск аккаунта
return static::search($session, $id); return static::search($session, $id);
} }
/** /**
* Найти * Найти аккаунт
* *
* @param _connection $session Сессия соединения с базой данных * @param _connection $session Сессия соединения с базой данных
* @param int $id Идентификатор ВКонтакте * @param int $id Идентификатор ВКонтакте

View File

@ -36,55 +36,57 @@ class chat
*/ */
public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document public static function init(_connection $session, int $id, bool $journal = true, bool $create = true): ?_document
{ {
// Инициализация коллекции
$collection = longpoll::COLLECTION_CHATS;
if ($create) { if ($create) {
// Запрошено создание коллекций в случае их отсутствия // Запрошено создание коллекций в случае их отсутствия
// Создание коллекции // Создание коллекции
collection::init($session, longpoll::COLLECTION_CHATS); collection::init($session, $collection);
} }
// Поиск if ($account = collection::search($session, <<<AQL
if ($chat = static::search($session, $id)); FOR x IN $collection
else if ($chat = document::write($session, longpoll::COLLECTION_CHATS, ['id' => $id]) and $journal) FILTER x.id == "$id"
journal::init($session, $chat)->write('create', [
'changes' => [
'new' => collection::search($session, sprintf(
<<<'AQL'
FOR x IN %s
FILTER x._id == "%s"
LIMIT 1
RETURN x
AQL,
longpoll::COLLECTION_CHATS,
$chat
)),
'old' => null
]
]);
// Поиск
return static::search($session, $id);
}
/**
* Найти в базе данных
*
* @param _connection $session Сессия соединения с базой данных
* @param int $id Идентификатор ВКонтакте
*
* @return ?_document Инстанция документа
*/
public static function search(_connection $session, int $id): ?_document
{
return collection::search($session, sprintf(
<<<'AQL'
FOR x IN %s
FILTER x.id == %u
LIMIT 1 LIMIT 1
RETURN x RETURN x
AQL, AQL)) {
longpoll::COLLECTION_CHATS, // Найден аккаунт
$id
)); return $account;
}
if ($account = document::write($session, $collection, ['id' => $id])) {
// Аккаунт записан
// Журналирование
if ($journal && journal::init($session, $account)->write('create', [
'changes' => [
'new' => collection::search($session, <<<AQL
FOR x IN $collection
FILTER x._id == "$account"
LIMIT 1
RETURN x
AQL),
'old' => null
]
])) {
// Записаны данные в журнал
}
if ($account = collection::search($session, <<<AQL
FOR x IN $collection
FILTER x.id == "$id"
LIMIT 1
RETURN x
AQL)) {
// Найден аккаунт
return $account;
}
}
return null;
} }
} }

View File

@ -33,7 +33,7 @@ class group
collection::init($session, longpoll::COLLECTION_GROUPS); collection::init($session, longpoll::COLLECTION_GROUPS);
} }
// Поиск // Поиск группы
if ($group = static::search($session, $id)); if ($group = static::search($session, $id));
else if ($group = document::write($session, longpoll::COLLECTION_GROUPS, ['id' => $id]) and $journal) else if ($group = document::write($session, longpoll::COLLECTION_GROUPS, ['id' => $id]) and $journal)
journal::init($session, $group)->write('create', [ journal::init($session, $group)->write('create', [
@ -53,12 +53,12 @@ class group
]); ]);
// Поиск // Поиск группы
return static::search($session, $id); return static::search($session, $id);
} }
/** /**
* Найти в базе данных * Найти группу
* *
* @param _connection $session Сессия соединения с базой данных * @param _connection $session Сессия соединения с базой данных
* @param int $id Идентификатор ВКонтакте * @param int $id Идентификатор ВКонтакте
@ -70,7 +70,7 @@ class group
return collection::search($session, sprintf( return collection::search($session, sprintf(
<<<'AQL' <<<'AQL'
FOR x IN %s FOR x IN %s
FILTER x.id == %d FILTER x.id == %u
LIMIT 1 LIMIT 1
RETURN x RETURN x
AQL, AQL,