chore: standardize chrono provider

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-02-17 03:11:54 -05:00
parent f3d2e2690b
commit 5c6d508cac
7 changed files with 451 additions and 529 deletions

View File

@@ -9,154 +9,86 @@ declare(strict_types=1);
namespace KTXM\ProviderLocalChrono\Providers\Personal;
use DateTimeImmutable;
use KTXF\Chrono\Entity\IEntityBase;
use KTXF\Chrono\Entity\IEntityMutable;
use KTXF\Chrono\Entity\EntityMutableAbstract;
use KTXF\Chrono\Event\EventObject;
/**
* Entity wrapper - contains metadata and EntityData
* Personal Chrono Entity Resource Implementation
*/
class Entity implements IEntityBase, IEntityMutable {
class Entity extends EntityMutableAbstract {
// Metadata fields (system-managed)
private ?string $entityId = null;
private ?string $tenantId = null;
private ?string $userId = null;
private ?string $collectionId = null;
private ?string $createdOn = null;
private ?string $modifiedOn = null;
private ?string $entitySignature = null;
// Entity display properties
private ?int $entityPriority = null;
private ?bool $entityVisibility = null;
private ?string $entityColor = null;
private string|array|null $entityData = null;
private ?EventObject $entityDataObject = null;
public function jsonSerialize(): mixed {
return [
self::JSON_PROPERTY_TYPE => self::JSON_TYPE,
self::JSON_PROPERTY_IN => $this->collectionId,
self::JSON_PROPERTY_ID => $this->entityId,
self::JSON_PROPERTY_DATA => $this->entityData,
self::JSON_PROPERTY_SIGNATURE => $this->entitySignature,
];
}
public function jsonDeserialize(array|string $data): static
{
if (is_string($data)) {
$data = json_decode($data, true);
}
$this->entityId = $data[self::JSON_PROPERTY_ID] ?? null;
$this->collectionId = $data[self::JSON_PROPERTY_IN] ?? null;
$this->entitySignature = $data[self::JSON_PROPERTY_SIGNATURE] ?? null;
$this->entityData = $data[self::JSON_PROPERTY_DATA] ?? null;
return $this;
public function __construct(
string $provider = 'default',
string|int $service = 'personal',
) {
parent::__construct($provider, $service);
}
public function fromStore(array|object $document): self {
// Convert object to array if needed
if (is_object($document)) {
$document = (array) $document;
}
// Load metadata
$this->entityId = $document['eid'] ?? null;
$this->data[self::JSON_PROPERTY_IDENTIFIER] = $document['eid'] ?? null;
$this->tenantId = $document['tid'] ?? null;
$this->userId = $document['uid'] ?? null;
$this->collectionId = $document['cid'] ?? null;
$this->createdOn = $document['createdOn'] ?? null;
$this->modifiedOn = $document['modifiedOn'] ?? null;
$this->entityData = $document['data'] ?? null;
$this->entitySignature = md5(json_encode($this->entityData));
$this->data[self::JSON_PROPERTY_COLLECTION] = $document['cid'] ?? null;
$this->data[self::JSON_PROPERTY_CREATED] = $document['createdOn'] ?? null;
$this->data[self::JSON_PROPERTY_MODIFIED] = $document['modifiedOn'] ?? null;
$this->getProperties()->fromStore($document);
$this->data[self::JSON_PROPERTY_SIGNATURE] = md5(json_encode($this->getDataJson()));
$this->entityDataObject = null;
return $this;
}
public function toStore(): array {
$document = [
$document = array_filter([
'tid' => $this->tenantId,
'uid' => $this->userId,
'cid' => $this->collectionId,
'eid' => $this->entityId,
'createdOn' => $this->createdOn ?? date('c'),
'cid' => $this->collection(),
'eid' => $this->identifier(),
'createdOn' => $this->data[self::JSON_PROPERTY_CREATED] ?? date('c'),
'modifiedOn' => date('c'),
'data' => $this->entityData,
];
], static fn($value) => $value !== null);
$document = array_merge($document, $this->getProperties()->toStore());
return $document;
}
public function in(): string|int {
return $this->collectionId ?? '';
}
public function getProperties(): EntityProperties {
if (!isset($this->properties)) {
$this->properties = new EntityProperties([]);
}
public function id(): string|int {
return $this->entityId ?? '';
}
public function created(): ?DateTimeImmutable {
return $this->createdOn ? new DateTimeImmutable($this->createdOn) : null;
}
public function modified(): ?DateTimeImmutable {
return $this->modifiedOn ? new DateTimeImmutable($this->modifiedOn) : null;
}
public function signature(): ?string {
return $this->entitySignature;
}
public function getPriority(): ?int {
return $this->entityPriority;
}
public function setPriority(?int $value): static {
$this->entityPriority = $value;
return $this;
}
public function getVisibility(): ?bool {
return $this->entityVisibility;
}
public function setVisibility(?bool $value): static {
$this->entityVisibility = $value;
return $this;
}
public function getColor(): ?string {
return $this->entityColor;
}
public function setColor(?string $value): static {
$this->entityColor = $value;
return $this;
return $this->properties;
}
public function getDataObject(): EventObject|null {
return $this->entityData ? (new EventObject)->jsonDeserialize($this->entityData) : null;
return $this->entityDataObject;
}
public function setDataObject(object $value): static
public function setDataObject(EventObject $value): static
{
if ($value instanceof EventObject) {
$this->entityData = $value->jsonSerialize();
}
$this->entityDataObject = $value;
$this->setDataJson($value->jsonSerialize());
return $this;
}
public function getDataJson(): array|string|null {
return $this->entityData;
return $this->getProperties()->getDataRaw();
}
public function setDataJson(array|string $value): static
public function setDataJson(array|string|null $value): static
{
$this->entityData = $value;
$this->entityDataObject = null;
$this->getProperties()->setDataRaw($value);
$this->data[self::JSON_PROPERTY_SIGNATURE] = md5(json_encode($value));
return $this;
}