79 lines
2.5 KiB
PHP
79 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Infra\Adapters\Directories;
|
|
|
|
use Application\Security\Models\Entities\SecurityAuditLogEntry;
|
|
use Application\Security\Models\ValueObjects\Entities\SecurityAuditLogDetails;
|
|
use Application\Security\Models\ValueObjects\Entities\SecurityAuditLogEntryId;
|
|
use Application\Security\Ports\Directories\ClientAuditLogDirectory;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Infra\Database\Models\ClientAuditLog;
|
|
use Override;
|
|
|
|
final class EloquentClientAuditLogDirectory implements ClientAuditLogDirectory
|
|
{
|
|
#[Override]
|
|
public function find(SecurityAuditLogEntryId $id): ?SecurityAuditLogEntry
|
|
{
|
|
$record = ClientAuditLog::query()
|
|
->where('id', $id->identifier->toString())
|
|
->first();
|
|
|
|
if ($record === null) {
|
|
return null;
|
|
}
|
|
|
|
return $this->toDomainEntity($record);
|
|
}
|
|
|
|
#[Override]
|
|
public function findLogs(
|
|
\DateTimeImmutable $since,
|
|
?\DateTimeImmutable $to = null,
|
|
?string $clientIdentifier = null,
|
|
?string $eventType = null,
|
|
): array {
|
|
/** @var Builder<ClientAuditLog> $query */
|
|
$query = ClientAuditLog::query()
|
|
->where('created_at', '>=', $since->format('Y-m-d H:i:s'));
|
|
|
|
if ($to !== null) {
|
|
$query->where('created_at', '<=', $to->format('Y-m-d H:i:s'));
|
|
}
|
|
|
|
if ($clientIdentifier !== null && trim($clientIdentifier) !== '') {
|
|
$trimmed = trim($clientIdentifier);
|
|
$query->where(function (Builder $subQuery) use ($trimmed): void {
|
|
$subQuery->where('client_identifier', $trimmed)
|
|
->orWhere('client_id', $trimmed);
|
|
});
|
|
}
|
|
|
|
if ($eventType !== null && trim($eventType) !== '') {
|
|
$query->where('event_type', trim($eventType));
|
|
}
|
|
|
|
$records = $query
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
/** @var list<SecurityAuditLogEntry> */
|
|
return array_map(
|
|
[$this, 'toDomainEntity'],
|
|
$records->all()
|
|
);
|
|
}
|
|
|
|
private function toDomainEntity(ClientAuditLog $record): SecurityAuditLogEntry
|
|
{
|
|
return new SecurityAuditLogEntry(
|
|
id: new SecurityAuditLogEntryId($record->id),
|
|
clientId: $record->client_id,
|
|
clientIdentifier: $record->client_identifier->value,
|
|
eventType: $record->event_type,
|
|
details: $record->details ?? SecurityAuditLogDetails::empty(),
|
|
);
|
|
}
|
|
}
|