Coverage for app/services/setup_service.py: 100%
22 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-16 20:06 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-16 20:06 +0000
1from app.core.observability import Observability
2from app.domain.probe.entities.grid import Grid
3from app.domain.probe.exceptions import InvalidSizeError
4from app.models.Probe import Probe as ModelProbe
5from app.schemas.setup import SetupRequest, SetupResponse
6from app.repositories.probe_repository import ProbeRepository
7from fastapi import HTTPException
8from app.core.events import ProbeEvents
11class SetupService:
12 def __init__(
13 self,
14 repository: ProbeRepository,
15 ) -> None:
16 self.repository = repository
18 async def process(
19 self,
20 setup: SetupRequest,
21 ) -> SetupResponse:
22 try:
23 grid = Grid(x_size=setup.x, y_size=setup.y)
25 probe = await self.repository.setup(
26 ModelProbe(x=grid.x_size, y=grid.y_size, direction=setup.direction)
27 )
29 Observability.emit(
30 ProbeEvents.PROBE_CREATED,
31 grid_id=str(probe.grid.id),
32 grid_x=grid.x_size,
33 grid_y=grid.y_size,
34 probe_id=str(probe.id),
35 probe_x=probe.x,
36 probe_y=probe.y,
37 probe_direction=probe.direction,
38 )
40 return SetupResponse(
41 id=probe.id, x=probe.x, y=probe.y, direction=probe.direction
42 )
43 except InvalidSizeError as e:
44 Observability.emit(
45 ProbeEvents.PROBE_INVALID_SETUP,
46 grid_x=setup.x,
47 grid_y=setup.y,
48 probe_direction=setup.direction,
49 )
50 raise HTTPException(
51 status_code=422,
52 detail={
53 "code": "INVALID_PROBE_SETUP",
54 "message": f"The grid size ({setup.x}, {setup.y}) is invalid. {e}",
55 },
56 ) from e
57 except Exception as e:
58 raise HTTPException(
59 status_code=500,
60 detail={
61 "code": "SETUP_UNEXPECTED_ERROR",
62 "message": "Unexpected error. Try again in a few seconds.",
63 },
64 ) from e