* SPDX-License-Identifier: AGPL-3.0-or-later */ namespace KTXM\FileProviderLocal\Providers\Personal; use DateTimeImmutable; use KTXF\Files\Node\INodeCollectionBase; use KTXF\Files\Node\INodeCollectionMutable; use KTXF\Files\Node\NodeType; /** * NodeCollection implementation - represents a folder/collection in the file system */ class NodeCollection implements INodeCollectionBase, INodeCollectionMutable { // node system properties private string|null $tenantId = null; private string|null $userId = null; private string|int|null $nodeIn = null; private string|int|null $nodeId = null; private string|null $nodeCreatedBy = null; private DateTimeImmutable|null $nodeCreatedOn = null; private string|null $nodeModifiedBy = null; private DateTimeImmutable|null $nodeModifiedOn = null; private string|null $nodeOwner = null; private string|null $nodeSignature = null; // node specific properties private string|null $nodeLabel = null; public function jsonSerialize(): mixed { return [ // node meta properties self::JSON_PROPERTY_TYPE => self::JSON_TYPE, self::JSON_PROPERTY_IN => $this->nodeIn, self::JSON_PROPERTY_ID => $this->nodeId, self::JSON_PROPERTY_CREATED_BY => $this->nodeCreatedBy, self::JSON_PROPERTY_CREATED_ON => $this->nodeCreatedOn?->format('c'), self::JSON_PROPERTY_MODIFIED_BY => $this->nodeModifiedBy, self::JSON_PROPERTY_MODIFIED_ON => $this->nodeModifiedOn?->format('c'), self::JSON_PROPERTY_OWNER => $this->nodeOwner, self::JSON_PROPERTY_SIGNATURE => $this->nodeSignature, // node specific properties self::JSON_PROPERTY_LABEL => $this->nodeLabel, ]; } public function jsonDeserialize(array|string $data): static { if (is_string($data)) { $data = json_decode($data, true); } // node meta properties $this->nodeIn = $data[self::JSON_PROPERTY_IN] ?? null; $this->nodeId = $data[self::JSON_PROPERTY_ID] ?? null; $this->nodeCreatedBy = $data[self::JSON_PROPERTY_CREATED_BY] ?? null; $this->nodeCreatedOn = isset($data[self::JSON_PROPERTY_CREATED_ON]) ? new DateTimeImmutable($data[self::JSON_PROPERTY_CREATED_ON]) : null; $this->nodeModifiedBy = $data[self::JSON_PROPERTY_MODIFIED_BY] ?? null; $this->nodeModifiedOn = isset($data[self::JSON_PROPERTY_MODIFIED_ON]) ? new DateTimeImmutable($data[self::JSON_PROPERTY_MODIFIED_ON]) : null; $this->nodeOwner = $data[self::JSON_PROPERTY_OWNER] ?? null; $this->nodeSignature = $data[self::JSON_PROPERTY_SIGNATURE] ?? null; // node specific properties $this->nodeLabel = $data[self::JSON_PROPERTY_LABEL] ?? null; return $this; } public function fromStore(array|object $document): self { if (is_object($document)) { $document = (array) $document; } // node system properties $this->tenantId = $document['tid'] ?? null; $this->userId = $document['uid'] ?? null; $this->nodeId = $document['nid'] ?? null; $this->nodeIn = $document['pid'] ?? null; $this->nodeCreatedBy = $document['createdBy'] ?? null; $this->nodeCreatedOn = isset($document['createdOn']) ? new DateTimeImmutable($document['createdOn']) : null; $this->nodeModifiedBy = $document['modifiedBy'] ?? null; $this->nodeModifiedOn = isset($document['modifiedOn']) ? new DateTimeImmutable($document['modifiedOn']) : null; $this->nodeOwner = $document['owner'] ?? null; $this->nodeSignature = $document['signature'] ?? md5(json_encode([ $this->nodeId, NodeType::Collection->value, $document['modifiedOn'] ?? '' ])); // node specific properties $this->nodeLabel = $document['label'] ?? null; return $this; } public function toStore(): array { $now = date('c'); return [ // node system properties 'tid' => $this->tenantId, 'uid' => $this->userId, 'nid' => $this->nodeId, 'pid' => $this->nodeIn, 'type' => NodeType::Collection->value, 'createdBy' => $this->nodeCreatedBy, 'createdOn' => $this->nodeCreatedOn?->format('c') ?? $now, 'modifiedBy' => $this->nodeModifiedBy, 'modifiedOn' => $this->nodeModifiedOn?->format('c') ?? $now, 'owner' => $this->nodeOwner, 'signature' => $this->nodeSignature, // node specific properties 'label' => $this->nodeLabel, ]; } // Immutable properties public function in(): string|int|null { return $this->nodeIn; } public function id(): string|int { return $this->nodeId ?? ''; } public function type(): NodeType { return NodeType::Collection; } public function createdBy(): string|null { return $this->nodeCreatedBy; } public function createdOn(): DateTimeImmutable|null { return $this->nodeCreatedOn; } public function modifiedBy(): string|null { return $this->nodeModifiedBy; } public function modifiedOn(): DateTimeImmutable|null { return $this->nodeModifiedOn; } public function signature(): string|null { return $this->nodeSignature; } public function isCollection(): bool { return true; } public function isEntity(): bool { return false; } // Mutable properties public function getLabel(): string|null { return $this->nodeLabel; } public function setLabel(string $value): static { $this->nodeLabel = $value; return $this; } }