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

View File

@ -25,7 +25,7 @@ use ArangoDBClient\Document as _document,
class account
{
/**
* Инициализировать
* Инициализация
*
* @param _connection $session Сессия соединения с базой данных
* @param int $id Идентификатор ВКонтакте
@ -43,7 +43,7 @@ class account
collection::init($session, longpoll::COLLECTION_ACCOUNTS);
}
// Поиск
// Поиск аккаунта
if ($account = static::search($session, $id));
else if ($account = document::write($session, longpoll::COLLECTION_ACCOUNTS, ['id' => $id]) and $journal)
journal::init($session, $account)->write('create', [
@ -62,12 +62,13 @@ class account
]
]);
// Поиск
// Поиск аккаунта
return static::search($session, $id);
}
/**
* Найти
* Найти аккаунт
*
* @param _connection $session Сессия соединения с базой данных
* @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
{
// Инициализация коллекции
$collection = longpoll::COLLECTION_CHATS;
if ($create) {
// Запрошено создание коллекций в случае их отсутствия
// Создание коллекции
collection::init($session, longpoll::COLLECTION_CHATS);
collection::init($session, $collection);
}
// Поиск
if ($chat = static::search($session, $id));
else if ($chat = document::write($session, longpoll::COLLECTION_CHATS, ['id' => $id]) and $journal)
journal::init($session, $chat)->write('create', [
'changes' => [
'new' => collection::search($session, sprintf(
<<<'AQL'
FOR x IN %s
FILTER x._id == "%s"
if ($account = collection::search($session, <<<AQL
FOR x IN $collection
FILTER x.id == "$id"
LIMIT 1
RETURN x
AQL,
longpoll::COLLECTION_CHATS,
$chat
)),
AQL)) {
// Найден аккаунт
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
]
]);
// Поиск
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
if ($account = collection::search($session, <<<AQL
FOR x IN $collection
FILTER x.id == "$id"
LIMIT 1
RETURN x
AQL,
longpoll::COLLECTION_CHATS,
$id
));
AQL)) {
// Найден аккаунт
return $account;
}
}
return null;
}
}

View File

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