64 lines
1.8 KiB
PHP
64 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Auth;
|
|
|
|
use App\Database\SessionModel;
|
|
use App\Shared\ValueObject\EmailAddress;
|
|
use App\User\User;
|
|
|
|
class PostgresSessionRepository implements SessionRepository
|
|
{
|
|
public function create(CreateSessionDto $dto): Session
|
|
{
|
|
$record = SessionModel::create([
|
|
'token' => $dto->token,
|
|
'user_id' => $dto->user->getId(),
|
|
'created_at' => $dto->createdAt->format('Y-m-d H:i:s'),
|
|
'expires_at' => $dto->expiresAt->format('Y-m-d H:i:s'),
|
|
]);
|
|
|
|
return new Session(
|
|
token: $record->token,
|
|
user: $dto->user,
|
|
createdAt: $dto->createdAt,
|
|
expiresAt: $dto->expiresAt,
|
|
);
|
|
}
|
|
|
|
public function findByToken(string $token): ?Session
|
|
{
|
|
$record = SessionModel::where('token', $token)->first();
|
|
|
|
if ($record === null) {
|
|
return null;
|
|
}
|
|
|
|
$userRecord = $record->user;
|
|
|
|
if ($userRecord === null) {
|
|
return null;
|
|
}
|
|
|
|
$user = new User(
|
|
id: $userRecord->id,
|
|
email: new EmailAddress($userRecord->email),
|
|
passwordHash: $userRecord->password_hash,
|
|
);
|
|
|
|
return new Session(
|
|
token: $record->token,
|
|
user: $user,
|
|
createdAt: $record->created_at instanceof \DateTimeImmutable
|
|
? $record->created_at
|
|
: new \DateTimeImmutable($record->created_at->format('Y-m-d H:i:s')),
|
|
expiresAt: $record->expires_at instanceof \DateTimeImmutable
|
|
? $record->expires_at
|
|
: new \DateTimeImmutable($record->expires_at->format('Y-m-d H:i:s')),
|
|
);
|
|
}
|
|
|
|
public function deleteByToken(string $token): void
|
|
{
|
|
SessionModel::where('token', $token)->delete();
|
|
}
|
|
}
|