Files
apilog/app/routes/app.py

69 lines
1.9 KiB
Python

from uuid import UUID
from creyPY.fastapi.crud import create_obj_from_data
from creyPY.fastapi.db.session import get_db
from creyPY.fastapi.pagination import Page, paginate
from fastapi import APIRouter, Depends, HTTPException, Security
from pydantic.json_schema import SkipJsonSchema
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models.app import Application
from app.schema.app import AppIN, AppOUT
from app.services.auth import verify
router = APIRouter(prefix="/app", tags=["apps"])
@router.post("/", status_code=201)
async def create_app(
data: AppIN,
sub: str = Security(verify),
db: Session = Depends(get_db),
) -> AppOUT:
obj = create_obj_from_data(
data,
Application,
db,
additional_data={"created_by_id": sub},
)
return AppOUT.model_validate(obj)
@router.delete("/{app_id}", status_code=204)
async def delete_app(
app_id: UUID,
sub: str = Security(verify),
db: Session = Depends(get_db),
) -> None:
obj = db.query(Application).filter_by(id=app_id, created_by_id=sub).one_or_none()
if obj is None:
raise HTTPException(status_code=404, detail="Item not found")
db.delete(obj)
db.commit()
return None
@router.get("/")
async def get_apps(
search: str | SkipJsonSchema[None] = None,
sub: str = Security(verify),
db: Session = Depends(get_db),
) -> Page[AppOUT]:
the_select = select(Application).filter(Application.created_by_id == sub)
if search:
the_select = the_select.filter(Application.name.ilike(f"%{search}%"))
return paginate(db, the_select)
@router.get("/{app_id}")
async def get_app(
app_id: UUID,
sub: str = Security(verify),
db: Session = Depends(get_db),
) -> AppOUT:
obj = db.query(Application).filter_by(id=app_id, created_by_id=sub).one_or_none()
if obj is None:
raise HTTPException(status_code=404, detail="Item not found")
return AppOUT.model_validate(obj)