cams.py 3.42 KiB
from typing import List

from fastapi import APIRouter, HTTPException, status, Depends

from database import db_connection as db
from database.repositories.cam_groups import GroupRepository
from database.repositories.cams import CamRepository
from database.schemas.cam_groups import GroupFull
from database.schemas.cams import CamOut, CamCreate, CamUpdate

db_cams_router = APIRouter()


@db_cams_router.get("/list", response_model=List[CamOut])
async def list_cams(
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    cams = await cam_repo.list_all()
    if cams is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND
        )
    return cams


@db_cams_router.get("/{cam_id}", response_model=CamOut)
async def get_cam(
        cam_id: int,
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    cam = await cam_repo.get(cam_id)
    if cam is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND
        )
    return cam


@db_cams_router.post("", response_model=CamOut)
async def create_cam(
    cam: CamCreate,
    cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    new_cam = await cam_repo.create(cam)
    if new_cam is None:
        raise HTTPException(
            status_code=status.HTTP_304_NOT_MODIFIED
        )
    return new_cam


@db_cams_router.patch("/{cam_id}", response_model=CamOut)
async def update_cam(
    cam_id: int,
    cam: CamUpdate,
    cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    updated_cam = await cam_repo.update(cam_id, cam)
    if updated_cam is None:
        raise HTTPException(
            status_code=status.HTTP_304_NOT_MODIFIED
        )

    return updated_cam


@db_cams_router.delete("/{cam_id}", response_model=CamOut)
async def delete_cam(
        cam_id: int,
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    cam = await cam_repo.delete(cam_id)
    if cam is None:
        raise HTTPException(
            status_code=status.HTTP_304_NOT_MODIFIED
        )
    return cam


@db_cams_router.get("/{cam_id}/groups", response_model=List[GroupFull], tags=["Cam groups"])
async def list_cam_groups(
        cam_id: int,
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository))
):
    cam = await cam_repo.get(cam_id)
    groups = await cam_repo.get_cam_groups(cam)
    if groups is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND
        )
    return groups


@db_cams_router.post("/{cam_id}/groups", response_model=GroupFull, tags=["Cam groups"])
async def add_cam_group(
        cam_id: int,
        group_id: int,
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository)),
        group_repo: GroupRepository = Depends(db.get_repository(GroupRepository))
):
    cam = await cam_repo.get(cam_id)
    group = await group_repo.get(group_id)
    await cam_repo.add_cam_group(cam, group)
    return group


@db_cams_router.delete("/{cam_id}/groups", response_model=GroupFull, tags=["Cam groups"])
async def delete_cam_group(
        cam_id: int,
        group_id: int,
        cam_repo: CamRepository = Depends(db.get_repository(CamRepository)),
        group_repo: GroupRepository = Depends(db.get_repository(GroupRepository))
):
    cam = await cam_repo.get(cam_id)
    group = await group_repo.get(group_id)
    await cam_repo.delete_cam_group(cam, group)
    return group