From 4eecb4c5edce332bb16d77a70a904c2b422ad7ef Mon Sep 17 00:00:00 2001 From: mirzaev Date: Wed, 26 Feb 2025 13:27:59 +0700 Subject: [PATCH] resolved #13, resolved #14 --- author/project/system/models/core.php | 199 +-------------- .../system/models/enumerations/language.php | 30 ++- .../system/models/enumerations/session.php | 21 -- .../system/models/interfaces/collection.php | 31 --- .../system/models/interfaces/document.php | 81 ------ author/project/system/models/session.php | 233 ------------------ .../project/system/models/traits/buffer.php | 84 ------- .../project/system/models/traits/document.php | 206 ---------------- author/project/system/models/traits/files.php | 1 + .../project/system/models/traits/status.php | 59 ----- 10 files changed, 29 insertions(+), 916 deletions(-) delete mode 100755 author/project/system/models/enumerations/session.php delete mode 100755 author/project/system/models/interfaces/collection.php delete mode 100755 author/project/system/models/interfaces/document.php delete mode 100755 author/project/system/models/session.php delete mode 100755 author/project/system/models/traits/buffer.php delete mode 100755 author/project/system/models/traits/document.php delete mode 100755 author/project/system/models/traits/status.php diff --git a/author/project/system/models/core.php b/author/project/system/models/core.php index 6299834..8cc51b7 100755 --- a/author/project/system/models/core.php +++ b/author/project/system/models/core.php @@ -8,15 +8,6 @@ namespace ${REPO_OWNER}\${REPO_NAME}\models; use mirzaev\minimal\model, mirzaev\minimal\http\enumerations\status; -// Framework for ArangoDB -use mirzaev\arangodb\connection as arangodb, - mirzaev\arangodb\collection, - mirzaev\arangodb\document; - -// Library for ArangoDB -use ArangoDBClient\Document as _document, - ArangoDBClient\DocumentHandler as _document_handler; - // Built-in libraries use exception; @@ -25,206 +16,30 @@ use exception; * * @package ${REPO_OWNER}\${REPO_NAME}\models * - * @param public ARANGODB Path to the file with ArangoDB session connection data - * @param arangodb $$arangodb Instance of the ArangoDB session - * - * @method void __construct(bool $$initialize, ?arangodb $$arangodb) Constructor - * @method _document|static|array|null read(string $$filter, string $$sort, int $$amount, int $$page, string $$return, array $$parameters, array &$$errors) Read document from ArangoDB + * @method void __construct() Constructor * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License + * @author Arsen Mirzaev Tatyano-Muradovich * @author ${REPO_OWNER} */ class core extends model { /** - * ArangoDB connection daa + * File * - * @var string ARANGODB Path to the file with ArangoDB session connection data + * @var string $database Path to the database file */ - final public const string ARANGODB = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR . 'arangodb.php'; - - /** - * ArangoDB - * - * @var arangodb $$arangodb Instance of the ArangoDB session - */ - protected static arangodb $$arangodb; + protected string $$file = DATABASES . DIRECTORY_SEPARATOR . 'example.baza'; /** * Constructor * - * @param bool $$initialize Initialize a model? - * @param ?arangodb $$arangodb Instance of the ArangoDB session + * Initialize the database * * @return void */ - public function __construct(bool $$initialize = true, ?arangodb $$arangodb = null) + public function __construct() { - // For the extends system - parent::__construct($$initialize); - - if ($$initialize) { - // Initializing is requested - - // Writing an instance of a session of ArangoDB to the property - self::$$arangodb = $$arangodb ?? new arangodb(require static::ARANGODB); - } - } - - /** - * Read document from ArangoDB - * - * @param string $$filter Expression for filtering (AQL) - * @param string $$sort Expression for sorting (AQL) - * @param int $$amount Amount of documents for collect - * @param int $$page Page - * @param string $$return Expression describing the parameters to return (AQL) - * @param array $$parameters Binded parameters for placeholders ['placeholder' => parameter] - * @param array &$$errors Registry of errors - * - * @return mixed An array of instances of documents from ArangoDB, if they are found - */ - public static function _read( - string $$filter = '', - string $$sort = 'd.created DESC, d._key DESC', - int $$amount = 1, - int $$page = 1, - string $$return = 'd', - array $$parameters = [], - array &$$errors = [] - ): _document|static|array|null { - try { - if (collection::initialize(static::COLLECTION, static::TYPE)) { - // Initialized the collection - - // Read from ArangoDB - $$result = collection::execute( - sprintf( - <<<'AQL' - FOR d IN @@collection - %s - %s - LIMIT @offset, @amount - RETURN %s - AQL, - empty($$filter) ? '' : "FILTER $$filter", - empty($$sort) ? '' : "SORT $$sort", - empty($$return) ? 'd' : $$return - ), - [ - '@collection' => static::COLLECTION, - 'offset' => --$$page <= 0 ? 0 : $$page * $$amount, - 'amount' => $$amount - ] + $$parameters, - errors: $$errors - ); - - if ($$amount === 1 && $$result instanceof _document) { - // Received only 1 document and @todo rebuild - - // Initializing the object - $$object = new static; - - if (method_exists($$object, '__document')) { - // Object can implement a document from ArangoDB - - // Writing the instance of document from ArangoDB to the implement object - $$object->__document($$result); - - // Exit (success) - return $$object; - } - } - - // Exit (success) - return $$result; - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return null; - } - - /** - * Write - * - * @param string $$name Name of the property - * @param mixed $$value Value of the property - * - * @return void - */ - public function __set(string $$name, mixed $$value = null): void - { - match ($$name) { - 'arangodb' => (function () use ($$value) { - if (isset(static::$$arangodb)) throw new exception('Forbidden to reinitialize the ArangoDB session($$this::$$arangodb)', status::internal_server_error->value); - else if ($$value instanceof arangodb) self::$$arangodb = $$value; - else throw new exception('Session of connection to ArangoDB ($$this::$$arangodb) is need to be mirzaev\arangodb\connection', status::internal_server_error->value); - })(), - default => parent::__set($$name, $$value) - }; - } - - /** - * Read - * - * @param string $$name Name of the property - * - * @return mixed Content of the property, if they are found - */ - public function __get(string $$name): mixed - { - return match ($$name) { - default => parent::__get($$name) - }; - } - - /** - * Delete - * - * @param string $$name Name of the property - * - * @return void - */ - public function __unset(string $$name): void - { - // Deleting a property and exit (success) - parent::__unset($$name); - } - - /** - * Check of initialization - * - * @param string $$name Name of the property - * - * @return bool The property is initialized? - */ - public function __isset(string $$name): bool - { - // Check of initialization of the property and exit (success) - return parent::__isset($$name); - } - - /** - * Call a static property or method - * - * @param string $$name Name of the property or the method - * @param array $$arguments Arguments for the method - */ - public static function __callStatic(string $$name, array $$arguments): mixed - { - return match ($$name) { - 'arangodb' => (new static)->__get('arangodb'), - default => throw new exception("Not found: $$name", 500) - }; } } diff --git a/author/project/system/models/enumerations/language.php b/author/project/system/models/enumerations/language.php index e0e276a..29749ed 100755 --- a/author/project/system/models/enumerations/language.php +++ b/author/project/system/models/enumerations/language.php @@ -25,26 +25,38 @@ enum language * * Initialize label of the language * - * @param language|null $$language Language into which to translate + * @param language|null $language Language into which to translate * * @return string Translated label of the language - * - * @todo - * 1. More languages - * 2. Cases??? */ - public function label(?language $$language = language::en): string + public function label(?language $language = language::en): string { // Exit (success) - return match ($$this) { - language::en => match ($$language) { + return match ($this) { + language::en => match ($language) { language::en => 'English', language::ru => 'Английский' }, - language::ru => match ($$language) { + language::ru => match ($language) { language::en => 'Russian', language::ru => 'Русский' } }; } + + /** + * Flag + * + * Initialize the flag emoji of the language + * + * @return string The flag emoji of the language + */ + public function flag(): string + { + // Exit (success) + return match ($this) { + language::en => '🇺🇸', + language::ru => '🇷🇺' + }; + } } diff --git a/author/project/system/models/enumerations/session.php b/author/project/system/models/enumerations/session.php deleted file mode 100755 index 6163124..0000000 --- a/author/project/system/models/enumerations/session.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ -enum session -{ - case hash_only; - case hash_else_address; -} diff --git a/author/project/system/models/interfaces/collection.php b/author/project/system/models/interfaces/collection.php deleted file mode 100755 index 95db7e8..0000000 --- a/author/project/system/models/interfaces/collection.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ -interface collection -{ - /** - * Name of the collection in ArangoDB - */ - public const string COLLECTION = 'THIS_COLLECTION_SHOULD_NOT_EXIST'; - - /** - * Type of the collection in ArangoDB - */ - public const type TYPE = type::document; -} diff --git a/author/project/system/models/interfaces/document.php b/author/project/system/models/interfaces/document.php deleted file mode 100755 index dd7e28c..0000000 --- a/author/project/system/models/interfaces/document.php +++ /dev/null @@ -1,81 +0,0 @@ - - */ -interface document -{ - /** - * Write - * - * Write a property into an instance of the ArangoDB document - * - * @param string $$name Name of the property - * @param mixed $$value Content of the property - * - * @return void - */ - public function __set(string $$name, mixed $$value = null): void; - - /** - * Read - * - * Read a property from an instance of the ArangoDB docuemnt - * - * @param string $$name Name of the property - * - * @return mixed Content of the property - */ - public function __get(string $$name): mixed; - - - /** - * Delete - * - * Deinitialize the property in an instance of the ArangoDB document - * - * @param string $$name Name of the property - * - * @return void - */ - public function __unset(string $$name): void; - - /** - * Check of initialization - * - * Check of initialization of the property into an instance of the ArangoDB document - * - * @param string $$name Name of the property - * - * @return bool The property is initialized? - */ - public function __isset(string $$name): bool; - - /** - * Execute a method - * - * Execute a method from an instance of the ArangoDB document - * - * @param string $$name Name of the method - * @param array $$arguments Arguments for the method - * - * @return mixed Result of execution of the method - */ - public function __call(string $$name, array $$arguments = []): mixed; -} diff --git a/author/project/system/models/session.php b/author/project/system/models/session.php deleted file mode 100755 index 6cd4df4..0000000 --- a/author/project/system/models/session.php +++ /dev/null @@ -1,233 +0,0 @@ - - */ -final class session extends core implements document_interface, collection_interface -{ - use status, document_trait, buffer, cart { - buffer::write as write; - cart::initialize as cart; - } - - /** - * Collection name - * - * @var string COLLECTION Name of the collection in ArangoDB - */ - final public const string COLLECTION = 'session'; - - /** - * Session verification type - * - * @var verification VERIFICATION Type of session verification - */ - final public const verification VERIFICATION = verification::hash_else_address; - - /** - * Constructor - * - * Initialize session and write into the $$this->document property - * - * @param ?string $$hash Hash of the session in ArangoDB - * @param ?int $$expires Date of expiring of the session (used for creating a new session) - * @param array &$$errors Registry of errors - * - * @return void - */ - public function __construct(?string $$hash = null, ?int $$expires = null, array &$$errors = []) - { - try { - if (collection::initialize(static::COLLECTION, static::TYPE, errors: $$errors)) { - // Initialized the collection - - if (isset($$hash) && $$document = $$this->hash($$hash, errors: $$errors)) { - // Found the instance of the ArangoDB document of session and received a session hash - - // Writing document instance of the session from ArangoDB to the property of the implementing object - $$this->__document($$document); - } else if (static::VERIFICATION === verification::hash_else_address && $$document = $$this->address($$_SERVER['REMOTE_ADDR'], errors: $$errors)) { - // Found the instance of the ArangoDB document of session and received a session hash - - // Writing document instance of the session from ArangoDB to the property of the implementing object - $$this->__document($$document); - } else { - // Not found the instance of the ArangoDB document of session - - // Initializing a new session and write they into ArangoDB - $$_id = document::write( - static::COLLECTION, - [ - 'active' => true, - 'expires' => $$expires ?? time() + 604800, - 'address' => $$_SERVER['REMOTE_ADDR'], - 'x-forwarded-for' => $$_SERVER['HTTP_X_FORWARDED_FOR'] ?? null, - 'referer' => $$_SERVER['HTTP_REFERER'] ?? null, - 'useragent' => $$_SERVER['HTTP_USER_AGENT'] ?? null - ] - ); - - if ($$session = collection::execute( - <<<'AQL' - FOR d IN @@collection - FILTER d._id == @_id && d.expires > @time && d.active == true - RETURN d - AQL, - [ - '@collection' => static::COLLECTION, - '_id' => $$_id, - 'time' => time() - ], - errors: $$errors - )) { - // Found the instance of just created new session - - // Generating a hash and write into the instance of the ArangoDB document of session property - $$session->hash = sodium_bin2hex(sodium_crypto_generichash($$_id)); - - if (document::update($$session, errors: $$errors)) { - // Writed to ArangoDB - - // Writing instance of the session document from ArangoDB to the property of the implementing object - $$this->__document($$session); - } else throw new exception('Failed to write the session data'); - } else throw new exception('Failed to create or find just created session'); - } - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - } - - /** - * Search by hash - * - * Search for the session in ArangoDB by hash - * - * @param string $$hash Hash of the session in ArangoDB - * @param array &$$errors Registry of errors - * - * @return _document|null instance of document of the session in ArangoDB - */ - public static function hash(string $$hash, array &$$errors = []): ?_document - { - try { - if (collection::initialize(static::COLLECTION, static::TYPE, errors: $$errors)) { - // Collection initialized - - // Search the session data in ArangoDB - return collection::execute( - <<<'AQL' - FOR d IN @@collection - FILTER d.hash == @hash && d.expires > @time && d.active == true - RETURN d - AQL, - [ - '@collection' => static::COLLECTION, - 'hash' => $$hash, - 'time' => time() - ], - errors: $$errors - ); - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return null; - } - - /** - * Search by IP-address - * - * Search for the session in ArangoDB by IP-address - * - * @param string $$address IP-address writed to the session in ArangoDB - * @param array &$$errors Registry of errors - * - * @return _document|null instance of document of the session in ArangoDB - */ - public static function address(string $$address, array &$$errors = []): ?_document - { - try { - if (collection::initialize(static::COLLECTION, static::TYPE, errors: $$errors)) { - // Collection initialized - - // Search the session data in ArangoDB - return collection::execute( - <<<'AQL' - FOR d IN @@collection - FILTER d.address == @address && d.expires > @time && d.active == true - SORT d.updated DESC - LIMIT 1 - RETURN d - AQL, - [ - '@collection' => static::COLLECTION, - 'address' => $$address, - 'time' => time() - ], - errors: $$errors - ); - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return null; - }} diff --git a/author/project/system/models/traits/buffer.php b/author/project/system/models/traits/buffer.php deleted file mode 100755 index 68e1654..0000000 --- a/author/project/system/models/traits/buffer.php +++ /dev/null @@ -1,84 +0,0 @@ - - */ -trait buffer -{ - /** - * Write to buffer of the document - * - * @param array $$data Data for writing (merge) - * @param array &$$errors Registry of errors - * - * @return bool Is data has written into the document from ArangoDB? - */ - public function write(array $$data, array &$$errors = []): bool - { - try { - if (collection::initialize(static::COLLECTION, static::TYPE, errors: $$errors)) { - // Initialized the collection - - // Is the instance of the document from ArangoDB are initialized? - if (!isset($$this->document)) throw new exception('The instance of the sessoin document from ArangoDB is not initialized'); - - // Writing data into buffer of the instance of the document from ArangoDB - $$this->document->buffer = array_replace_recursive($$this->document->buffer ?? [], $$data); - - // Is the buffer of the instance of the document from ArangoDB exceed 10 megabytes? - if (mb_strlen(json_encode($$this->document->buffer)) > 10485760) throw new exception('The buffer size exceeds 10 megabytes'); - - // Serializing parameters - if ($$this->document->language instanceof language) $$this->document->language = $$this->document->language->name; - - // Writing to ArangoDB and exit (success) - return document::update($$this->document, errors: $$errors); - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return false; - } -} diff --git a/author/project/system/models/traits/document.php b/author/project/system/models/traits/document.php deleted file mode 100755 index 7b68505..0000000 --- a/author/project/system/models/traits/document.php +++ /dev/null @@ -1,206 +0,0 @@ - - */ -trait document -{ - /** - * Document - * - * @var _document $$document An instance of the document from ArangoDB - */ - protected readonly _document $$document; - - /** - * Constructor - * - * @param bool $$initialize Initialize a model? - * @param ?arangodb $$arangodb Instance of a session of ArangoDB - * @param _document|null|false $$document An instance of the ArangoDB document - * - * @return void - */ - public function __construct( - bool $$initialize = true, - ?arangodb $$arangodb = null, - _document|null|false $$document = false - ) { - // For the extends system - parent::__construct($$initialize, $$arangodb); - - // Writing to the property - if ($$document instanceof _document) $$this->__document($$document); - else if ($$document === null) throw new exception('Failed to initialize an instance of the document from ArangoDB'); - } - - /** - * Write or read document - * - * @param _document|null $$document Instance of document from ArangoDB - * - * @return _document|null Instance of document from ArangoDB - */ - public function __document(?_document $$document = null): ?_document - { - // Writing a property storing a document instance to ArangoDB - if ($$document) $$this->document ??= $$document; - - // Read a property storing a document instance to ArangoDB and exit (success) - return $$this->document ?? null; - } - - /** - * Connect - * - * @param collecton_interface $$document Document - * @param array &$$errors Registry of errors - * - * @return string|null The identifier of the created edge of the "connect" collection, if created - */ - public function connect(collection_interface $$document, array &$$errors = []): ?string - { - try { - if (collection::initialize(static::COLLECTION, static::TYPE, errors: $$errors)) { - if (collection::initialize(connect::COLLECTION, connect::TYPE, errors: $$errors)) { - if (collection::initialize($$document::COLLECTION, $$document::TYPE, errors: $$errors)) { - // Initialized collections - - if ($$this->document instanceof _document) { - // Initialized instance of the document from ArangoDB - - // Writing document and exit (success) - return framework_document::write( - connect::COLLECTION, - [ - '_from' => $$document->getId(), - '_to' => $$this->document->getId() - ], - errors: $$errors - ); - } else throw new exception('The instance of the document from ArangoDB is not initialized'); - } else throw new exception('Failed to initialize ' . $$document::TYPE . ' collection: ' . $$document::COLLECTION); - } else throw new exception('Failed to initialize ' . connect::TYPE . ' collection: ' . connect::COLLECTION); - } else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION); - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return null; - } - - /** - * Write - * - * Write a property into an instance of the ArangoDB document - * - * @param string $$name Name of the property - * @param mixed $$value Content of the property - * - * @return void - */ - public function __set(string $$name, mixed $$value = null): void - { - // Writing to the property into an instance of the ArangoDB document and exit (success) - $$this->document->{$$name} = $$value; - } - - /** - * Read - * - * Read a property from an instance of the ArangoDB docuemnt - * - * @param string $$name Name of the property - * - * @return mixed Content of the property - */ - public function __get(string $$name): mixed - { - // Read a property from an instance of the ArangoDB document and exit (success) - return match ($$name) { - default => $$this->document->{$$name} - }; - } - - /** - * Delete - * - * Deinitialize the property in an instance of the ArangoDB document - * - * @param string $$name Name of the property - * - * @return void - */ - public function __unset(string $$name): void - { - // Delete the property in an instance of the ArangoDB document and exit (success) - unset($$this->document->{$$name}); - } - - /** - * Check of initialization - * - * Check of initialization of the property into an instance of the ArangoDB document - * - * @param string $$name Name of the property - * - * @return bool The property is initialized? - */ - public function __isset(string $$name): bool - { - // Check of initializatio nof the property and exit (success) - return isset($$this->document->{$$name}); - } - - /** - * Execute a method - * - * Execute a method from an instance of the ArangoDB document - * - * @param string $$name Name of the method - * @param array $$arguments Arguments for the method - * - * @return mixed Result of execution of the method - */ - public function __call(string $$name, array $$arguments = []): mixed - { - // Execute the method and exit (success) - return method_exists($$this->document, $$name) ? $$this->document->{$$name}($$arguments) ?? null : null; - } -} diff --git a/author/project/system/models/traits/files.php b/author/project/system/models/traits/files.php index 8a191a4..6e72b73 100755 --- a/author/project/system/models/traits/files.php +++ b/author/project/system/models/traits/files.php @@ -17,6 +17,7 @@ use exception; * @package ${REPO_OWNER}\${REPO_NAME}\models\traits * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License + * @author Arsen Mirzaev Tatyano-Muradovich * @author ${REPO_OWNER} */ trait files diff --git a/author/project/system/models/traits/status.php b/author/project/system/models/traits/status.php deleted file mode 100755 index 68a8cfd..0000000 --- a/author/project/system/models/traits/status.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ -trait status -{ - /** - * Status - * - * Check document by its status - * - * @param array &$$errors Registry of errors - * - * @return ?bool Status, if found - */ - public function status(array &$$errors = []): ?bool - { - try { - // Read from ArangoDB and exit (success) - return $$this->document->active ?? false; - } catch (exception $$e) { - // Writing to the registry of errors - $$errors[] = [ - 'text' => $$e->getMessage(), - 'file' => $$e->getFile(), - 'line' => $$e->getLine(), - 'stack' => $$e->getTrace() - ]; - } - - // Exit (fail) - return null; - } -} -