FluxIP/app/fleet/router.py

130 lines
3.7 KiB
Python

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)}