ref #6: [feat] add impl in memory session repository

This commit is contained in:
Azamat 2026-04-02 13:12:34 +03:00
parent 87c789b7fe
commit 33ebcb1a82
4 changed files with 120 additions and 8 deletions

View file

@ -1,24 +1,34 @@
from collections.abc import Mapping
from dataclasses import dataclass, field
from datetime import UTC, datetime, timedelta
from pathlib import Path
import docker
from docker import DockerClient
from adapter.config.loader import load_config
from adapter.config.model import AppConfig
from adapter.docker.runtime import DockerSandboxRuntime
from adapter.observability.factory import build_observability
from adapter.observability.runtime import ObservabilityRuntime
from domain.user import User
from repository.sandbox_session import InMemorySandboxSessionRepository
from repository.user import InMemoryUserRepository
from usecase.interface import Clock
from usecase.sandbox import CreateSandbox
from usecase.user import GetUser
@dataclass(frozen=True, slots=True)
class AppRepositories:
user: InMemoryUserRepository
sandbox_session: InMemorySandboxSessionRepository
@dataclass(frozen=True, slots=True)
class AppUsecases:
get_user: GetUser
create_sandbox: CreateSandbox
@dataclass(slots=True)
@ -27,16 +37,29 @@ class AppContainer:
observability: ObservabilityRuntime
repositories: AppRepositories
usecases: AppUsecases
_docker_client: DockerClient = field(repr=False)
_is_shutdown: bool = field(default=False, init=False, repr=False)
def shutdown(self) -> None:
if self._is_shutdown:
return
try:
self.observability.shutdown()
finally:
self._is_shutdown = True
self._is_shutdown = True
errors: list[Exception] = []
for action in (self._docker_client.close, self.observability.shutdown):
try:
action()
except Exception as exc:
errors.append(exc)
if errors:
raise ExceptionGroup('shutdown failed', errors)
class SystemClock(Clock):
def now(self) -> datetime:
return datetime.now(tz=UTC)
def build_container(
@ -54,17 +77,32 @@ def build_container(
)
observability = build_observability(app_config)
docker_client: DockerClient = docker.from_env()
clock = SystemClock()
user_repository = InMemoryUserRepository(
observability.tracer, [User(id='123', email='aza@gglamer.ru', name='gglamer')]
)
repositories = AppRepositories(user=user_repository)
sandbox_repository = InMemorySandboxSessionRepository()
sandbox_runtime = DockerSandboxRuntime(app_config.sandbox, docker_client)
repositories = AppRepositories(
user=user_repository,
sandbox_session=sandbox_repository,
)
usecases = AppUsecases(
get_user=GetUser(
repository=user_repository,
logger=observability.logger,
tracer=observability.tracer,
)
),
create_sandbox=CreateSandbox(
repository=sandbox_repository,
runtime=sandbox_runtime,
clock=clock,
logger=observability.logger,
ttl=timedelta(seconds=app_config.sandbox.ttl_seconds),
),
)
return AppContainer(
@ -72,4 +110,5 @@ def build_container(
observability=observability,
repositories=repositories,
usecases=usecases,
_docker_client=docker_client,
)