karl/app/api/v1.py
2025-10-16 23:07:06 +02:00

102 lines
2.7 KiB
Python

from fastapi import APIRouter, Depends, Body, Query
from fastapi.responses import JSONResponse
from fastapi_utils.cbv import cbv
from app.api.models import *
from app.web import PasswordsController
router = APIRouter()
@router.get("/", summary="Main API")
async def root():
return {"message": "Witaj w API v1"}
@router.get("/health", summary="Health check")
async def health():
return {"status": "ok"}
@router.post("/ci", summary="CI Webhook")
async def ci(request: Request):
return Response(200)
@cbv(router)
class TreeController:
svc: PasswordsController = Depends(PasswordsController.dep)
@router.get("/tree", response_model=NodeDTO)
def get_tree(self) -> NodeDTO:
return self.svc.get_tree()
@router.post("/group", response_model=GroupDTO)
def create_group(
self,
name: str = Body(..., embed=True),
parent_path: str | None = Body(None, embed=True),
) -> GroupDTO:
return self.svc.create_group(name=name, parent_path=parent_path)
@router.patch("/group/rename", response_model=GroupDTO)
def rename_group(
self,
path: str = Body(..., embed=True),
new_name: str = Body(..., embed=True),
) -> GroupDTO:
return self.svc.rename_group(path, new_name)
@router.delete("/group")
def delete_group(
self,
path: str = Query(...),
):
self.svc.delete_group(path)
return JSONResponse({"ok": True})
@router.post("/entry", response_model=NodeDTO)
def create_entry(
self,
kind: EntryKind = Body(..., embed=True),
parent_path: str = Body(..., embed=True),
data: dict = Body(..., embed=True),
) -> NodeDTO:
if kind == EntryKind.simple:
dto = EntrySimpleDTO(**data)
return self.svc.create_entry_simple(parent_path, dto)
dto = EntryComplexDTO(**data)
return self.svc.create_entry_complex(parent_path, dto)
@router.patch("/entry", response_model=NodeDTO)
def update_entry(
self,
path: str = Body(..., embed=True),
kind: EntryKind = Body(..., embed=True),
data: dict = Body(..., embed=True),
) -> NodeDTO:
if kind == EntryKind.simple:
dto = EntrySimpleDTO(**data)
return self.svc.update_entry_simple(path, dto)
dto = EntryComplexDTO(**data)
return self.svc.update_entry_complex(path, dto)
@router.patch("/entry/move", response_model=NodeDTO)
def move_entry(
self,
path: str = Body(..., embed=True),
target_group_path: str = Body(..., embed=True),
) -> NodeDTO:
return self.svc.move_entry(path, target_group_path)
@router.delete("/entry")
def delete_entry(
self,
path: str = Query(...),
):
self.svc.delete_entry(path)
return JSONResponse({"ok": True})
@router.post("/save")
def save_changes(self):
self.svc.save()
return JSONResponse({"ok": True})