from fastapi import APIRouter, Depends, Body, Query from fastapi.responses import JSONResponse from fastapi_utils.cbv import cbv from injectable import inject 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) class AutowireSupport: @staticmethod def password_controller(): return inject(PasswordsController) @cbv(router) class TreeController: svc: PasswordsController = Depends(AutowireSupport.password_controller) @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})