from __future__ import annotations from fastapi import APIRouter, Depends, Response, status from app.auth.repository import SessionRecord from app.dependencies import get_fleet_service, require_session from app.fleet.schemas import ( InstanceCreate, InstanceGroupCreate, InstanceGroupUpdate, InstanceUpdate, ) from app.fleet.service import FleetService router = APIRouter(prefix="/api/v1", tags=["fleet"]) @router.get("/instances") def list_instances( _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.list_instances()} @router.post("/instances", status_code=status.HTTP_201_CREATED) def create_instance( payload: InstanceCreate, response: Response, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: instance = service.create_instance(payload) response.headers["Location"] = f"/api/v1/instances/{instance['id']}" return {"data": instance} @router.get("/instances/{instance_id}") def get_instance( instance_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.get_instance(instance_id)} @router.put("/instances/{instance_id}") def update_instance( instance_id: str, payload: InstanceUpdate, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.update_instance(instance_id, payload)} @router.delete("/instances/{instance_id}") def archive_instance( instance_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.archive_instance(instance_id)} @router.post("/instances/{instance_id}/tests") async def test_instance( instance_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": await service.test_instance(instance_id)} @router.post("/instances/{instance_id}/dns-syncs") async def sync_instance_dns( instance_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": await service.sync_dns(instance_id)} @router.get("/instance-groups") def list_groups( _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.list_groups()} @router.post("/instance-groups", status_code=status.HTTP_201_CREATED) def create_group( payload: InstanceGroupCreate, response: Response, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: group = service.create_group(payload) response.headers["Location"] = f"/api/v1/instance-groups/{group['id']}" return {"data": group} @router.get("/instance-groups/{group_id}") def get_group( group_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.get_group(group_id)} @router.put("/instance-groups/{group_id}") def update_group( group_id: str, payload: InstanceGroupUpdate, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.update_group(group_id, payload)} @router.delete("/instance-groups/{group_id}") def archive_group( group_id: str, _: SessionRecord = Depends(require_session), service: FleetService = Depends(get_fleet_service), ) -> dict: return {"data": service.archive_group(group_id)}