diff --git a/packetserver/http/routers/objects.py b/packetserver/http/routers/objects.py new file mode 100644 index 0000000..c17c3bb --- /dev/null +++ b/packetserver/http/routers/objects.py @@ -0,0 +1,55 @@ +from fastapi import APIRouter, Depends, HTTPException +from typing import List +from datetime import datetime +from uuid import UUID +import mimetypes + +from packetserver.http.dependencies import get_current_http_user +from packetserver.http.auth import HttpUser +from packetserver.server.objects import Object +from pydantic import BaseModel + +router = APIRouter(prefix="/api/v1", tags=["objects"]) + +class ObjectSummary(BaseModel): + uuid: UUID + name: str + binary: bool + size: int + content_type: str + private: bool + created_at: datetime + modified_at: datetime + +@router.get("/objects", response_model=List[ObjectSummary]) +async def list_my_objects(current_user: HttpUser = Depends(get_current_http_user)): + from packetserver.runners.http_server import get_db_connection + + conn = get_db_connection() + root = conn.root() + + username = current_user.username # uppercase callsign + + core_objects = Object.get_objects_by_username(username, root) + + # Sort newest first by created_at + core_objects.sort(key=lambda o: o.created_at, reverse=True) + + user_objects = [] + for obj in core_objects: + content_type, _ = mimetypes.guess_type(obj.name) + if content_type is None: + content_type = "application/octet-stream" if obj.binary else "text/plain" + + user_objects.append(ObjectSummary( + uuid=obj.uuid, + name=obj.name, + binary=obj.binary, + size=obj.size, + content_type=content_type, + private=obj.private, + created_at=obj.created_at, + modified_at=obj.modified_at + )) + + return user_objects \ No newline at end of file diff --git a/packetserver/http/server.py b/packetserver/http/server.py index a011c5e..1fc8687 100644 --- a/packetserver/http/server.py +++ b/packetserver/http/server.py @@ -38,6 +38,7 @@ app.mount("/static", StaticFiles(directory=BASE_DIR / "static"), name="static") from .routers import dashboard, bulletins from .routers.message_detail import router as message_detail_router from .routers.messages import html_router +from .routers.objects import router as objects_router # Include routers app.include_router(public.router) @@ -49,5 +50,6 @@ app.include_router(bulletins.router) app.include_router(bulletins.html_router) app.include_router(message_detail_router) app.include_router(html_router) +app.include_router(objects_router) diff --git a/packetserver/runners/http_server.py b/packetserver/runners/http_server.py index 1c7badc..69591d3 100644 --- a/packetserver/runners/http_server.py +++ b/packetserver/runners/http_server.py @@ -50,6 +50,12 @@ def get_db_connection(): _connection = _db.open() return _connection +def get_db(): + """Helper used in http/server.py dependency (get_current_http_user)""" + if _db is None: + raise RuntimeError("Database not opened – run the runner properly") + return _db + # Monkey-patch the dependency helper so server.py can use it without changes from packetserver.http import server