64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from typing import Protocol
|
||
|
|
|
||
|
|
from v1.auth.schemas import (
|
||
|
|
OtpSendRequest,
|
||
|
|
PhoneSessionCreateRequest,
|
||
|
|
SessionRefreshRequest,
|
||
|
|
SessionResponse,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class AuthServiceGateway(Protocol):
|
||
|
|
async def send_otp(self, request: OtpSendRequest) -> None:
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
async def create_phone_session(
|
||
|
|
self, request: PhoneSessionCreateRequest
|
||
|
|
) -> SessionResponse:
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
async def refresh_session(self, request: SessionRefreshRequest) -> SessionResponse:
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
async def delete_session(self, refresh_token: str | None) -> None:
|
||
|
|
raise NotImplementedError
|
||
|
|
|
||
|
|
|
||
|
|
class AuthService:
|
||
|
|
_gateway: AuthServiceGateway
|
||
|
|
_registration_bootstrapper: RegistrationBootstrapper | None
|
||
|
|
|
||
|
|
def __init__(
|
||
|
|
self,
|
||
|
|
gateway: AuthServiceGateway,
|
||
|
|
registration_bootstrapper: "RegistrationBootstrapper | None" = None,
|
||
|
|
) -> None:
|
||
|
|
self._gateway = gateway
|
||
|
|
self._registration_bootstrapper = registration_bootstrapper
|
||
|
|
|
||
|
|
async def send_otp(self, request: OtpSendRequest) -> None:
|
||
|
|
await self._gateway.send_otp(request)
|
||
|
|
|
||
|
|
async def create_phone_session(
|
||
|
|
self, request: PhoneSessionCreateRequest
|
||
|
|
) -> SessionResponse:
|
||
|
|
response = await self._gateway.create_phone_session(request)
|
||
|
|
if self._registration_bootstrapper is not None:
|
||
|
|
await self._registration_bootstrapper.ensure_user_automation_jobs(
|
||
|
|
user_id=response.user.id
|
||
|
|
)
|
||
|
|
return response
|
||
|
|
|
||
|
|
async def refresh_session(self, request: SessionRefreshRequest) -> SessionResponse:
|
||
|
|
return await self._gateway.refresh_session(request)
|
||
|
|
|
||
|
|
async def delete_session(self, refresh_token: str | None) -> None:
|
||
|
|
await self._gateway.delete_session(refresh_token)
|
||
|
|
|
||
|
|
|
||
|
|
class RegistrationBootstrapper(Protocol):
|
||
|
|
async def ensure_user_automation_jobs(self, *, user_id: str) -> None:
|
||
|
|
raise NotImplementedError
|