2022-10-17 19:08:29 -03:00

140 lines
6.1 KiB
Python

from fastapi_paseto_auth import AuthPASETO
from fastapi import APIRouter, Request, Response, Depends, status, HTTPException
from app.dependencies import load_config
from fastapi_cache.decorator import cache
from app.controllers.Clients import Clients
from app.controllers.Mirrors import Mirrors
import app.models.MirrorModels as MirrorModels
import app.models.GeneralErrors as GeneralErrors
router = APIRouter(
prefix="/mirrors",
tags=['CDN Mirrors']
)
clients = Clients()
mirrors = Mirrors()
config: dict = load_config()
@router.get('/{org}/{repo}/{version}', status_code=status.HTTP_200_OK, response_model=MirrorModels.MirrorModel)
async def get_mirrors(request: Request, response: Response, org: str, repo: str, version: str) -> MirrorModels.MirrorModel:
"""Get CDN mirror information for a given release.
Returns:
json: mirror information
"""
if not await mirrors.exists(org, repo, version):
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail={
"error": GeneralErrors.MirrorNotFoundError().error,
"message": GeneralErrors.MirrorNotFoundError().message
}
)
else:
return await mirrors.get(org, repo, version)
@router.post('/{org}/{repo}/{version}', status_code=status.HTTP_201_CREATED, response_model=MirrorModels.MirrorCreatedResponseModel)
async def create_mirror(request: Request, response: Response, org: str, repo: str, version: str,
mirror: MirrorModels.MirrorStoreModel, Authorize: AuthPASETO = Depends()) -> dict:
"""Stores information about a new CDN mirror for a given release.
Returns:
bool: True if successful, False otherwise
"""
Authorize.paseto_required()
if await clients.auth_checks(Authorize.get_subject(), Authorize.get_jti()):
if await mirrors.exists(org, repo, version):
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail={
"error": GeneralErrors.MirrorAlreadyExistsError().error,
"message": GeneralErrors.MirrorAlreadyExistsError().message
}
)
else:
key = await mirrors.assemble_key(org, repo, version)
created: bool = await mirrors.store(org, repo, version, mirror)
if created:
return {"created": created, "key": key}
else:
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail={
"error": GeneralErrors.InternalServerError().error,
"message": GeneralErrors.InternalServerError().message
}
)
else:
raise HTTPException(status_code=401, detail={
"error": GeneralErrors.Unauthorized().error,
"message": GeneralErrors.Unauthorized().message
}
)
@router.put('/{org}/{repo}/{version}', status_code=status.HTTP_200_OK, response_model=MirrorModels.MirrorUpdatedResponseModel)
async def update_mirror(request: Request, response: Response, org: str, repo: str, version: str,
mirror: MirrorModels.MirrorStoreModel,Authorize: AuthPASETO = Depends()) -> dict:
"""Updates a stored information about CDN mirrors for a given release
Returns:
bool: True if successful, False otherwise
"""
Authorize.paseto_required()
if await clients.auth_checks(Authorize.get_subject(), Authorize.get_jti()):
if not await mirrors.exists(org, repo, version):
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail={
"error": GeneralErrors.MirrorNotFoundError().error,
"message": GeneralErrors.MirrorNotFoundError().message
}
)
else:
key = await mirrors.assemble_key(org, repo, version)
updated: bool = await mirrors.store(org, repo, version, mirror)
if updated:
return {"updated": updated, "key": key}
else:
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail={
"error": GeneralErrors.InternalServerError().error,
"message": GeneralErrors.InternalServerError().message
}
)
else:
raise HTTPException(status_code=401, detail={
"error": GeneralErrors.Unauthorized().error,
"message": GeneralErrors.Unauthorized().message
}
)
@router.delete('/{org}/{repo}/{version}', status_code=status.HTTP_200_OK, response_model=MirrorModels.MirrorDeletedResponseModel)
async def delete_mirror(request: Request, response: Response, org: str, repo: str, version: str, Authorize: AuthPASETO = Depends()) -> dict:
"""Deletes a stored information about CDN mirrors for a given release
Returns:
json: _description_
"""
Authorize.paseto_required()
if await clients.auth_checks(Authorize.get_subject(), Authorize.get_jti()):
if not await mirrors.exists(org, repo, version):
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail={
"error": GeneralErrors.MirrorNotFoundError().error,
"message": GeneralErrors.MirrorNotFoundError().message
}
)
else:
key = await mirrors.assemble_key(org, repo, version)
deleted: bool = await mirrors.delete(org, repo, version)
if deleted:
return {"deleted": deleted, "key": key}
else:
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail={
"error": GeneralErrors.InternalServerError().error,
"message": GeneralErrors.InternalServerError().message
}
)
else:
raise HTTPException(status_code=401, detail={
"error": GeneralErrors.Unauthorized().error,
"message": GeneralErrors.Unauthorized().message
}
)