From 48fce5d6617b8e45eb821d6c373359b50f4963dd Mon Sep 17 00:00:00 2001 From: Christian Krakau-Louis Date: Wed, 26 Mar 2025 02:51:49 +0100 Subject: [PATCH] added the /files view and auth for api and files --- app/api.py | 60 +++++++++++++++++++++---- app/frontend.py | 25 ++++++++++- frontend/templates/files.html | 84 +++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 10 deletions(-) create mode 100644 frontend/templates/files.html diff --git a/app/api.py b/app/api.py index f768e26a..c336a6c3 100644 --- a/app/api.py +++ b/app/api.py @@ -1,17 +1,26 @@ -from fastapi import APIRouter, Request, HTTPException, status +# app/api.py +from fastapi import APIRouter, Request, HTTPException, status, Depends from hashlib import md5 +from sqlalchemy.orm import Session +from typing import List + +from app.auth import require_login +from app.database import SessionLocal +from app.models import FileRecord router = APIRouter() +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + @router.get("/whoami") async def whoami(request: Request): """ Returns user info if logged in, else 401. - Example response: - { - "email": "someone@example.com", - "picture": "https://www.gravatar.com/avatar/..." - } """ user = request.session.get("user") if not user: @@ -22,11 +31,46 @@ async def whoami(request: Request): raise HTTPException(status_code=400, detail="User has no email in session") # Generate Gravatar URL from email - # For more options, see: https://en.gravatar.com/site/implement/images/ email_hash = md5(email.strip().lower().encode()).hexdigest() gravatar_url = f"https://www.gravatar.com/avatar/{email_hash}?d=identicon" return { "email": email, "picture": gravatar_url - } \ No newline at end of file + } + +@router.get("/files") +@require_login +def list_files_api(request: Request, db: Session = Depends(get_db)): + """ + Returns a JSON list of all FileRecord entries. + Protected by `@require_login`, so only logged-in sessions can access. + + Example response: + [ + { + "id": 123, + "filehash": "abc123...", + "original_filename": "example.pdf", + "local_filename": "/workdir/tmp/.pdf", + "file_size": 1048576, + "mime_type": "application/pdf", + "created_at": "2025-05-01T12:34:56.789000" + }, + ... + ] + """ + files = db.query(FileRecord).order_by(FileRecord.created_at.desc()).all() + # Return a simple list of dicts + result = [] + for f in files: + result.append({ + "id": f.id, + "filehash": f.filehash, + "original_filename": f.original_filename, + "local_filename": f.local_filename, + "file_size": f.file_size, + "mime_type": f.mime_type, + "created_at": f.created_at.isoformat() if f.created_at else None + }) + return result diff --git a/app/frontend.py b/app/frontend.py index 19e9be93..f938ea0d 100644 --- a/app/frontend.py +++ b/app/frontend.py @@ -1,16 +1,37 @@ # app/frontend.py import os from pathlib import Path -from fastapi import APIRouter, Request +from fastapi import APIRouter, Request, Depends from fastapi.templating import Jinja2Templates +from sqlalchemy.orm import Session + from app.auth import require_login +from app.database import SessionLocal router = APIRouter() -# Point templates_dir to "frontend/templates" templates_dir = Path(__file__).parent.parent / "frontend" / "templates" templates = Jinja2Templates(directory=str(templates_dir)) +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +@router.get("/files") +@require_login +def files_page(request: Request): + """ + Return the 'files.html' template. + The actual file data is fetched via XHR from /api/files in the template. + """ + return templates.TemplateResponse("files.html", {"request": request}) + +# ... existing routes for /, /upload, /about, etc. ... + + @router.get("/", include_in_schema=False) async def serve_index(request: Request): return templates.TemplateResponse("index.html", {"request": request}) diff --git a/frontend/templates/files.html b/frontend/templates/files.html new file mode 100644 index 00000000..c51acbc8 --- /dev/null +++ b/frontend/templates/files.html @@ -0,0 +1,84 @@ +{% extends "base.html" %} +{% block title %}Files{% endblock %} + +{% block content %} +
+

File Records

+ + +
+ + + + + + + + + + + + + + + +
+ + +
+{% endblock %} + +{% block scripts %} + +{% endblock %}