$dto->user->getId(), 'token' => $dto->token, 'available_to' => $dto->availableTo, ]); return $this->toDomain($model); } public function findByToken(string $token): ?EmailConfirmationToken { $model = EmailConfirmationTokenModel::query() ->where('token', $token) ->first(); return $model === null ? null : $this->toDomain($model); } public function findByUser(User $user): ?EmailConfirmationToken { $model = EmailConfirmationTokenModel::query() ->where('user_id', $user->getId()) ->first(); return $model === null ? null : $this->toDomain($model); } public function delete(int $id): void { EmailConfirmationTokenModel::where('id', $id)->delete(); } private function toDomain( EmailConfirmationTokenModel $model, ): EmailConfirmationToken { $user = $this->userRepository->find($model->user_id); if ($user === null) { throw new DomainException( "User with id {$model->user_id} not found", ); } return new EmailConfirmationToken( id: $model->id, user: $user, availableTo: $model->available_to, token: $model->token, ); } }