Compare commits

..

No commits in common. "2.0.x" and "stable" have entirely different histories.

4 changed files with 62 additions and 59 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,16 +66,22 @@ 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; ]))) {
// Не удалось создать документ
// Cоздание ребра: {$document} -> ЖУРНАЛ return null;
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;
}
} }
// Инициализация инстанции журнала и возврат // Инициализация инстанции журнала и возврат
@ -88,7 +94,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) или его идентификатор
*/ */
@ -111,7 +117,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,13 +62,12 @@ 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,57 +36,55 @@ 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, $collection); collection::init($session, longpoll::COLLECTION_CHATS);
} }
if ($account = collection::search($session, <<<AQL // Поиск
FOR x IN $collection if ($chat = static::search($session, $id));
FILTER x.id == "$id" else if ($chat = document::write($session, longpoll::COLLECTION_CHATS, ['id' => $id]) and $journal)
LIMIT 1 journal::init($session, $chat)->write('create', [
RETURN x
AQL)) {
// Найден аккаунт
return $account;
}
if ($account = document::write($session, $collection, ['id' => $id])) {
// Аккаунт записан
// Журналирование
if ($journal && journal::init($session, $account)->write('create', [
'changes' => [ 'changes' => [
'new' => collection::search($session, <<<AQL 'new' => collection::search($session, sprintf(
FOR x IN $collection <<<'AQL'
FILTER x._id == "$account" FOR x IN %s
FILTER x._id == "%s"
LIMIT 1 LIMIT 1
RETURN x RETURN x
AQL), AQL,
longpoll::COLLECTION_CHATS,
$chat
)),
'old' => null 'old' => null
] ]
])) { ]);
// Записаны данные в журнал
// Поиск
return static::search($session, $id);
} }
if ($account = collection::search($session, <<<AQL /**
FOR x IN $collection * Найти в базе данных
FILTER x.id == "$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; ));
}
}
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 == %u FILTER x.id == %d
LIMIT 1 LIMIT 1
RETURN x RETURN x
AQL, AQL,