Files
services_manager_server/src/app/views.py

82 lines
2.1 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from app.depends import check_token
from app.models import CachePrivileges, Service, Statuses
from app.serializers import ServiceCreate, ServiceDetail
# TODO: add redis cache
router = APIRouter(dependencies=[Depends(check_token)])
@router.get("/", response_model=list[ServiceDetail])
async def get_services():
return await Service.objects.all()
@router.get("/healthcheck")
async def healthcheck():
return "Ok!"
@router.get("/{id}/", response_model=ServiceDetail)
async def get_service(id: int):
service = await Service.objects.get_or_none(id=id)
if service is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
return service
@router.delete("/{id}/", response_model=ServiceDetail)
async def delete_service(id: int):
service = await Service.objects.get_or_none(id=id)
if service is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
await service.delete()
return service
@router.post("/", response_model=ServiceDetail)
async def register_service(data: ServiceCreate):
user_services_count = await Service.objects.filter(user=data.user).count()
if user_services_count >= 3:
raise HTTPException(status.HTTP_402_PAYMENT_REQUIRED)
return await Service.objects.create(**data.dict())
@router.patch("/{id}/update_status", response_model=ServiceDetail)
async def update_service_state(id: int, new_status: Statuses):
service = await Service.objects.get_or_none(id=id)
if service is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
service.status = new_status
await service.update(["status"])
return service
@router.patch("/{id}/update_cache", response_model=ServiceDetail)
async def update_service_cache(id: int, new_cache: CachePrivileges):
service = await Service.objects.get_or_none(id=id)
if service is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
service.cache = new_cache
await service.update(["cache"])
return service