initial structure implemented

docs -> _docs
This commit is contained in:
Oleksandr Bezdieniezhnykh
2025-12-01 14:20:56 +02:00
parent 9134c5db06
commit abc26d5c20
360 changed files with 3881 additions and 101 deletions
+5
View File
@@ -0,0 +1,5 @@
from .routes import router
from .dependencies import get_flight_api, get_sse_streamer
__all__ = ["router", "get_flight_api", "get_sse_streamer"]
+20
View File
@@ -0,0 +1,20 @@
from components.flight_api import FlightAPI, FlightAPIBase
from components.sse_event_streamer import SSEEventStreamer, SSEEventStreamerBase
_flight_api: FlightAPIBase | None = None
_sse_streamer: SSEEventStreamerBase | None = None
def get_flight_api() -> FlightAPIBase:
global _flight_api
if _flight_api is None:
_flight_api = FlightAPI()
return _flight_api
def get_sse_streamer() -> SSEEventStreamerBase:
global _sse_streamer
if _sse_streamer is None:
_sse_streamer = SSEEventStreamer()
return _sse_streamer
+13
View File
@@ -0,0 +1,13 @@
from fastapi import APIRouter
from .flights import router as flights_router
from .images import router as images_router
from .stream import router as stream_router
router = APIRouter()
router.include_router(flights_router, prefix="/flights", tags=["flights"])
router.include_router(images_router, prefix="/flights", tags=["images"])
router.include_router(stream_router, prefix="/stream", tags=["stream"])
__all__ = ["router"]
+80
View File
@@ -0,0 +1,80 @@
from fastapi import APIRouter, Depends
from models.api import (
FlightCreateRequest,
FlightResponse,
FlightDetailResponse,
FlightStatusResponse,
DeleteResponse,
UpdateResponse,
UserFixRequest,
UserFixResponse,
ObjectGPSResponse,
)
from models.core import GPSPoint
from api.dependencies import get_flight_api
from components.flight_api import FlightAPIBase
router = APIRouter()
@router.post("", response_model=FlightResponse)
async def create_flight(
request: FlightCreateRequest,
api: FlightAPIBase = Depends(get_flight_api),
) -> FlightResponse:
return await api.create_flight(request)
@router.get("/{flight_id}", response_model=FlightDetailResponse)
async def get_flight(
flight_id: str,
api: FlightAPIBase = Depends(get_flight_api),
) -> FlightDetailResponse:
return await api.get_flight(flight_id)
@router.get("/{flight_id}/status", response_model=FlightStatusResponse)
async def get_flight_status(
flight_id: str,
api: FlightAPIBase = Depends(get_flight_api),
) -> FlightStatusResponse:
return await api.get_flight_status(flight_id)
@router.delete("/{flight_id}", response_model=DeleteResponse)
async def delete_flight(
flight_id: str,
api: FlightAPIBase = Depends(get_flight_api),
) -> DeleteResponse:
return await api.delete_flight(flight_id)
@router.put("/{flight_id}/waypoints", response_model=UpdateResponse)
async def update_waypoints(
flight_id: str,
waypoints: list[GPSPoint],
api: FlightAPIBase = Depends(get_flight_api),
) -> UpdateResponse:
return await api.update_waypoints(flight_id, waypoints)
@router.post("/{flight_id}/user-fix", response_model=UserFixResponse)
async def submit_user_fix(
flight_id: str,
request: UserFixRequest,
api: FlightAPIBase = Depends(get_flight_api),
) -> UserFixResponse:
return await api.submit_user_fix(flight_id, request)
@router.get("/{flight_id}/frames/{frame_id}/object-gps", response_model=ObjectGPSResponse)
async def get_object_gps(
flight_id: str,
frame_id: int,
pixel_x: float,
pixel_y: float,
api: FlightAPIBase = Depends(get_flight_api),
) -> ObjectGPSResponse:
return await api.get_object_gps(flight_id, frame_id, (pixel_x, pixel_y))
+27
View File
@@ -0,0 +1,27 @@
from typing import Annotated
from fastapi import APIRouter, Depends, UploadFile, File, Form
from models.api import BatchResponse
from api.dependencies import get_flight_api
from components.flight_api import FlightAPIBase
router = APIRouter()
@router.post("/{flight_id}/batches", response_model=BatchResponse)
async def upload_batch(
flight_id: str,
files: Annotated[list[UploadFile], File()],
start_sequence: Annotated[int, Form()],
end_sequence: Annotated[int, Form()],
batch_number: Annotated[int, Form()],
api: FlightAPIBase = Depends(get_flight_api),
) -> BatchResponse:
return await api.upload_batch(
flight_id,
files,
start_sequence,
end_sequence,
batch_number,
)
+16
View File
@@ -0,0 +1,16 @@
from fastapi import APIRouter, Depends
from sse_starlette.sse import EventSourceResponse
from api.dependencies import get_flight_api
from components.flight_api import FlightAPIBase
router = APIRouter()
@router.get("/{flight_id}")
async def stream_events(
flight_id: str,
api: FlightAPIBase = Depends(get_flight_api),
) -> EventSourceResponse:
return EventSourceResponse(api.stream_events(flight_id))