Files
packetserver/packetserver/http/routers/objects_html.py
2025-12-28 15:36:58 -05:00

89 lines
3.1 KiB
Python

from fastapi import APIRouter, Depends, Request, Form, File, UploadFile
from fastapi.responses import HTMLResponse, RedirectResponse
from uuid import UUID
import base64
from packetserver.http.dependencies import get_current_http_user
from packetserver.http.auth import HttpUser
from packetserver.http.server import templates
from packetserver.http.routers.objects import router as api_router # to call internal endpoints
from packetserver.http.database import DbDependency
from packetserver.http.routers.objects import get_object_metadata as api_get_metadata
from packetserver.http.routers.objects import ObjectUpdate
router = APIRouter(tags=["objects_html"])
# Internal reference to the list function (assuming it's list_my_objects)
from packetserver.http.routers.objects import list_my_objects as api_list_objects
@router.get("/objects", response_class=HTMLResponse)
async def objects_page(
db: DbDependency,
request: Request,
current_user: HttpUser = Depends(get_current_http_user)
):
# Call the API list endpoint internally
objects_resp = await api_list_objects(db, current_user=current_user) # db injected via dependency
objects = objects_resp # it's already the list
return templates.TemplateResponse(
"objects.html",
{
"request": request,
"current_user": current_user.username,
"objects": objects
}
)
@router.get("/objects/{uuid}", response_class=HTMLResponse)
async def object_detail_page(
request: Request,
uuid: UUID,
db: DbDependency,
current_user: HttpUser = Depends(get_current_http_user)
):
# Call the existing metadata API function
obj = await api_get_metadata(uuid=uuid, db=db, current_user=current_user)
return templates.TemplateResponse(
"object_detail.html",
{
"request": request,
"current_user": current_user.username,
"obj": obj
}
)
@router.post("/objects/{uuid}")
async def update_object(
db: DbDependency,
uuid: UUID,
request: Request,
name: str = Form(None),
private: str = Form("off"), # checkbox sends "on" if checked
new_text: str = Form(None),
new_file: UploadFile = File(None),
new_base64: str = Form(None),
current_user: HttpUser = Depends(get_current_http_user)
):
payload = {}
if name is not None:
payload["name"] = name
payload["private"] = (private == "on")
if new_text is not None and new_text.strip():
new_text = new_text.replace("\r","")
payload["data_text"] = new_text.strip()
elif new_file and new_file.filename:
content = await new_file.read()
payload["data_base64"] = base64.b64encode(content).decode('ascii')
elif new_base64 and new_base64.strip():
payload["data_base64"] = new_base64.strip()
# Call the PATCH API internally (simple requests or direct function call)
from packetserver.http.routers.objects import update_object as api_update
await api_update(uuid=uuid, payload=ObjectUpdate(**payload), db=db, current_user=current_user)
# Redirect back to the detail page (or /objects list)
return RedirectResponse(url=f"/objects/{uuid}", status_code=303)