*/ private array $entries = []; public function log(AuditEntry $entry): void { $this->entries[$entry->id->toString()] = $entry; } public function find(AuditId $id): ?AuditEntry { return $this->entries[$id->toString()] ?? null; } /** * @return array */ public function query(AuditQuery $query): array { $results = array_values($this->entries); // Apply filters if ($query->action !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->action === $query->action ); } if ($query->entityType !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->entityType === $query->entityType ); } if ($query->entityId !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->entityId === $query->entityId ); } if ($query->userId !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->userId === $query->userId ); } if ($query->success !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->success === $query->success ); } if ($query->startDate !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->timestamp >= $query->startDate ); } if ($query->endDate !== null) { $results = array_filter( $results, fn(AuditEntry $entry) => $entry->timestamp <= $query->endDate ); } // Sort by timestamp descending (newest first) usort($results, fn(AuditEntry $a, AuditEntry $b) => $b->timestamp <=> $a->timestamp ); // Apply pagination return array_slice($results, $query->offset, $query->limit); } public function count(AuditQuery $query): int { // Reuse query logic but count instead $queryWithoutPagination = $query->withLimit(PHP_INT_MAX)->withOffset(0); return count($this->query($queryWithoutPagination)); } public function purgeOlderThan(DateTimeImmutable $date): int { $count = 0; foreach ($this->entries as $id => $entry) { if ($entry->timestamp < $date) { unset($this->entries[$id]); $count++; } } return $count; } /** * Clear all entries (for testing) */ public function clear(): void { $this->entries = []; } }