From db9e2ca51b623a734a3bee24fb97f45af4eac4b2 Mon Sep 17 00:00:00 2001 From: Elijah Date: Fri, 14 Aug 2026 21:05:22 -0700 Subject: [PATCH 1/2] Rescue Paperjet v1 implementation --- .env.example | 2 +- README.md | 56 + backend/app/api/v1/__init__.py | 12 +- backend/app/api/v1/annotations.py | 130 +- backend/app/api/v1/assets.py | 111 +- backend/app/api/v1/auth.py | 30 +- backend/app/api/v1/debug.py | 12 +- backend/app/api/v1/documents.py | 182 +- backend/app/api/v1/export.py | 94 + backend/app/api/v1/versions.py | 203 + .../app/assets/fonts/GreatVibes-Regular.ttf | Bin 0 -> 457588 bytes backend/app/assets/fonts/OFL.txt | 93 + backend/app/assets/fonts/allura.ttf | Bin 0 -> 246632 bytes backend/app/assets/fonts/caveat.ttf | Bin 0 -> 403648 bytes backend/app/assets/fonts/dancing-script.ttf | Bin 0 -> 133636 bytes backend/app/assets/fonts/sacramento.ttf | Bin 0 -> 79696 bytes backend/app/auth/dependencies.py | 21 +- backend/app/auth/hashing.py | 6 +- backend/app/auth/rate_limit.py | 3 +- backend/app/auth/session.py | 8 +- backend/app/config.py | 1 + backend/app/db.py | 10 +- backend/app/main.py | 12 +- backend/app/models/__init__.py | 6 +- backend/app/models/annotation_state.py | 8 +- backend/app/models/document.py | 9 +- backend/app/models/settings.py | 8 +- backend/app/models/version.py | 12 +- backend/app/schemas/annotations.py | 61 +- backend/app/schemas/auth.py | 1 + backend/app/schemas/document.py | 9 +- backend/app/schemas/export.py | 8 + backend/app/schemas/versions.py | 35 + backend/app/services/assets.py | 12 + backend/app/services/export/__init__.py | 1 + backend/app/services/export/renderer.py | 465 +++ backend/app/services/storage.py | 82 +- backend/app/services/thumbnails.py | 30 +- backend/app/services/trash_sweep.py | 44 +- backend/app/tests/test_api_workflows.py | 121 + backend/app/tests/test_export.py | 121 + backend/pyproject.toml | 21 + docker-compose.yml | 4 +- frontend/README.md | 83 +- frontend/src/features/auth/LoginForm.tsx | 2 +- frontend/src/features/auth/SetupForm.tsx | 2 +- frontend/src/features/auth/useAuth.ts | 27 +- .../editor/canvas/AnnotationLayer.tsx | 313 +- .../features/editor/pages/PageRenderer.tsx | 154 +- .../src/features/editor/pages/PageStack.tsx | 9 +- .../src/features/editor/pages/PdfDocument.tsx | 67 +- frontend/src/features/editor/store.test.ts | 56 + frontend/src/features/editor/store.ts | 159 +- .../features/editor/toolbar/EditorToolbar.tsx | 227 +- .../editor/toolbar/TextFormatToolbar.tsx | 34 +- .../src/features/editor/tools/DrawTool.ts | 73 +- .../features/editor/tools/HighlightTool.ts | 120 + .../src/features/editor/tools/ImageTool.ts | 36 +- .../src/features/editor/tools/ShapeTool.ts | 210 + .../features/editor/tools/SignatureModal.tsx | 6 +- .../features/editor/tools/SignatureTool.ts | 49 +- .../src/features/editor/tools/TextTool.ts | 92 +- frontend/src/features/editor/tools/index.ts | 4 + frontend/src/features/editor/useAutosave.ts | 160 +- .../features/editor/versions/VersionPanel.tsx | 236 ++ .../src/features/library/DocumentGrid.tsx | 20 +- .../src/features/library/LibraryHeader.tsx | 8 +- frontend/src/features/library/UploadArea.tsx | 144 +- .../src/features/library/upload-context.ts | 9 + frontend/src/features/library/useLibrary.ts | 47 +- frontend/src/index.css | 5 + frontend/src/lib/annotations/registry.ts | 14 +- frontend/src/lib/annotations/types.ts | 135 +- frontend/src/lib/api/client.ts | 37 +- frontend/src/lib/coords.test.ts | 12 + frontend/src/lib/coords.ts | 15 +- frontend/src/pages/EditorPage.tsx | 140 +- frontend/src/pages/HomePage.tsx | 20 +- frontend/src/types/api.d.ts | 848 ++-- frontend/src/types/api.ts | 842 ++-- openapi.json | 2 +- openapi_pretty.json | 3615 ++++++++--------- shared/annotation-schema.json | 4 +- 83 files changed, 6186 insertions(+), 3894 deletions(-) create mode 100644 README.md create mode 100644 backend/app/api/v1/export.py create mode 100644 backend/app/api/v1/versions.py create mode 100644 backend/app/assets/fonts/GreatVibes-Regular.ttf create mode 100644 backend/app/assets/fonts/OFL.txt create mode 100644 backend/app/assets/fonts/allura.ttf create mode 100644 backend/app/assets/fonts/caveat.ttf create mode 100644 backend/app/assets/fonts/dancing-script.ttf create mode 100644 backend/app/assets/fonts/sacramento.ttf create mode 100644 backend/app/schemas/export.py create mode 100644 backend/app/schemas/versions.py create mode 100644 backend/app/services/assets.py create mode 100644 backend/app/services/export/__init__.py create mode 100644 backend/app/services/export/renderer.py create mode 100644 backend/app/tests/test_api_workflows.py create mode 100644 backend/app/tests/test_export.py create mode 100644 frontend/src/features/editor/store.test.ts create mode 100644 frontend/src/features/editor/tools/HighlightTool.ts create mode 100644 frontend/src/features/editor/tools/ShapeTool.ts create mode 100644 frontend/src/features/editor/versions/VersionPanel.tsx create mode 100644 frontend/src/features/library/upload-context.ts diff --git a/.env.example b/.env.example index 0328e43..cb63f2f 100644 --- a/.env.example +++ b/.env.example @@ -11,7 +11,7 @@ # -------------------------------------------- # Secret key for signing session cookies. # Generate a strong random value: python -c "import secrets; print(secrets.token_urlsafe(32))" -SECRET_KEY=change-me-in-production +SECRET_KEY=replace-with-a-long-random-secret # -------------------------------------------- # Upload Limits diff --git a/README.md b/README.md new file mode 100644 index 0000000..e20ef30 --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# PaperJet + +PaperJet is a self-hosted, single-user PDF annotation editor. It keeps the uploaded PDF immutable, stores annotations separately, autosaves the working layer, and flattens supported annotations only when exporting. + +## Run with Docker + +1. Copy `.env.example` to `.env`. +2. Replace `SECRET_KEY` with a long random value. Compose refuses to start without it. +3. Start the stack: + +```sh +docker compose up --build -d +``` + +Open `http://localhost:4982` (or the value of `HTTP_PORT`). The first visit asks you to create the single master password. + +The `db`, `pdf_storage`, and `thumbnails` volumes contain application data. Back them up before maintenance or upgrades. Put the frontend behind HTTPS when exposing PaperJet beyond localhost and set `COOKIE_SECURE=true`. + +## Development + +Backend: + +```sh +cd backend +pip install -e ".[dev]" +uvicorn app.main:app --reload +``` + +Frontend, in a second terminal: + +```sh +cd frontend +npm ci +npm run dev +``` + +The Vite server proxies `/api` to `http://localhost:8000`. + +## Validation + +```sh +# frontend +cd frontend +npm test -- --run +npm run typecheck +npm run lint +npm run build + +# backend +cd ../backend +pytest -q +mypy app/ +ruff check . +``` + +The editor uses PDF.js for display and PyMuPDF for export. Stored annotation coordinates are PDF points with a top-left origin relative to the unrotated CropBox; this is the contract shared by the editor and export renderer. diff --git a/backend/app/api/v1/__init__.py b/backend/app/api/v1/__init__.py index 500dc87..ce8bd15 100644 --- a/backend/app/api/v1/__init__.py +++ b/backend/app/api/v1/__init__.py @@ -2,9 +2,14 @@ from fastapi import APIRouter +from app.api.v1.annotations import router as annotations_router +from app.api.v1.assets import router as assets_router from app.api.v1.auth import router as auth_router from app.api.v1.documents import router as documents_router +from app.api.v1.export import router as export_router from app.api.v1.health import router as health_router +from app.api.v1.versions import router as versions_router +from app.config import settings router = APIRouter(prefix="/api/v1") @@ -15,17 +20,18 @@ router.include_router(auth_router) router.include_router(documents_router) # Assets -from app.api.v1.assets import router as assets_router router.include_router(assets_router) # Annotations -from app.api.v1.annotations import router as annotations_router router.include_router(annotations_router) +# Versions and export +router.include_router(versions_router) +router.include_router(export_router) + # Health (unauthenticated) router.include_router(health_router) -from app.config import settings if settings.DEBUG: from app.api.v1.debug import router as debug_router router.include_router(debug_router) diff --git a/backend/app/api/v1/annotations.py b/backend/app/api/v1/annotations.py index 2db3dcd..24f1f31 100644 --- a/backend/app/api/v1/annotations.py +++ b/backend/app/api/v1/annotations.py @@ -1,91 +1,95 @@ -from typing import Any +"""Opaque working-state annotation endpoints.""" + +import json +from datetime import UTC, datetime + from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.orm import Session -from datetime import datetime, timezone -import json -from app.db import get_db -from app.models.document import Document -from app.models.annotation_state import AnnotationState from app.auth.dependencies import get_current_user, verify_csrf -from app.schemas.annotations import AnnotationStateResponse, AnnotationStateUpdateRequest, AnnotationStateUpdateResponse +from app.db import get_db +from app.models.annotation_state import AnnotationState +from app.models.document import Document +from app.schemas.annotations import ( + AnnotationPayload, + AnnotationStateResponse, + AnnotationStateUpdateRequest, + AnnotationStateUpdateResponse, +) + +router = APIRouter(prefix="/documents", tags=["annotations"]) -router = APIRouter(prefix="/documents", tags=["Annotations"]) def _now_iso() -> str: - return datetime.now(timezone.utc).isoformat() + return datetime.now(UTC).isoformat() -@router.get("/{document_id}/annotations", response_model=AnnotationStateResponse) -async def get_annotations( - document_id: str, - db: Session = Depends(get_db), - user_id: Any = Depends(get_current_user) -): - doc = db.scalar(select(Document).where(Document.id == document_id, Document.deleted_at.is_(None))) - if not doc: + +def _utc(value: datetime) -> datetime: + return value.replace(tzinfo=UTC) if value.tzinfo is None else value.astimezone(UTC) + + +def _document_or_404(document_id: str, db: Session) -> Document: + document = db.scalar( + select(Document).where(Document.id == document_id, Document.deleted_at.is_(None)) + ) + if not document: raise HTTPException(status_code=404, detail="Document not found") - - state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) - + return document + + +def _read_data(state: AnnotationState | None) -> list[AnnotationPayload]: if not state: - return AnnotationStateResponse(data=[], updatedAt=datetime.now(timezone.utc)) - + return [] try: data = json.loads(state.data) except json.JSONDecodeError: - data = [] - - return AnnotationStateResponse( - data=data, - updatedAt=datetime.fromisoformat(state.updated_at) - ) + return [] + return data if isinstance(data, list) else [] -@router.put("/{document_id}/annotations", response_model=AnnotationStateUpdateResponse, dependencies=[Depends(verify_csrf)]) -async def update_annotations( + +@router.get("/{document_id}/annotations", response_model=AnnotationStateResponse) +def get_annotations( + document_id: str, + db: Session = Depends(get_db), + _user_id: int = Depends(get_current_user), +) -> AnnotationStateResponse: + _document_or_404(document_id, db) + state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) + updated_at = datetime.now(UTC) if not state else _utc(datetime.fromisoformat(state.updated_at)) + return AnnotationStateResponse(data=_read_data(state), updatedAt=updated_at) + + +@router.put( + "/{document_id}/annotations", + response_model=AnnotationStateUpdateResponse, + dependencies=[Depends(verify_csrf)], +) +def update_annotations( document_id: str, request: AnnotationStateUpdateRequest, db: Session = Depends(get_db), - user_id: Any = Depends(get_current_user) -): - doc = db.scalar(select(Document).where(Document.id == document_id, Document.deleted_at.is_(None))) - if not doc: - raise HTTPException(status_code=404, detail="Document not found") - + _user_id: int = Depends(get_current_user), +) -> AnnotationStateUpdateResponse: + document = _document_or_404(document_id, db) state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) - - # Check for stale tab + if state and request.baseUpdatedAt: - current_updated_at = datetime.fromisoformat(state.updated_at).replace(tzinfo=timezone.utc) - request_updated_at = request.baseUpdatedAt.replace(tzinfo=timezone.utc) - # Allow a small grace period for timezone/parsing discrepancies + current_updated_at = _utc(datetime.fromisoformat(state.updated_at)) + request_updated_at = _utc(request.baseUpdatedAt) if abs((current_updated_at - request_updated_at).total_seconds()) > 1.0: raise HTTPException( - status_code=409, - detail=f"Conflict: annotations have been modified since {request.baseUpdatedAt}" + status_code=409, + detail=f"Conflict: annotations have been modified since {request.baseUpdatedAt}", ) - - now = _now_iso() - - import json - - # serialize request.data list of models to json string - data_json = json.dumps([a.model_dump(mode="json", by_alias=True) for a in request.data]) - if not state: - state = AnnotationState( - document_id=document_id, - data=data_json, - updated_at=now - ) - db.add(state) - else: + now = _now_iso() + data_json = json.dumps(request.data, separators=(",", ":")) + if state: state.data = data_json state.updated_at = now - - # Bump document updated_at - doc.updated_at = now - + else: + db.add(AnnotationState(document_id=document_id, data=data_json, updated_at=now)) + document.updated_at = now db.commit() - return AnnotationStateUpdateResponse(updatedAt=datetime.fromisoformat(now)) diff --git a/backend/app/api/v1/assets.py b/backend/app/api/v1/assets.py index 9f51004..0ae751b 100644 --- a/backend/app/api/v1/assets.py +++ b/backend/app/api/v1/assets.py @@ -1,58 +1,101 @@ -from fastapi import APIRouter, Depends, UploadFile, File, HTTPException -from fastapi.responses import FileResponse -from sqlalchemy.orm import Session +"""Authenticated binary assets used by annotations.""" + import uuid -import shutil from pathlib import Path -from app.db import get_db -from app.auth.dependencies import get_current_user +from fastapi import APIRouter, Depends, File, HTTPException, UploadFile +from fastapi.responses import FileResponse +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.auth.dependencies import get_current_user, verify_csrf from app.config import settings +from app.db import get_db +from app.models.document import Document router = APIRouter(prefix="/documents", tags=["Assets"]) +_ASSET_CHUNK_SIZE = 1024 * 1024 +_MAX_ASSET_BYTES = 25 * 1024 * 1024 -def get_asset_path(document_id: str, ref: str) -> Path: - # Ensure directory exists - dir_path = settings.PDF_STORAGE_PATH / "assets" / document_id - dir_path.mkdir(parents=True, exist_ok=True) - return dir_path / ref -@router.post("/{id}/assets") +def get_asset_path(document_id: str, ref: str, *, create: bool = False) -> Path: + """Return a safe asset path; only writes are allowed to create directories.""" + try: + asset_ref = str(uuid.UUID(ref)) + except ValueError as err: + raise HTTPException(status_code=404, detail="Asset not found") from err + + directory = settings.PDF_STORAGE_PATH / "assets" / document_id + if create: + directory.mkdir(parents=True, exist_ok=True) + return directory / asset_ref + + +def _is_supported_image(filepath: Path) -> bool: + with filepath.open("rb") as file: + header = file.read(12) + return ( + header.startswith(b"\x89PNG\r\n\x1a\n") + or header.startswith(b"\xff\xd8\xff") + or header.startswith((b"GIF87a", b"GIF89a")) + or (header.startswith(b"RIFF") and header[8:12] == b"WEBP") + ) + + +@router.post("/{id}/assets", dependencies=[Depends(verify_csrf)]) async def upload_asset( id: str, file: UploadFile = File(...), user_id: int = Depends(get_current_user), - db: Session = Depends(get_db) -): - """Upload a binary asset (like an image or signature) for a document.""" - # In a real app we'd verify the user owns the document here - # For this single-user app, we trust the ID - - if not file.content_type or not file.content_type.startswith("image/"): - raise HTTPException(status_code=400, detail="Only image assets are supported") + db: Session = Depends(get_db), +) -> dict[str, str]: + """Upload a PNG, JPEG, GIF, or WebP annotation asset.""" + document = db.scalar(select(Document).where(Document.id == id)) + if not document: + raise HTTPException(status_code=404, detail="Document not found") ref = str(uuid.uuid4()) - filepath = get_asset_path(id, ref) - - try: - with open(filepath, "wb") as f: - shutil.copyfileobj(file.file, f) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Failed to save asset: {e}") + filepath = get_asset_path(id, ref, create=True) + total_bytes = 0 + + try: + with filepath.open("wb") as destination: + while chunk := file.file.read(_ASSET_CHUNK_SIZE): + total_bytes += len(chunk) + if total_bytes > _MAX_ASSET_BYTES: + raise HTTPException(status_code=413, detail="Image asset is too large") + destination.write(chunk) + except HTTPException: + filepath.unlink(missing_ok=True) + raise + except Exception as err: + filepath.unlink(missing_ok=True) + raise HTTPException(status_code=500, detail="Failed to save asset") from err + + if not _is_supported_image(filepath): + filepath.unlink(missing_ok=True) + raise HTTPException( + status_code=400, + detail="Only PNG, JPEG, GIF, and WebP images are supported", + ) + + return {"ref": ref, "url": f"/api/v1/documents/{id}/assets/{ref}"} - return { - "ref": ref, - "url": f"/api/v1/documents/{id}/assets/{ref}" - } @router.get("/{id}/assets/{ref}") async def get_asset( id: str, ref: str, -): - """Serve a binary asset.""" + db: Session = Depends(get_db), + user_id: int = Depends(get_current_user), +) -> FileResponse: + """Serve an annotation asset to an authenticated session.""" + document = db.scalar(select(Document).where(Document.id == id)) + if not document: + raise HTTPException(status_code=404, detail="Document not found") + filepath = get_asset_path(id, ref) if not filepath.exists() or not filepath.is_file(): raise HTTPException(status_code=404, detail="Asset not found") - + return FileResponse(filepath) diff --git a/backend/app/api/v1/auth.py b/backend/app/api/v1/auth.py index c05c534..4d14cd2 100644 --- a/backend/app/api/v1/auth.py +++ b/backend/app/api/v1/auth.py @@ -31,37 +31,37 @@ def get_auth_status(request: Request, db: Session = Depends(get_db)) -> AuthStat app_settings = Settings() db.add(app_settings) db.commit() - + setup_required = app_settings.password_hash is None - + token = request.cookies.get(settings.COOKIE_NAME) logged_in = False if token: user_id = verify_session(token) if user_id is not None: logged_in = True - + return AuthStatusResponse(setupRequired=setup_required, loggedIn=logged_in) @router.post("/setup", dependencies=[Depends(verify_csrf)]) def setup_password( - data: SetupRequest, - response: Response, + data: SetupRequest, + response: Response, db: Session = Depends(get_db) ) -> dict[str, str]: """First-run setup.""" app_settings = db.query(Settings).first() if app_settings and app_settings.password_hash: raise HTTPException(status_code=409, detail="Password already set") - + if not app_settings: app_settings = Settings() db.add(app_settings) - + app_settings.password_hash = hash_password(data.password) db.commit() - + # Log them in automatically create_session(response) return {"status": "ok"} @@ -77,16 +77,16 @@ def login( """Validate password and issue session cookie.""" ip = get_client_ip(request) check_rate_limit(ip) - + app_settings = db.query(Settings).first() if not app_settings or not app_settings.password_hash: record_failed_attempt(ip) raise HTTPException(status_code=401, detail="Invalid credentials") - + if not verify_password(app_settings.password_hash, data.password): record_failed_attempt(ip) raise HTTPException(status_code=401, detail="Invalid credentials") - + clear_attempts(ip) create_session(response) return {"status": "ok"} @@ -108,17 +108,17 @@ def change_password( """Change an existing password.""" ip = get_client_ip(request) check_rate_limit(ip) - + app_settings = db.query(Settings).first() if not app_settings or not app_settings.password_hash: raise HTTPException(status_code=400, detail="Setup required first") - + if not verify_password(app_settings.password_hash, data.current_password): record_failed_attempt(ip) raise HTTPException(status_code=401, detail="Invalid current password") - + clear_attempts(ip) app_settings.password_hash = hash_password(data.new_password) db.commit() - + return {"status": "ok"} diff --git a/backend/app/api/v1/debug.py b/backend/app/api/v1/debug.py index 4d081f7..ae0dc79 100644 --- a/backend/app/api/v1/debug.py +++ b/backend/app/api/v1/debug.py @@ -28,28 +28,28 @@ async def verify_coords(req: VerifyCoordsRequest): try: doc = pymupdf.open(filepath) - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + except Exception as error: + raise HTTPException(status_code=500, detail=str(error)) from error if req.page < 0 or req.page >= len(doc): doc.close() raise HTTPException(status_code=400, detail="Invalid page number") page = doc[req.page] - + # Canonical space is defined as relative to the unrotated CropBox. # PyMuPDF naturally draws relative to the current rotation. # By temporarily setting rotation to 0, we can draw directly using canonical coordinates. original_rotation = page.rotation if original_rotation != 0: page.set_rotation(0) - + rect = pymupdf.Rect(req.x, req.y, req.x + req.width, req.y + req.height) page.draw_rect(rect, color=(1, 0, 0), width=2, fill=(1, 0, 0), fill_opacity=0.3) - + if original_rotation != 0: page.set_rotation(original_rotation) - + pdf_bytes = doc.write() doc.close() diff --git a/backend/app/api/v1/documents.py b/backend/app/api/v1/documents.py index 7e572b2..f1556a4 100644 --- a/backend/app/api/v1/documents.py +++ b/backend/app/api/v1/documents.py @@ -1,28 +1,31 @@ """Document management endpoints.""" -from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Query +from datetime import UTC, datetime + +from fastapi import APIRouter, Depends, File, HTTPException, Query, UploadFile, status from fastapi.responses import FileResponse -from sqlalchemy.orm import Session from sqlalchemy import desc -from datetime import datetime, timezone +from sqlalchemy.orm import Session from app.auth.dependencies import get_current_user, verify_csrf +from app.config import settings from app.db import get_db -from app.models.document import Document from app.models.annotation_state import AnnotationState +from app.models.document import Document from app.models.version import Version from app.schemas.document import ( - DocumentListResponse, DocumentMeta, BulkDeleteRequest, - BulkRestoreRequest, DocumentUpdateRequest + BulkDeleteRequest, + BulkRestoreRequest, + DocumentListResponse, + DocumentMeta, + DocumentUpdateRequest, ) -from app.services.storage import save_upload_file, delete_pdf_file -from app.services.thumbnails import generate_thumbnail, delete_thumbnail -from app.config import settings +from app.services.assets import delete_asset_directory +from app.services.storage import delete_pdf_file, safe_filename, save_upload_file +from app.services.thumbnails import delete_thumbnail, generate_thumbnail router = APIRouter( - prefix="/documents", - tags=["documents"], - dependencies=[Depends(get_current_user)] + prefix="/documents", tags=["documents"], dependencies=[Depends(get_current_user)] ) @@ -31,109 +34,135 @@ def list_documents( query: str = "", skip: int = Query(0, ge=0), limit: int = Query(50, ge=1, le=100), - db: Session = Depends(get_db) -): + db: Session = Depends(get_db), +) -> DocumentListResponse: """List non-trashed documents.""" q = db.query(Document).filter(Document.deleted_at.is_(None)) if query: q = q.filter(Document.title.ilike(f"%{query}%")) - + total = q.count() items = q.order_by(desc(Document.updated_at)).offset(skip).limit(limit).all() - - return DocumentListResponse(items=items, total=total) + + return DocumentListResponse( + items=[DocumentMeta.model_validate(item) for item in items], total=total + ) @router.get("/trash", response_model=DocumentListResponse) def list_trash( skip: int = Query(0, ge=0), limit: int = Query(50, ge=1, le=100), - db: Session = Depends(get_db) -): + db: Session = Depends(get_db), +) -> DocumentListResponse: """List trashed documents.""" q = db.query(Document).filter(Document.deleted_at.is_not(None)) total = q.count() items = q.order_by(desc(Document.deleted_at)).offset(skip).limit(limit).all() - return DocumentListResponse(items=items, total=total) + return DocumentListResponse( + items=[DocumentMeta.model_validate(item) for item in items], total=total + ) -@router.post("", dependencies=[Depends(verify_csrf)], response_model=DocumentMeta) +@router.post( + "", + dependencies=[Depends(verify_csrf)], + response_model=DocumentMeta, + status_code=status.HTTP_201_CREATED, +) async def upload_document( - file: UploadFile = File(...), - db: Session = Depends(get_db) -): + file: UploadFile = File(...), db: Session = Depends(get_db) +) -> DocumentMeta: """Upload a new PDF document.""" # Note: Starlette/FastAPI loads file into memory/spooled file. # To truly enforce max size before reading we rely on Nginx and logic in storage.py. # But checking size if available: if file.size and file.size > settings.MAX_UPLOAD_MB * 1024 * 1024: raise HTTPException(status_code=413, detail="File too large") - + file_id, size_bytes, page_count = await save_upload_file(file) - + # Generate thumbnail synchronously - generate_thumbnail(file_id) - - now = datetime.now(timezone.utc).isoformat() + thumbnail_generated = generate_thumbnail(file_id) + + now = datetime.now(UTC).isoformat() + filename = safe_filename(file.filename) doc = Document( id=file_id, - title=file.filename or "Untitled", - original_filename=file.filename or "Untitled.pdf", + title=filename, + original_filename=filename, file_path=str(settings.PDF_STORAGE_PATH / f"{file_id}.pdf"), + thumbnail_path=( + str(settings.THUMBNAILS_PATH / f"{file_id}.png") if thumbnail_generated else None + ), page_count=page_count, size_bytes=size_bytes, created_at=now, - updated_at=now + updated_at=now, ) - db.add(doc) - db.commit() + try: + db.add(doc) + db.commit() + except Exception: + delete_pdf_file(file_id) + delete_thumbnail(file_id) + delete_asset_directory(file_id) + raise db.refresh(doc) - return doc + return DocumentMeta.model_validate(doc) @router.get("/{id}", response_model=DocumentMeta) -def get_document(id: str, db: Session = Depends(get_db)): - doc = db.query(Document).filter(Document.id == id).first() +def get_document(id: str, db: Session = Depends(get_db)) -> DocumentMeta: + doc = db.query(Document).filter(Document.id == id, Document.deleted_at.is_(None)).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - return doc + return DocumentMeta.model_validate(doc) @router.patch("/{id}", dependencies=[Depends(verify_csrf)], response_model=DocumentMeta) -def update_document(id: str, update: DocumentUpdateRequest, db: Session = Depends(get_db)): +def update_document( + id: str, update: DocumentUpdateRequest, db: Session = Depends(get_db) +) -> DocumentMeta: doc = db.query(Document).filter(Document.id == id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - + if update.title is not None: - doc.title = update.title - + title = update.title.strip() + if not title: + raise HTTPException(status_code=422, detail="Title cannot be empty") + doc.title = title + if update.in_trash is not None: if update.in_trash: - doc.deleted_at = datetime.now(timezone.utc).isoformat() + doc.deleted_at = datetime.now(UTC).isoformat() else: doc.deleted_at = None - - doc.updated_at = datetime.now(timezone.utc).isoformat() + + doc.updated_at = datetime.now(UTC).isoformat() db.commit() db.refresh(doc) - return doc + return DocumentMeta.model_validate(doc) @router.delete("/{id}", dependencies=[Depends(verify_csrf)]) -def delete_document(id: str, permanent: bool = False, db: Session = Depends(get_db)): +def delete_document( + id: str, permanent: bool = False, db: Session = Depends(get_db) +) -> dict[str, str]: """Soft delete by default. Hard delete if permanent=True AND already in trash.""" doc = db.query(Document).filter(Document.id == id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - + if permanent: if doc.deleted_at is None: raise HTTPException(status_code=400, detail="Must be in trash to delete permanently") - + # Hard delete delete_pdf_file(doc.id) delete_thumbnail(doc.id) + delete_asset_directory(doc.id) db.query(AnnotationState).filter(AnnotationState.document_id == doc.id).delete() db.query(Version).filter(Version.document_id == doc.id).delete() db.delete(doc) @@ -141,52 +170,57 @@ def delete_document(id: str, permanent: bool = False, db: Session = Depends(get_ return {"status": "deleted"} else: # Soft delete - doc.deleted_at = datetime.now(timezone.utc).isoformat() + doc.deleted_at = datetime.now(UTC).isoformat() + doc.updated_at = doc.deleted_at db.commit() return {"status": "trashed"} @router.post("/{id}/restore", dependencies=[Depends(verify_csrf)], response_model=DocumentMeta) -def restore_document(id: str, db: Session = Depends(get_db)): +def restore_document(id: str, db: Session = Depends(get_db)) -> DocumentMeta: doc = db.query(Document).filter(Document.id == id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - + doc.deleted_at = None - doc.updated_at = datetime.now(timezone.utc).isoformat() + doc.updated_at = datetime.now(UTC).isoformat() db.commit() db.refresh(doc) - return doc + return DocumentMeta.model_validate(doc) @router.post("/bulk-delete", dependencies=[Depends(verify_csrf)]) -def bulk_delete(data: BulkDeleteRequest, db: Session = Depends(get_db)): - now = datetime.now(timezone.utc).isoformat() - db.query(Document).filter(Document.id.in_(data.ids)).update({ - Document.deleted_at: now - }, synchronize_session=False) +def bulk_delete(data: BulkDeleteRequest, db: Session = Depends(get_db)) -> dict[str, int | str]: + now = datetime.now(UTC).isoformat() + count = ( + db.query(Document) + .filter(Document.id.in_(data.ids), Document.deleted_at.is_(None)) + .update({Document.deleted_at: now}, synchronize_session=False) + ) db.commit() - return {"status": "ok", "count": len(data.ids)} + return {"status": "ok", "count": count} @router.post("/bulk-restore", dependencies=[Depends(verify_csrf)]) -def bulk_restore(data: BulkRestoreRequest, db: Session = Depends(get_db)): - now = datetime.now(timezone.utc).isoformat() - db.query(Document).filter(Document.id.in_(data.ids)).update({ - Document.deleted_at: None, - Document.updated_at: now - }, synchronize_session=False) +def bulk_restore(data: BulkRestoreRequest, db: Session = Depends(get_db)) -> dict[str, int | str]: + now = datetime.now(UTC).isoformat() + count = ( + db.query(Document) + .filter(Document.id.in_(data.ids), Document.deleted_at.is_not(None)) + .update({Document.deleted_at: None, Document.updated_at: now}, synchronize_session=False) + ) db.commit() - return {"status": "ok", "count": len(data.ids)} + return {"status": "ok", "count": count} @router.post("/trash/empty", dependencies=[Depends(verify_csrf)]) -def empty_trash(db: Session = Depends(get_db)): +def empty_trash(db: Session = Depends(get_db)) -> dict[str, int | str]: docs = db.query(Document).filter(Document.deleted_at.is_not(None)).all() count = 0 for doc in docs: delete_pdf_file(doc.id) delete_thumbnail(doc.id) + delete_asset_directory(doc.id) db.query(AnnotationState).filter(AnnotationState.document_id == doc.id).delete() db.query(Version).filter(Version.document_id == doc.id).delete() db.delete(doc) @@ -196,26 +230,26 @@ def empty_trash(db: Session = Depends(get_db)): @router.get("/{id}/file") -def get_document_file(id: str, db: Session = Depends(get_db)): +def get_document_file(id: str, db: Session = Depends(get_db)) -> FileResponse: doc = db.query(Document).filter(Document.id == id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - + path = settings.PDF_STORAGE_PATH / f"{doc.id}.pdf" if not path.exists(): raise HTTPException(status_code=404, detail="File missing") - + return FileResponse(path, media_type="application/pdf", filename=doc.filename) @router.get("/{id}/thumbnail") -def get_document_thumbnail(id: str, db: Session = Depends(get_db)): +def get_document_thumbnail(id: str, db: Session = Depends(get_db)) -> FileResponse: doc = db.query(Document).filter(Document.id == id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") - + path = settings.THUMBNAILS_PATH / f"{doc.id}.png" if not path.exists(): raise HTTPException(status_code=404, detail="Thumbnail missing") - + return FileResponse(path, media_type="image/png") diff --git a/backend/app/api/v1/export.py b/backend/app/api/v1/export.py new file mode 100644 index 0000000..2153fb5 --- /dev/null +++ b/backend/app/api/v1/export.py @@ -0,0 +1,94 @@ +"""Flattened PDF export endpoint.""" + +import json + +from fastapi import APIRouter, Depends, HTTPException +from fastapi.responses import Response +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.auth.dependencies import get_current_user, verify_csrf +from app.config import settings +from app.db import get_db +from app.models.annotation_state import AnnotationState +from app.models.document import Document +from app.models.version import Version +from app.schemas.export import ExportRequest +from app.services.export.renderer import export_annotations +from app.services.storage import safe_filename + +router = APIRouter( + prefix="/documents", + tags=["export"], + dependencies=[Depends(get_current_user)], +) + + +def _document_or_404(document_id: str, db: Session) -> Document: + document = db.scalar( + select(Document).where(Document.id == document_id, Document.deleted_at.is_(None)) + ) + if not document: + raise HTTPException(status_code=404, detail="Document not found") + return document + + +def _state_data(document_id: str, db: Session) -> list[dict[str, object]]: + state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) + if not state: + return [] + try: + data = json.loads(state.data) + except json.JSONDecodeError: + return [] + return data if isinstance(data, list) else [] + + +@router.post("/{document_id}/export", dependencies=[Depends(verify_csrf)]) +def export_document( + document_id: str, + request: ExportRequest, + db: Session = Depends(get_db), +) -> Response: + """Export the working layer or a selected version as a downloadable PDF.""" + document = _document_or_404(document_id, db) + pdf_path = settings.PDF_STORAGE_PATH / f"{document.id}.pdf" + if not pdf_path.is_file(): + raise HTTPException(status_code=404, detail="Original PDF is missing") + + if not request.flatten: + content = pdf_path.read_bytes() + elif request.versionId: + version = db.scalar( + select(Version).where( + Version.id == request.versionId, + Version.document_id == document_id, + ) + ) + if not version: + raise HTTPException(status_code=404, detail="Version not found") + try: + version_data = json.loads(version.data) + except json.JSONDecodeError: + version_data = [] + content = export_annotations( + pdf_path, + version_data if isinstance(version_data, list) else [], + settings.PDF_STORAGE_PATH / "assets" / document.id, + ) + else: + content = export_annotations( + pdf_path, + _state_data(document_id, db), + settings.PDF_STORAGE_PATH / "assets" / document.id, + ) + + filename = safe_filename(document.original_filename) + if not filename.lower().endswith(".pdf"): + filename = f"{filename}.pdf" + filename = filename.replace('"', "'").replace("\r", "").replace("\n", "") + return Response( + content=content, + media_type="application/pdf", + headers={"Content-Disposition": f'attachment; filename="{filename}"'}, + ) diff --git a/backend/app/api/v1/versions.py b/backend/app/api/v1/versions.py new file mode 100644 index 0000000..8757b94 --- /dev/null +++ b/backend/app/api/v1/versions.py @@ -0,0 +1,203 @@ +"""Annotation checkpoint and restore endpoints.""" + +import json +from datetime import UTC, datetime +from typing import Literal, cast + +from fastapi import APIRouter, Depends, HTTPException, Response, status +from sqlalchemy import desc, select +from sqlalchemy.orm import Session + +from app.auth.dependencies import get_current_user, verify_csrf +from app.db import get_db +from app.models.annotation_state import AnnotationState +from app.models.document import Document +from app.models.version import Version +from app.schemas.annotations import AnnotationPayload +from app.schemas.versions import ( + VersionCreateRequest, + VersionDataResponse, + VersionListResponse, + VersionMeta, + VersionRestoreResponse, +) + +router = APIRouter( + prefix="/documents", + tags=["versions"], + dependencies=[Depends(get_current_user)], +) + + +def _now_iso() -> str: + return datetime.now(UTC).isoformat() + + +def _document_or_404(document_id: str, db: Session) -> Document: + document = db.scalar( + select(Document).where(Document.id == document_id, Document.deleted_at.is_(None)) + ) + if not document: + raise HTTPException(status_code=404, detail="Document not found") + return document + + +def _read_state(document_id: str, db: Session) -> list[AnnotationPayload]: + state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) + if not state: + return [] + try: + data = json.loads(state.data) + except json.JSONDecodeError: + return [] + return data if isinstance(data, list) else [] + + +def _version_meta(version: Version) -> VersionMeta: + try: + data = json.loads(version.data) + except json.JSONDecodeError: + data = [] + return VersionMeta( + id=version.id, + documentId=version.document_id, + label=version.label, + kind=cast( + Literal["manual", "auto"], + version.kind if version.kind in {"manual", "auto"} else "auto", + ), + createdAt=datetime.fromisoformat(version.created_at), + annotationCount=len(data) if isinstance(data, list) else 0, + ) + + +def _create_snapshot( + document_id: str, + db: Session, + *, + label: str | None, + kind: str, +) -> Version: + version = Version( + document_id=document_id, + label=label, + kind=kind, + data=json.dumps(_read_state(document_id, db), separators=(",", ":")), + ) + db.add(version) + db.flush() + return version + + +@router.get("/{document_id}/versions", response_model=VersionListResponse) +def list_versions(document_id: str, db: Session = Depends(get_db)) -> VersionListResponse: + _document_or_404(document_id, db) + versions = db.scalars( + select(Version).where(Version.document_id == document_id).order_by(desc(Version.created_at)) + ).all() + return VersionListResponse(items=[_version_meta(version) for version in versions]) + + +@router.post( + "/{document_id}/versions", + response_model=VersionMeta, + status_code=status.HTTP_201_CREATED, + dependencies=[Depends(verify_csrf)], +) +def create_version( + document_id: str, + request: VersionCreateRequest, + db: Session = Depends(get_db), +) -> VersionMeta: + _document_or_404(document_id, db) + version = _create_snapshot( + document_id, + db, + label=request.label.strip() if request.label and request.label.strip() else None, + kind=request.kind, + ) + db.commit() + return _version_meta(version) + + +@router.get("/{document_id}/versions/{version_id}", response_model=VersionDataResponse) +def get_version( + document_id: str, + version_id: str, + db: Session = Depends(get_db), +) -> VersionDataResponse: + _document_or_404(document_id, db) + version = db.scalar( + select(Version).where(Version.id == version_id, Version.document_id == document_id) + ) + if not version: + raise HTTPException(status_code=404, detail="Version not found") + try: + data = json.loads(version.data) + except json.JSONDecodeError: + data = [] + return VersionDataResponse( + data=data if isinstance(data, list) else [], + meta=_version_meta(version), + ) + + +@router.post( + "/{document_id}/versions/{version_id}/restore", + response_model=VersionRestoreResponse, + dependencies=[Depends(verify_csrf)], +) +def restore_version( + document_id: str, + version_id: str, + db: Session = Depends(get_db), +) -> VersionRestoreResponse: + document = _document_or_404(document_id, db) + target = db.scalar( + select(Version).where(Version.id == version_id, Version.document_id == document_id) + ) + if not target: + raise HTTPException(status_code=404, detail="Version not found") + + # Restoring is destructive to the current working layer, so make it undoable. + _create_snapshot(document_id, db, label="Before restore", kind="auto") + try: + restored_data = json.loads(target.data) + except json.JSONDecodeError: + restored_data = [] + if not isinstance(restored_data, list): + restored_data = [] + + state = db.scalar(select(AnnotationState).where(AnnotationState.document_id == document_id)) + now = _now_iso() + if state: + state.data = json.dumps(restored_data, separators=(",", ":")) + state.updated_at = now + else: + db.add( + AnnotationState( + document_id=document_id, + data=json.dumps(restored_data, separators=(",", ":")), + updated_at=now, + ) + ) + document.updated_at = now + db.commit() + return VersionRestoreResponse(updatedAt=datetime.fromisoformat(now)) + + +@router.delete( + "/{document_id}/versions/{version_id}", + status_code=status.HTTP_204_NO_CONTENT, + dependencies=[Depends(verify_csrf)], +) +def delete_version(document_id: str, version_id: str, db: Session = Depends(get_db)) -> Response: + _document_or_404(document_id, db) + version = db.scalar( + select(Version).where(Version.id == version_id, Version.document_id == document_id) + ) + if not version: + raise HTTPException(status_code=404, detail="Version not found") + db.delete(version) + db.commit() + return Response(status_code=status.HTTP_204_NO_CONTENT) diff --git a/backend/app/assets/fonts/GreatVibes-Regular.ttf b/backend/app/assets/fonts/GreatVibes-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a1327ff3b862246f1f253639040edcc473e5f3a9 GIT binary patch literal 457588 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¨-pVm&f+N(&34d3^iP=))L6b>5c)wHv2&PX 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 literal 0 HcmV?d00001 diff --git a/backend/app/assets/fonts/caveat.ttf b/backend/app/assets/fonts/caveat.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f84acf2ce2d1b3329b194749530dbaec047e6df6 GIT binary patch literal 403648 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⁣YsmL8P*_#Bp@Rnl^Sdg04 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%0AMS0`Kr>>-yS$Az>iYugs-$EZ{VKvR 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 literal 0 HcmV?d00001 diff --git a/backend/app/assets/fonts/dancing-script.ttf b/backend/app/assets/fonts/dancing-script.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f521e7fb357ec9ea9820ebd36a9d7b1f72f2935 GIT binary patch literal 133636 zcmdSC2b^R@wJ=_FZ|9tI&N-*ase8iC%+AbC4m&%`CN{Adc9&&=B_mlRC_X`gf&tNo z2~{`j z`P%7H?-%Xed~`qaKJqO7Jk)oc zwR!Kh-lHn$+mmo#@VEW@4jq2vROfFI`l$>dtz!SdZTrs@Ty+UN58sgxC<#rY-pQv< zwQf?j{}r+93jje+sxi5bem-;OLsj+Z-|#g&LU#ew<^I8Q>@BCEF7K~Zb(PQ8(3Wa9 z$%VOyK;ZA)@RkSRN%E%Ee?0ik!+*xtAwJZ)k^zj-Fn7hvD1*MaS{0$&5jwvc?$=@K z$JSTSBM800)NmNY8KA&>$$dP+JPsEZV)4h}8xL9^ufEKzAT47+2Igv1!mn2UjDLlC znFxH}iHi8U)o1Vrs?Ra&k%MWiewKLy>R*5o%s!-Nlt{xoh`dY>QZc6LKk*+>h4~sX zGe?n`y%MfBL3uwiGUrr(hyT6$JifB}I_|5!fuF9vf=8>b;!^ctd`a~s{4=1ypQ~@6 zXR6)!%fQJmA(pwc`g8mQyn8P^b6NGn_8qpm}K>j_%ssWUsV5&e_efxNuxB-pbc=gGX*q*dDR!OsQLhY5bePqs{Q~y zT74b;7>UqNkOV!2Fr$FaKSBZg8{|Xhp^MO8pwXHA1IVZ z2%j{UU8qR-hTRThM|kJ|wA6TweF}Ju@LN-1b@08d`dOX<_>b^lz1)b#*>$z=gfIU; zF02zI@SDg<=K+}u%?0KKnHy`$W|(giD287|ZDh_saX01;nLqzSh0MX`LgylxkN;JH zc}nIgov+_OA@=_2t;{a~pZ`vIH=O^A=cp_o^5FkbVVu?HNujca$eZRuWDhCNR9|5Y zH916N(f>rb8-=JGA~LPH{2b&Ek#Vnrj3aW6TwkeO$!8A!WaA!u$KP+jx%)q@b|WZ6 zKH{sY&kz~OmFj6626_G%eE%a{iOj5mOd?lOzEypO`FQO!k)>(}XrrcJ2 zm5Ej#X8fS{o(3KF=jv-~%B%4GpVc>60qC{Ykc52<`gA_piH&GC=#*Z(1r6dLn!s{Y z#+vHo%okCXIfdfPC(tCm3>{`t=q~gs3Ng1KFsRY#P)-Jz8jhGZ;==OJMiH* zQ5M_bnu06ne^MADGJtN(ft_JszJMkfEsV`G)!#DrL*K5bs)4uEOcd^ofer8;&}-X~ zfcY7;dm&2j?gSg)6Hw-=KVr^9KA3gx`@fyTqhN?e-ey(SK3T+Pn%`S##Zbw39 z9F5TuM^|GpTEZ+m&x3Lv8o+m=0Q)3Lpzji!r}`!MBZBKQaJ9qrc>;wi*u~YK)XMMR zdN&keSF&)u7YcnEu5Utl5Xw3z&{p*dC}2-kr=jeDG71H_t9lyB{qVdNuJDfP*PuKK zrT&f^;Pczs{}*kK!2G%ywS&zuhlk-xFnSv4==Ejz{4;tF;TF_R>s8@;FFFP^g@29r zlJ^r_n#&_ZzOZLfnvlxGa)o|F+bklss1EV?pN8w@=mL;iKs_W!Nz{V6(E?gQ$I(fA z5?_mNz<1zJ;qT$!;TIVz6KAqak(p;6X1>XMoB27*V`Z$8)v#99$A;Jhn`ZNlOC0~^ z_=ij9vbY>Bk1OCxxmsOi*J0NkuDe_xaoy|sgzM9;2VGxueaUTbdpvxP#-sO`J%gSV z&$c(1Y8CJxn7B|1wW1!hh&H2h(d`tI+wuMQQT#mq1O6uyVNx|r9s^8%!Xj1xn5Y30 zFB_;~asgm+yG!dbxoj>M#iXT%$(^oy0F#fo9so?f;ClESm~4Fm1T1q3{}pf%0A0Td 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 HgfagCjBv*~ literal 0 HcmV?d00001 diff --git a/backend/app/auth/dependencies.py b/backend/app/auth/dependencies.py index 648ac19..12d1605 100644 --- a/backend/app/auth/dependencies.py +++ b/backend/app/auth/dependencies.py @@ -1,10 +1,11 @@ """FastAPI dependencies for authentication and security.""" -from fastapi import Request, HTTPException +from fastapi import HTTPException, Request from app.auth.session import verify_session from app.config import settings + def get_current_user(request: Request) -> int: """ Dependency that extracts and validates the session cookie. @@ -14,11 +15,11 @@ def get_current_user(request: Request) -> int: token = request.cookies.get(settings.COOKIE_NAME) if not token: raise HTTPException(status_code=401, detail="Not authenticated") - + user_id = verify_session(token) if not user_id: raise HTTPException(status_code=401, detail="Session expired or invalid") - + return user_id @@ -27,9 +28,11 @@ def verify_csrf(request: Request) -> None: Dependency to mitigate CSRF for cookie-based auth. Requires X-Requested-With header on all mutating requests. """ - if request.method in ["POST", "PUT", "PATCH", "DELETE"]: - if request.headers.get("X-Requested-With") != "XMLHttpRequest": - raise HTTPException( - status_code=403, - detail="CSRF check failed: missing X-Requested-With header" - ) + if ( + request.method in ["POST", "PUT", "PATCH", "DELETE"] + and request.headers.get("X-Requested-With") != "XMLHttpRequest" + ): + raise HTTPException( + status_code=403, + detail="CSRF check failed: missing X-Requested-With header", + ) diff --git a/backend/app/auth/hashing.py b/backend/app/auth/hashing.py index 31beb5d..1d4e62e 100644 --- a/backend/app/auth/hashing.py +++ b/backend/app/auth/hashing.py @@ -1,20 +1,22 @@ """Argon2id password hashing and verification.""" from argon2 import PasswordHasher -from argon2.exceptions import VerifyMismatchError +from argon2.exceptions import InvalidHashError, VerifyMismatchError # Argon2id is the default for PasswordHasher ph = PasswordHasher() + def hash_password(password: str) -> str: """Hash a plaintext password.""" return ph.hash(password) + def verify_password(hashed: str, password: str) -> bool: """Verify a password against a hash. Returns True if matched.""" try: ph.verify(hashed, password) # Note: We skip check_needs_rehash() for simplicity in this single-user app. return True - except VerifyMismatchError: + except (InvalidHashError, VerifyMismatchError): return False diff --git a/backend/app/auth/rate_limit.py b/backend/app/auth/rate_limit.py index fd25202..18d8c99 100644 --- a/backend/app/auth/rate_limit.py +++ b/backend/app/auth/rate_limit.py @@ -2,6 +2,7 @@ import time from collections import defaultdict + from fastapi import HTTPException from app.config import settings @@ -27,7 +28,7 @@ def check_rate_limit(ip: str) -> None: detail=f"Too many failed attempts. Try again in {remaining} seconds.", headers={"Retry-After": str(remaining)}, ) - + # If lockout has expired, reset if record["lockout_until"] > 0 and record["lockout_until"] <= now: record["attempts"] = 0 diff --git a/backend/app/auth/session.py b/backend/app/auth/session.py index 837ad59..9b67f56 100644 --- a/backend/app/auth/session.py +++ b/backend/app/auth/session.py @@ -1,11 +1,13 @@ """Session token generation and validation.""" from typing import Any + from fastapi import Response -from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired +from itsdangerous import BadSignature, SignatureExpired, URLSafeTimedSerializer from app.config import settings + def get_serializer() -> URLSafeTimedSerializer: """Return a configured URLSafeTimedSerializer.""" return URLSafeTimedSerializer(settings.SECRET_KEY) @@ -14,7 +16,7 @@ def create_session(response: Response, user_id: int = 1) -> None: """Create a new session token and set it as an HTTP-only cookie.""" serializer = get_serializer() token = serializer.dumps({"user_id": user_id}) - + response.set_cookie( key=settings.COOKIE_NAME, value=token, @@ -41,7 +43,7 @@ def verify_session(token: str) -> int | None: serializer = get_serializer() try: data: dict[str, Any] = serializer.loads( - token, + token, max_age=settings.COOKIE_MAX_AGE_SECONDS ) return data.get("user_id") diff --git a/backend/app/config.py b/backend/app/config.py index a960c20..01aec3b 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -5,6 +5,7 @@ All settings are driven by environment variables (see .env.example). """ from pathlib import Path + from pydantic_settings import BaseSettings diff --git a/backend/app/db.py b/backend/app/db.py index cccde5b..cf8b5a6 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -4,11 +4,10 @@ Database engine, session management, and WAL mode setup. SQLite with WAL mode for single-user concurrent read/write safety. """ -from collections.abc import AsyncGenerator -from contextlib import asynccontextmanager +from collections.abc import Generator from typing import Any -from sqlalchemy import event, create_engine, Engine +from sqlalchemy import Engine, create_engine, event from sqlalchemy.orm import DeclarativeBase, Session, sessionmaker from app.config import settings @@ -16,6 +15,7 @@ from app.config import settings class Base(DeclarativeBase): """SQLAlchemy declarative base for all models.""" + pass @@ -49,10 +49,10 @@ engine = create_db_engine() SessionLocal = sessionmaker(bind=engine, class_=Session, expire_on_commit=False) -def get_db() -> Session: +def get_db() -> Generator[Session, None, None]: """FastAPI dependency that yields a database session.""" db = SessionLocal() try: - yield db # type: ignore[misc] + yield db finally: db.close() diff --git a/backend/app/main.py b/backend/app/main.py index 1d5a8e8..24269ee 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -5,8 +5,8 @@ This is the main entry point. The lifespan handler initializes the database and ensures required directories exist on startup. """ -from contextlib import asynccontextmanager from collections.abc import AsyncGenerator +from contextlib import asynccontextmanager from typing import Any from fastapi import FastAPI, Request @@ -14,7 +14,8 @@ from fastapi.responses import JSONResponse from app.api.v1 import router as v1_router from app.config import settings -from app.db import Base, engine +from app.db import Base, SessionLocal, engine +from app.services.trash_sweep import prune_auto_versions, sweep_trash @asynccontextmanager @@ -29,6 +30,12 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: settings.THUMBNAILS_PATH.mkdir(parents=True, exist_ok=True) settings.DATABASE_PATH.parent.mkdir(parents=True, exist_ok=True) + # Run retention cleanup on every startup. This keeps the single-container + # deployment self-maintaining without requiring a separate scheduler. + with SessionLocal() as db: + sweep_trash(db) + prune_auto_versions(db) + yield # Shutdown: dispose of the engine @@ -48,6 +55,7 @@ app = FastAPI( # --- Error handlers --- + @app.exception_handler(404) async def not_found_handler(request: Request, exc: Any) -> JSONResponse: """Consistent 404 error envelope.""" diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index f51bd38..7015970 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -5,9 +5,9 @@ All models use UUIDv4 string primary keys (except the singleton settings row). Timestamps are stored as ISO8601 TEXT columns. """ -from app.models.settings import Settings -from app.models.document import Document from app.models.annotation_state import AnnotationState +from app.models.document import Document +from app.models.settings import Settings from app.models.version import Version -__all__ = ["Settings", "Document", "AnnotationState", "Version"] +__all__ = ["AnnotationState", "Document", "Settings", "Version"] diff --git a/backend/app/models/annotation_state.py b/backend/app/models/annotation_state.py index 4078115..e9223e4 100644 --- a/backend/app/models/annotation_state.py +++ b/backend/app/models/annotation_state.py @@ -1,15 +1,19 @@ """AnnotationState model — current working annotation layer per document.""" -from datetime import datetime, timezone +from datetime import UTC, datetime +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db import Base +if TYPE_CHECKING: + from app.models.document import Document + def _now_iso() -> str: - return datetime.now(timezone.utc).isoformat() + return datetime.now(UTC).isoformat() class AnnotationState(Base): diff --git a/backend/app/models/document.py b/backend/app/models/document.py index a60a695..eedbba7 100644 --- a/backend/app/models/document.py +++ b/backend/app/models/document.py @@ -1,20 +1,25 @@ """Document model — uploaded PDFs with soft-delete support.""" import uuid -from datetime import datetime, timezone +from datetime import UTC, datetime +from typing import TYPE_CHECKING from sqlalchemy import Index, Integer, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db import Base +if TYPE_CHECKING: + from app.models.annotation_state import AnnotationState + from app.models.version import Version + def _uuid() -> str: return str(uuid.uuid4()) def _now_iso() -> str: - return datetime.now(timezone.utc).isoformat() + return datetime.now(UTC).isoformat() class Document(Base): diff --git a/backend/app/models/settings.py b/backend/app/models/settings.py index e222907..4a5e04d 100644 --- a/backend/app/models/settings.py +++ b/backend/app/models/settings.py @@ -1,6 +1,6 @@ """Settings model — singleton row for app-wide configuration.""" -from datetime import datetime, timezone +from datetime import UTC, datetime from sqlalchemy import Integer, Text from sqlalchemy.orm import Mapped, mapped_column @@ -22,10 +22,10 @@ class Settings(Base): password_hash: Mapped[str | None] = mapped_column(Text, nullable=True, default=None) created_at: Mapped[str] = mapped_column( Text, - default=lambda: datetime.now(timezone.utc).isoformat(), + default=lambda: datetime.now(UTC).isoformat(), ) updated_at: Mapped[str] = mapped_column( Text, - default=lambda: datetime.now(timezone.utc).isoformat(), - onupdate=lambda: datetime.now(timezone.utc).isoformat(), + default=lambda: datetime.now(UTC).isoformat(), + onupdate=lambda: datetime.now(UTC).isoformat(), ) diff --git a/backend/app/models/version.py b/backend/app/models/version.py index 35ab070..e33b85b 100644 --- a/backend/app/models/version.py +++ b/backend/app/models/version.py @@ -1,20 +1,24 @@ """Version model — annotation state snapshots for history/recovery.""" import uuid -from datetime import datetime, timezone +from datetime import UTC, datetime +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, Index, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db import Base +if TYPE_CHECKING: + from app.models.document import Document + def _uuid() -> str: return str(uuid.uuid4()) def _now_iso() -> str: - return datetime.now(timezone.utc).isoformat() + return datetime.now(UTC).isoformat() class Version(Base): @@ -40,6 +44,4 @@ class Version(Base): # Relationships document: Mapped["Document"] = relationship("Document", back_populates="versions") - __table_args__ = ( - Index("ix_versions_document_created", "document_id", "created_at"), - ) + __table_args__ = (Index("ix_versions_document_created", "document_id", "created_at"),) diff --git a/backend/app/schemas/annotations.py b/backend/app/schemas/annotations.py index a8b9aad..5aca730 100644 --- a/backend/app/schemas/annotations.py +++ b/backend/app/schemas/annotations.py @@ -1,14 +1,17 @@ from datetime import datetime -from typing import Literal, Union, List, Tuple, Optional -from pydantic import BaseModel, Field +from typing import Any, Literal from uuid import UUID +from pydantic import BaseModel, Field + + class Rect(BaseModel): x: float y: float width: float height: float + class AnnotationBase(BaseModel): id: UUID page: int = Field(ge=0) @@ -19,6 +22,7 @@ class AnnotationBase(BaseModel): createdAt: datetime updatedAt: datetime + class TextProps(BaseModel): text: str fontFamily: str = "Liberation Sans" @@ -28,82 +32,105 @@ class TextProps(BaseModel): bold: bool = False italic: bool = False lineHeight: float = 1.2 - highlightColor: Optional[str] = None - styles: Optional[dict] = None + highlightColor: str | None = None + styles: dict[str, Any] | None = None + class TextAnnotation(AnnotationBase): type: Literal["text"] props: TextProps + class DrawProps(BaseModel): - paths: List[Tuple[float, float]] = [] - svgPath: Optional[str] = None + paths: list[tuple[float, float]] = Field(default_factory=list) + svgPath: str | None = None strokeColor: str = "#000000" strokeWidth: float = 2 opacity: float = 1.0 + class DrawAnnotation(AnnotationBase): type: Literal["draw"] props: DrawProps + class SignatureDrawProps(BaseModel): mode: Literal["draw"] ref: str strokeColor: str = "#000000" + class SignatureTypeProps(BaseModel): mode: Literal["type"] text: str fontFamily: str color: str = "#000000" + class SignatureAnnotation(AnnotationBase): type: Literal["signature"] - props: Union[SignatureDrawProps, SignatureTypeProps] = Field(discriminator="mode") + props: SignatureDrawProps | SignatureTypeProps = Field(discriminator="mode") + class ImageProps(BaseModel): ref: str naturalWidth: float naturalHeight: float + class ImageAnnotation(AnnotationBase): type: Literal["image"] props: ImageProps + class HighlightProps(BaseModel): color: str = "#FFEB3B" opacity: float = 0.3 + class HighlightAnnotation(AnnotationBase): type: Literal["highlight"] props: HighlightProps + class ShapeProps(BaseModel): kind: Literal["rect", "ellipse", "line", "arrow"] strokeColor: str = "#000000" fillColor: str = "transparent" strokeWidth: float = 2 + start: tuple[float, float] | None = None + end: tuple[float, float] | None = None + class ShapeAnnotation(AnnotationBase): type: Literal["shape"] props: ShapeProps -Annotation = Union[ - TextAnnotation, - DrawAnnotation, - SignatureAnnotation, - ImageAnnotation, - HighlightAnnotation, - ShapeAnnotation -] + +KnownAnnotation = ( + TextAnnotation + | DrawAnnotation + | SignatureAnnotation + | ImageAnnotation + | HighlightAnnotation + | ShapeAnnotation +) + +# Working state is intentionally opaque. Keeping this payload as dictionaries +# lets newer clients round-trip annotation types that this server cannot export +# yet; the export registry skips those types with a warning. +AnnotationPayload = dict[str, Any] + class AnnotationStateResponse(BaseModel): - data: List[Annotation] + data: list[AnnotationPayload] updatedAt: datetime + class AnnotationStateUpdateRequest(BaseModel): - data: List[Annotation] + data: list[AnnotationPayload] baseUpdatedAt: datetime | None = None + class AnnotationStateUpdateResponse(BaseModel): updatedAt: datetime diff --git a/backend/app/schemas/auth.py b/backend/app/schemas/auth.py index 58bfb9d..247c776 100644 --- a/backend/app/schemas/auth.py +++ b/backend/app/schemas/auth.py @@ -2,6 +2,7 @@ from pydantic import BaseModel, Field + class SetupRequest(BaseModel): password: str = Field(..., min_length=8) diff --git a/backend/app/schemas/document.py b/backend/app/schemas/document.py index 0479202..dbfb03a 100644 --- a/backend/app/schemas/document.py +++ b/backend/app/schemas/document.py @@ -1,7 +1,8 @@ """Pydantic schemas for Document APIs.""" + from pydantic import BaseModel -from typing import Optional + class DocumentMeta(BaseModel): id: str @@ -12,7 +13,7 @@ class DocumentMeta(BaseModel): in_trash: bool created_at: str updated_at: str - deleted_at: Optional[str] + deleted_at: str | None model_config = {"from_attributes": True} @@ -27,5 +28,5 @@ class BulkRestoreRequest(BaseModel): ids: list[str] class DocumentUpdateRequest(BaseModel): - title: Optional[str] = None - in_trash: Optional[bool] = None + title: str | None = None + in_trash: bool | None = None diff --git a/backend/app/schemas/export.py b/backend/app/schemas/export.py new file mode 100644 index 0000000..2eaa9c2 --- /dev/null +++ b/backend/app/schemas/export.py @@ -0,0 +1,8 @@ +"""PDF export request schema.""" + +from pydantic import BaseModel + + +class ExportRequest(BaseModel): + versionId: str | None = None + flatten: bool = True diff --git a/backend/app/schemas/versions.py b/backend/app/schemas/versions.py new file mode 100644 index 0000000..4ba7343 --- /dev/null +++ b/backend/app/schemas/versions.py @@ -0,0 +1,35 @@ +"""Version checkpoint schemas.""" + +from datetime import datetime +from typing import Literal + +from pydantic import BaseModel, Field + +from app.schemas.annotations import AnnotationPayload + + +class VersionCreateRequest(BaseModel): + label: str | None = Field(default=None, max_length=120) + kind: Literal["manual", "auto"] = "manual" + + +class VersionMeta(BaseModel): + id: str + documentId: str + label: str | None + kind: Literal["manual", "auto"] + createdAt: datetime + annotationCount: int + + +class VersionListResponse(BaseModel): + items: list[VersionMeta] + + +class VersionDataResponse(BaseModel): + data: list[AnnotationPayload] + meta: VersionMeta + + +class VersionRestoreResponse(BaseModel): + updatedAt: datetime diff --git a/backend/app/services/assets.py b/backend/app/services/assets.py new file mode 100644 index 0000000..665f077 --- /dev/null +++ b/backend/app/services/assets.py @@ -0,0 +1,12 @@ +"""Storage helpers for binary annotation assets.""" + +import shutil + +from app.config import settings + + +def delete_asset_directory(document_id: str) -> None: + """Delete all uploaded annotation assets belonging to a document.""" + directory = settings.PDF_STORAGE_PATH / "assets" / document_id + if directory.exists(): + shutil.rmtree(directory) diff --git a/backend/app/services/export/__init__.py b/backend/app/services/export/__init__.py new file mode 100644 index 0000000..019a571 --- /dev/null +++ b/backend/app/services/export/__init__.py @@ -0,0 +1 @@ +"""PDF export services.""" diff --git a/backend/app/services/export/renderer.py b/backend/app/services/export/renderer.py new file mode 100644 index 0000000..a6af6f0 --- /dev/null +++ b/backend/app/services/export/renderer.py @@ -0,0 +1,465 @@ +"""Flatten canonical annotation data into a PDF with PyMuPDF.""" + +import logging +import math +import re +import uuid +from collections.abc import Callable, Mapping, Sequence +from pathlib import Path +from typing import Any + +import pymupdf + +logger = logging.getLogger(__name__) +Annotation = Mapping[str, Any] +Handler = Callable[[pymupdf.Page, Annotation, Path], None] + + +def _rect(annotation: Annotation) -> pymupdf.Rect | None: + value = annotation.get("rect") + if not isinstance(value, Mapping): + return None + try: + x = float(value["x"]) + y = float(value["y"]) + width = float(value["width"]) + height = float(value["height"]) + except (KeyError, TypeError, ValueError): + return None + if width < 0 or height < 0: + return None + return pymupdf.Rect(x, y, x + width, y + height) + + +def _props(annotation: Annotation) -> Mapping[str, Any]: + value = annotation.get("props") + return value if isinstance(value, Mapping) else {} + + +def _color( + value: Any, + fallback: tuple[float, float, float] = (0.0, 0.0, 0.0), +) -> tuple[float, float, float]: + if not isinstance(value, str): + return fallback + text = value.strip().lstrip("#") + if len(text) == 3: + text = "".join(char * 2 for char in text) + if len(text) != 6: + return fallback + try: + return tuple(int(text[index : index + 2], 16) / 255 for index in (0, 2, 4)) # type: ignore[return-value] + except ValueError: + return fallback + + +def _opacity(value: Any, fallback: float = 1.0) -> float: + try: + return max(0.0, min(1.0, float(value))) + except (TypeError, ValueError): + return fallback + + +def _font_name(family: Any, bold: Any = False, italic: Any = False) -> str: + name = str(family or "Liberation Sans").lower() + is_serif = "times" in name or "serif" in name + is_mono = "courier" in name or "mono" in name + if is_serif: + normal, bold_name, italic_name, bold_italic_name = "tiro", "tibo", "tiit", "tibi" + elif is_mono: + normal, bold_name, italic_name, bold_italic_name = "cour", "cobo", "coit", "cobi" + else: + normal, bold_name, italic_name, bold_italic_name = "helv", "hebo", "heit", "hebi" + if bold and italic: + return bold_italic_name + if bold: + return bold_name + if italic: + return italic_name + return normal + + +_SIGNATURE_FONT_FILES = { + "great vibes": "GreatVibes-Regular.ttf", + "allura": "allura.ttf", + "sacramento": "sacramento.ttf", + "dancing script": "dancing-script.ttf", + "caveat": "caveat.ttf", +} + + +def _signature_font_file(family: Any) -> Path | None: + filename = _SIGNATURE_FONT_FILES.get(str(family or "").strip().lower()) + if not filename: + return None + path = Path(__file__).parents[2] / "assets" / "fonts" / filename + return path if path.is_file() else None + + +def _signature_font_size( + rect: pymupdf.Rect, text: str, font_file: Path | None, font_name: str +) -> float: + size = max(1.0, min(48.0, rect.height * 0.55)) + try: + font = ( + pymupdf.Font(fontfile=str(font_file)) if font_file else pymupdf.Font(fontname=font_name) + ) + text_width = font.text_length(text, fontsize=size) + if text_width > rect.width and text_width > 0: + size *= max(0.1, rect.width / text_width) * 0.95 + except Exception: + # A missing optional font must not prevent a PDF export. + pass + return max(1.0, size) + + +def _points_from_props(annotation: Annotation, rect: pymupdf.Rect) -> list[pymupdf.Point]: + props = _props(annotation) + raw_points = props.get("paths") + points: list[pymupdf.Point] = [] + if isinstance(raw_points, Sequence) and not isinstance(raw_points, (str, bytes)): + for raw_point in raw_points: + if isinstance(raw_point, Sequence) and len(raw_point) == 2: + try: + points.append( + pymupdf.Point( + rect.x0 + float(raw_point[0]), + rect.y0 + float(raw_point[1]), + ) + ) + except (TypeError, ValueError): + continue + if len(points) >= 2: + return points + + # Older clients stored a Fabric SVG path. Approximate its command end + # points and normalize them into the canonical annotation rectangle. + svg_path = props.get("svgPath") + if not isinstance(svg_path, str): + return [] + raw = [float(value) for value in re.findall(r"[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?", svg_path)] + if len(raw) < 4: + return [] + pairs = list(zip(raw[::2], raw[1::2], strict=False)) + min_x = min(point[0] for point in pairs) + max_x = max(point[0] for point in pairs) + min_y = min(point[1] for point in pairs) + max_y = max(point[1] for point in pairs) + source_width = max(max_x - min_x, 1e-6) + source_height = max(max_y - min_y, 1e-6) + return [ + pymupdf.Point( + rect.x0 + (x - min_x) / source_width * rect.width, + rect.y0 + (y - min_y) / source_height * rect.height, + ) + for x, y in pairs + ] + + +def _draw_polyline( + page: pymupdf.Page, + points: list[pymupdf.Point], + *, + color: tuple[float, float, float], + width: float, + opacity: float, +) -> None: + if len(points) < 2: + return + shape = page.new_shape() + shape.draw_polyline(points) + shape.finish(color=color, width=max(0.1, width), stroke_opacity=opacity) + shape.commit(overlay=True) + + +def _style_at(styles: Any, line_number: int, character_number: int) -> Mapping[str, Any]: + if not isinstance(styles, Mapping): + return {} + line_styles = styles.get(str(line_number), styles.get(line_number)) + if not isinstance(line_styles, Mapping): + return {} + character_style = line_styles.get(str(character_number), line_styles.get(character_number)) + return character_style if isinstance(character_style, Mapping) else {} + + +def _render_styled_text( + page: pymupdf.Page, + rect: pymupdf.Rect, + text: str, + props: Mapping[str, Any], + styles: Any, +) -> bool: + if not isinstance(styles, Mapping) or not styles: + return False + + base_size = max(1.0, float(props.get("fontSize", 14))) + line_height = max(0.5, float(props.get("lineHeight", 1.2))) + lines = text.split("\n") + y = rect.y0 + for line_number, line in enumerate(lines): + measured: list[tuple[str, float, str, tuple[float, float, float], float, str | None]] = [] + for character_number, character in enumerate(line): + style = _style_at(styles, line_number, character_number) + font_size = max(1.0, float(style.get("fontSize", base_size))) + font_family = style.get("fontFamily", props.get("fontFamily")) + font_name = _font_name( + font_family, + style.get("fontWeight") == "bold", + style.get("fontStyle") == "italic", + ) + color = _color(style.get("fill", props.get("color"))) + font = pymupdf.Font(fontname=font_name) + width = float(font.text_length(character, fontsize=font_size)) + background = style.get("textBackgroundColor", props.get("highlightColor")) + measured.append((character, font_size, font_name, color, width, background)) + + total_width = sum(item[4] for item in measured) + align = str(props.get("align", "left")) + x = rect.x0 + if align == "center": + x += max(0.0, (rect.width - total_width) / 2) + elif align == "right": + x += max(0.0, rect.width - total_width) + + max_size = max((item[1] for item in measured), default=base_size) + for character, font_size, font_name, color, width, background in measured: + if ( + isinstance(background, str) + and background.lower() not in {"", "transparent", "none"} + ): + page.draw_rect( + pymupdf.Rect(x, y, x + width, y + max_size * 1.15), + color=None, + fill=_color(background), + fill_opacity=0.3, + overlay=True, + ) + if character != " ": + page.insert_text( + pymupdf.Point(x, y + font_size), + character, + fontsize=font_size, + fontname=font_name, + color=color, + overlay=True, + ) + x += width + y += max_size * line_height + + return True + + +def render_text(page: pymupdf.Page, annotation: Annotation, _assets_dir: Path) -> None: + rect = _rect(annotation) + if rect is None: + return + props = _props(annotation) + text = str(props.get("text", "")) + if not text: + return + highlight = props.get("highlightColor") + if isinstance(highlight, str) and highlight and highlight.lower() != "transparent": + page.draw_rect(rect, color=None, fill=_color(highlight), fill_opacity=0.3, overlay=True) + if _render_styled_text(page, rect, text, props, props.get("styles")): + return + align = {"left": 0, "center": 1, "right": 2}.get(str(props.get("align", "left")), 0) + page.insert_textbox( + rect, + text, + fontsize=max(1.0, float(props.get("fontSize", 14))), + fontname=_font_name(props.get("fontFamily"), props.get("bold"), props.get("italic")), + color=_color(props.get("color")), + align=align, + overlay=True, + ) + + +def render_draw(page: pymupdf.Page, annotation: Annotation, _assets_dir: Path) -> None: + rect = _rect(annotation) + if rect is None: + return + props = _props(annotation) + _draw_polyline( + page, + _points_from_props(annotation, rect), + color=_color(props.get("strokeColor")), + width=float(props.get("strokeWidth", 2)), + opacity=_opacity(props.get("opacity")), + ) + + +def _asset_path(assets_dir: Path, ref: Any) -> Path | None: + if not isinstance(ref, str): + return None + try: + safe_ref = str(uuid.UUID(ref)) + except ValueError: + return None + path = assets_dir / safe_ref + return path if path.is_file() else None + + +def render_image(page: pymupdf.Page, annotation: Annotation, assets_dir: Path) -> None: + rect = _rect(annotation) + asset = _asset_path(assets_dir, _props(annotation).get("ref")) + if rect is None or asset is None: + return + page.insert_image(rect, filename=str(asset), keep_proportion=False, overlay=True) + + +def render_signature(page: pymupdf.Page, annotation: Annotation, assets_dir: Path) -> None: + rect = _rect(annotation) + props = _props(annotation) + if rect is None: + return + if props.get("mode") == "draw": + asset = _asset_path(assets_dir, props.get("ref")) + if asset is not None: + page.insert_image(rect, filename=str(asset), keep_proportion=False, overlay=True) + return + text = str(props.get("text", "")) + if text: + font_file = _signature_font_file(props.get("fontFamily")) + font_name = _font_name(props.get("fontFamily"), False, False) + options: dict[str, Any] = { + # Script fonts have a taller ascender than the built-in PDF fonts; + # leave room inside the editor's saved bounding rectangle so a + # valid signature is never silently dropped for not fitting. + "fontsize": _signature_font_size(rect, text, font_file, font_name), + "color": _color(props.get("color")), + "overlay": True, + } + if font_file: + options["fontname"] = f"paperjet-{font_file.stem.lower()}" + options["fontfile"] = str(font_file) + else: + options["fontname"] = font_name + page.insert_textbox(rect, text, **options) + + +def render_highlight(page: pymupdf.Page, annotation: Annotation, _assets_dir: Path) -> None: + rect = _rect(annotation) + if rect is None: + return + props = _props(annotation) + page.draw_rect( + rect, + color=None, + fill=_color(props.get("color"), (1.0, 0.92, 0.1)), + fill_opacity=_opacity(props.get("opacity"), 0.3), + overlay=True, + ) + + +def render_shape(page: pymupdf.Page, annotation: Annotation, _assets_dir: Path) -> None: + rect = _rect(annotation) + if rect is None: + return + props = _props(annotation) + kind = str(props.get("kind", "rect")) + stroke = _color(props.get("strokeColor")) + fill_value = props.get("fillColor") + fill = None if fill_value in (None, "", "transparent", "none") else _color(fill_value) + width = max(0.1, float(props.get("strokeWidth", 2))) + if kind == "ellipse": + page.draw_oval(rect, color=stroke, fill=fill, width=width, overlay=True) + elif kind in {"line", "arrow"}: + start = props.get("start") + end = props.get("end") + if ( + isinstance(start, Sequence) + and not isinstance(start, (str, bytes)) + and len(start) == 2 + and isinstance(end, Sequence) + and not isinstance(end, (str, bytes)) + and len(end) == 2 + ): + try: + start_point = pymupdf.Point( + rect.x0 + float(start[0]) * rect.width, + rect.y0 + float(start[1]) * rect.height, + ) + end_point = pymupdf.Point( + rect.x0 + float(end[0]) * rect.width, + rect.y0 + float(end[1]) * rect.height, + ) + except (TypeError, ValueError): + start_point, end_point = rect.tl, rect.br + else: + start_point, end_point = rect.tl, rect.br + page.draw_line(start_point, end_point, color=stroke, width=width, overlay=True) + if kind == "arrow": + angle = math.atan2(end_point.y - start_point.y, end_point.x - start_point.x) + length = min( + 12.0, + max( + 5.0, math.hypot(end_point.x - start_point.x, end_point.y - start_point.y) * 0.2 + ), + ) + left = pymupdf.Point( + end_point.x - length * math.cos(angle - math.pi / 6), + end_point.y - length * math.sin(angle - math.pi / 6), + ) + right = pymupdf.Point( + end_point.x - length * math.cos(angle + math.pi / 6), + end_point.y - length * math.sin(angle + math.pi / 6), + ) + page.draw_polyline([left, end_point, right], color=stroke, width=width, overlay=True) + else: + page.draw_rect(rect, color=stroke, fill=fill, width=width, overlay=True) + + +HANDLERS: dict[str, Handler] = { + "text": render_text, + "draw": render_draw, + "signature": render_signature, + "image": render_image, + "highlight": render_highlight, + "shape": render_shape, +} + + +def export_annotations( + pdf_path: Path, + annotations: Sequence[Annotation], + assets_dir: Path, +) -> bytes: + """Return a flattened PDF while preserving the source page rotations.""" + with pymupdf.open(pdf_path) as document: + rotations = [page.rotation for page in document] + try: + for page in document: + if page.rotation: + page.set_rotation(0) + page_annotations: dict[int, list[Annotation]] = {} + for annotation in annotations: + try: + page_number = int(annotation.get("page", -1)) + except (TypeError, ValueError): + logger.warning("Skipping annotation with invalid page: %r", annotation) + continue + if 0 <= page_number < len(document): + page_annotations.setdefault(page_number, []).append(annotation) + else: + logger.warning("Skipping annotation outside document pages: %r", annotation) + + for page_number, page in enumerate(document): + ordered = sorted( + page_annotations.get(page_number, []), + key=lambda item: int(item.get("z", 0)), + ) + for annotation in ordered: + annotation_type = annotation.get("type") + handler = HANDLERS.get(str(annotation_type)) + if handler is None: + logger.warning("Skipping unsupported annotation type %r", annotation_type) + continue + try: + handler(page, annotation, assets_dir) + except Exception: + logger.exception("Skipping malformed %s annotation", annotation_type) + finally: + for page, rotation in zip(document, rotations, strict=True): + if page.rotation != rotation: + page.set_rotation(rotation) + return document.tobytes(garbage=4, deflate=True) diff --git a/backend/app/services/storage.py b/backend/app/services/storage.py index d500ac9..f2b4002 100644 --- a/backend/app/services/storage.py +++ b/backend/app/services/storage.py @@ -1,53 +1,71 @@ -"""Document storage service.""" +"""Document and binary storage helpers.""" -import shutil import uuid -import pymupdf from pathlib import Path -from fastapi import UploadFile, HTTPException + +import pymupdf +from fastapi import HTTPException, UploadFile from app.config import settings -def validate_pdf(filepath: Path) -> None: - """Validate PDF magic bytes and PyMuPDF openability.""" - with open(filepath, "rb") as f: - header = f.read(5) - if header != b"%PDF-": +_COPY_CHUNK_SIZE = 1024 * 1024 + + +def validate_pdf(filepath: Path) -> int: + """Validate a PDF's magic bytes and return its page count.""" + with filepath.open("rb") as file: + if file.read(5) != b"%PDF-": raise ValueError("Not a valid PDF file (missing magic bytes)") try: - doc = pymupdf.open(filepath) - doc.close() - except Exception as e: - raise ValueError(f"Failed to open PDF with PyMuPDF: {e}") + with pymupdf.open(filepath) as document: + page_count = len(document) + except Exception as err: + raise ValueError(f"Failed to open PDF with PyMuPDF: {err}") from err + + if page_count == 0: + raise ValueError("PDF does not contain any pages") + return page_count + + +def safe_filename(filename: str | None) -> str: + """Return a display-safe basename without allowing path components.""" + name = Path(filename or "Untitled.pdf").name.strip() + return name or "Untitled.pdf" + async def save_upload_file(upload_file: UploadFile) -> tuple[str, int, int]: - """Save an uploaded file to disk and validate it.""" + """Stream an uploaded PDF to storage, enforcing the configured size limit.""" file_id = str(uuid.uuid4()) + settings.PDF_STORAGE_PATH.mkdir(parents=True, exist_ok=True) filepath = settings.PDF_STORAGE_PATH / f"{file_id}.pdf" + max_bytes = settings.MAX_UPLOAD_MB * 1024 * 1024 + total_bytes = 0 try: - with open(filepath, "wb") as f: - shutil.copyfileobj(upload_file.file, f) - except Exception as e: - if filepath.exists(): - filepath.unlink() - raise HTTPException(status_code=500, detail="Failed to save file") + with filepath.open("wb") as destination: + while chunk := upload_file.file.read(_COPY_CHUNK_SIZE): + total_bytes += len(chunk) + if total_bytes > max_bytes: + raise HTTPException(status_code=413, detail="File too large") + destination.write(chunk) + except HTTPException: + filepath.unlink(missing_ok=True) + raise + except Exception as err: + filepath.unlink(missing_ok=True) + raise HTTPException(status_code=500, detail="Failed to save file") from err - page_count = 0 try: - doc = pymupdf.open(filepath) - page_count = len(doc) - doc.close() - except Exception as e: - filepath.unlink() - raise HTTPException(status_code=400, detail=f"Failed to open PDF with PyMuPDF: {e}") - - size = filepath.stat().st_size - return file_id, size, page_count + page_count = validate_pdf(filepath) + except ValueError as err: + filepath.unlink(missing_ok=True) + raise HTTPException(status_code=400, detail=str(err)) from err + + return file_id, total_bytes, page_count + def delete_pdf_file(file_id: str) -> None: """Delete a PDF file from storage.""" filepath = settings.PDF_STORAGE_PATH / f"{file_id}.pdf" - if filepath.exists(): - filepath.unlink() + filepath.unlink(missing_ok=True) diff --git a/backend/app/services/thumbnails.py b/backend/app/services/thumbnails.py index fa50b92..cfd8da7 100644 --- a/backend/app/services/thumbnails.py +++ b/backend/app/services/thumbnails.py @@ -1,38 +1,40 @@ """Thumbnail generation service.""" import pymupdf -from pathlib import Path from app.config import settings -def generate_thumbnail(file_id: str) -> None: + +def generate_thumbnail(file_id: str) -> bool: """Generate a PNG thumbnail for the first page of a PDF.""" pdf_path = settings.PDF_STORAGE_PATH / f"{file_id}.pdf" thumb_path = settings.THUMBNAILS_PATH / f"{file_id}.png" - + if not pdf_path.exists(): - return - + return False + try: - doc = pymupdf.open(pdf_path) - if len(doc) > 0: + with pymupdf.open(pdf_path) as doc: + if len(doc) == 0: + return False page = doc[0] # Zoom to approximately 600px width rect = page.rect zoom = 600.0 / rect.width if rect.width > 0 else 1.0 mat = pymupdf.Matrix(zoom, zoom) - + # Render pixmap pix = page.get_pixmap(matrix=mat, alpha=False) - + # Save as PNG pix.save(thumb_path, output="png") - doc.close() - except Exception as e: - print(f"Failed to generate thumbnail for {file_id}: {e}") + return True + except Exception as err: + print(f"Failed to generate thumbnail for {file_id}: {err}") + return False + def delete_thumbnail(file_id: str) -> None: """Delete a thumbnail file.""" thumb_path = settings.THUMBNAILS_PATH / f"{file_id}.png" - if thumb_path.exists(): - thumb_path.unlink() + thumb_path.unlink(missing_ok=True) diff --git a/backend/app/services/trash_sweep.py b/backend/app/services/trash_sweep.py index 99c6079..13fc3b0 100644 --- a/backend/app/services/trash_sweep.py +++ b/backend/app/services/trash_sweep.py @@ -1,48 +1,50 @@ """Background tasks for sweeping trash and old versions.""" -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta + from sqlalchemy.orm import Session -from app.db import get_db -from app.models.document import Document +from app.config import settings from app.models.annotation_state import AnnotationState +from app.models.document import Document from app.models.version import Version +from app.services.assets import delete_asset_directory from app.services.storage import delete_pdf_file from app.services.thumbnails import delete_thumbnail -from app.config import settings + def sweep_trash(db: Session) -> None: """Permanently delete documents that have been in the trash past the retention period.""" - cutoff = datetime.now(timezone.utc) - timedelta(days=settings.TRASH_RETENTION_DAYS) + cutoff = datetime.now(UTC) - timedelta(days=settings.TRASH_RETENTION_DAYS) cutoff_iso = cutoff.isoformat() - - docs_to_delete = db.query(Document).filter( - Document.in_trash == True, - Document.deleted_at <= cutoff_iso - ).all() - + + docs_to_delete = ( + db.query(Document) + .filter(Document.deleted_at.is_not(None), Document.deleted_at <= cutoff_iso) + .all() + ) + for doc in docs_to_delete: # Delete files from disk delete_pdf_file(doc.id) delete_thumbnail(doc.id) - + delete_asset_directory(doc.id) + # Delete DB associations db.query(AnnotationState).filter(AnnotationState.document_id == doc.id).delete() db.query(Version).filter(Version.document_id == doc.id).delete() - + # Delete document record db.delete(doc) - + db.commit() + def prune_auto_versions(db: Session) -> None: """Delete automatic versions older than the retention period.""" - cutoff = datetime.now(timezone.utc) - timedelta(days=settings.AUTO_VERSION_RETENTION_DAYS) + cutoff = datetime.now(UTC) - timedelta(days=settings.AUTO_VERSION_RETENTION_DAYS) cutoff_iso = cutoff.isoformat() - - db.query(Version).filter( - Version.kind == "auto", - Version.created_at <= cutoff_iso - ).delete() - + + db.query(Version).filter(Version.kind == "auto", Version.created_at <= cutoff_iso).delete() + db.commit() diff --git a/backend/app/tests/test_api_workflows.py b/backend/app/tests/test_api_workflows.py new file mode 100644 index 0000000..5b48d97 --- /dev/null +++ b/backend/app/tests/test_api_workflows.py @@ -0,0 +1,121 @@ +"""End-to-end coverage for the user-critical backend workflows.""" + +import os +import shutil +import uuid +from pathlib import Path + +import pymupdf +from fastapi.testclient import TestClient + +_ROOT = Path.cwd() / ".pytest-paperjet-api" +shutil.rmtree(_ROOT, ignore_errors=True) +_ROOT.mkdir() +os.environ.update( + { + "PAPERJET_SECRET_KEY": "test-secret-key", + "PAPERJET_DATABASE_PATH": str(_ROOT / "db" / "app.sqlite"), + "PAPERJET_PDF_STORAGE_PATH": str(_ROOT / "pdfs"), + "PAPERJET_THUMBNAILS_PATH": str(_ROOT / "thumbnails"), + "PAPERJET_DEBUG": "false", + } +) + +from app.main import app # noqa: E402 + + +def _pdf_bytes() -> bytes: + document = pymupdf.open() + document.new_page(width=240, height=320) + content = document.tobytes() + document.close() + return content + + +def test_setup_upload_annotate_version_export_and_trash_restore() -> None: + csrf = {"X-Requested-With": "XMLHttpRequest"} + annotation_id = str(uuid.uuid4()) + annotation = { + "id": annotation_id, + "page": 0, + "type": "text", + "rect": {"x": 20, "y": 30, "width": 120, "height": 30}, + "rotation": 0, + "z": 0, + "props": { + "text": "Persisted note", + "fontFamily": "Liberation Sans", + "fontSize": 14, + "color": "#000000", + }, + "createdAt": "2026-08-14T00:00:00Z", + "updatedAt": "2026-08-14T00:00:00Z", + } + + with TestClient(app) as client: + assert client.get("/api/v1/health").json()["status"] == "ok" + assert client.get("/api/v1/auth/status").json()["setupRequired"] is True + + setup = client.post("/api/v1/auth/setup", json={"password": "correct horse"}, headers=csrf) + assert setup.status_code == 200 + assert client.get("/api/v1/auth/status").json()["loggedIn"] is True + + upload = client.post( + "/api/v1/documents", + files={"file": ("sample.pdf", _pdf_bytes(), "application/pdf")}, + headers=csrf, + ) + assert upload.status_code == 201 + document_id = upload.json()["id"] + + saved = client.put( + f"/api/v1/documents/{document_id}/annotations", + json={"data": [annotation]}, + headers=csrf, + ) + assert saved.status_code == 200 + assert client.get(f"/api/v1/documents/{document_id}/annotations").json()["data"] == [ + annotation + ] + + version = client.post( + f"/api/v1/documents/{document_id}/versions", + json={"label": "Before export"}, + headers=csrf, + ) + assert version.status_code == 201 + version_id = version.json()["id"] + + changed = {**annotation, "props": {**annotation["props"], "text": "Changed"}} + client.put( + f"/api/v1/documents/{document_id}/annotations", + json={"data": [changed]}, + headers=csrf, + ) + restored = client.post( + f"/api/v1/documents/{document_id}/versions/{version_id}/restore", + headers=csrf, + ) + assert restored.status_code == 200 + assert client.get(f"/api/v1/documents/{document_id}/annotations").json()["data"] == [ + annotation + ] + + exported = client.post( + f"/api/v1/documents/{document_id}/export", + json={"flatten": True}, + headers=csrf, + ) + assert exported.status_code == 200 + with pymupdf.open(stream=exported.content, filetype="pdf") as document: + assert "Persisted note" in document[0].get_text("text") + + assert client.delete(f"/api/v1/documents/{document_id}", headers=csrf).status_code == 200 + assert client.get("/api/v1/documents").json()["total"] == 0 + assert client.get("/api/v1/documents/trash").json()["total"] == 1 + assert ( + client.post(f"/api/v1/documents/{document_id}/restore", headers=csrf).status_code == 200 + ) + assert client.get("/api/v1/documents").json()["total"] == 1 + + shutil.rmtree(_ROOT, ignore_errors=True) diff --git a/backend/app/tests/test_export.py b/backend/app/tests/test_export.py new file mode 100644 index 0000000..16711f2 --- /dev/null +++ b/backend/app/tests/test_export.py @@ -0,0 +1,121 @@ +"""Regression coverage for canonical-coordinate PDF export.""" + +import json + +import pymupdf + +from app.services.export.renderer import export_annotations + + +def _source_pdf(path) -> None: + document = pymupdf.open() + page = document.new_page(width=720, height=936) + page.set_cropbox(pymupdf.Rect(36, 72, 648, 864)) + page.set_rotation(90) + document.save(path) + document.close() + + +def test_export_preserves_rotation_and_flattens_supported_annotations(tmp_path) -> None: + source = tmp_path / "source.pdf" + _source_pdf(source) + annotations = [ + { + "id": "text", + "page": 0, + "type": "text", + "rect": {"x": 40, "y": 50, "width": 180, "height": 40}, + "props": { + "text": "Exported text", + "fontFamily": "Liberation Sans", + "fontSize": 14, + "color": "#112233", + "styles": {"0": {"0": {"fill": "#ff0000", "fontWeight": "bold"}}}, + }, + }, + { + "id": "line", + "page": 0, + "type": "draw", + "rect": {"x": 40, "y": 110, "width": 80, "height": 40}, + "props": { + "paths": [[0, 0], [80, 40]], + "strokeColor": "#ff0000", + "strokeWidth": 2, + "opacity": 1, + }, + }, + { + "id": "highlight", + "page": 0, + "type": "highlight", + "rect": {"x": 40, "y": 170, "width": 100, "height": 20}, + "props": {"color": "#ffff00", "opacity": 0.4}, + }, + { + "id": "signature", + "page": 0, + "type": "signature", + "rect": {"x": 40, "y": 220, "width": 160, "height": 50}, + "props": { + "mode": "type", + "text": "Ava", + "fontFamily": "Great Vibes", + "color": "#000000", + }, + }, + { + "id": "shape", + "page": 0, + "type": "shape", + "rect": {"x": 180, "y": 170, "width": 60, "height": 30}, + "props": {"kind": "ellipse", "strokeColor": "#0000ff", "strokeWidth": 2}, + }, + { + "id": "future", + "page": 0, + "type": "future-stamp", + "rect": {"x": 0, "y": 0, "width": 10, "height": 10}, + "props": {}, + }, + ] + + exported = export_annotations(source, annotations, tmp_path / "assets") + output = tmp_path / "exported.pdf" + output.write_bytes(exported) + + with pymupdf.open(output) as document: + page = document[0] + assert page.rotation == 90 + assert page.rect.width == 792 + assert page.rect.height == 612 + assert "Exported text" in page.get_text("text") + assert "Ava" in page.get_text("text") + + # Normalize only for inspection: the exported PDF still retains the + # original page rotation above. + page.set_rotation(0) + words = page.get_text("words") + text_word = next(word for word in words if word[4] == "Exported") + assert 35 <= text_word[0] <= 45 + assert 45 <= text_word[1] <= 60 + assert len(page.get_drawings()) >= 3 + + +def test_export_does_not_mutate_annotation_input(tmp_path) -> None: + source = tmp_path / "source.pdf" + _source_pdf(source) + annotations = [ + { + "id": "unknown", + "page": 0, + "type": "not-yet-supported", + "rect": {"x": 1, "y": 2, "width": 3, "height": 4}, + "props": {"future": True}, + } + ] + before = json.loads(json.dumps(annotations)) + + export_annotations(source, annotations, tmp_path / "assets") + + assert annotations == before diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 93831b7..6ec9e2d 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -30,12 +30,18 @@ dev = [ requires = ["setuptools>=75.0"] build-backend = "setuptools.build_meta" +[tool.setuptools.packages.find] +include = ["app*"] + [tool.ruff] target-version = "py312" line-length = 100 [tool.ruff.lint] select = ["E", "F", "W", "I", "UP", "B", "SIM", "RUF"] +# FastAPI requires dependency and multipart declarations in parameter defaults; +# B008 treats that framework idiom as a mutable-default hazard. +ignore = ["B008"] [tool.mypy] python_version = "3.12" @@ -43,6 +49,21 @@ strict = true warn_return_any = true warn_unused_configs = true +# PyMuPDF does not ship complete type information. Keep strict checking for +# application code while isolating its untyped boundary and test fixtures. +[[tool.mypy.overrides]] +module = [ + "app.services.export.renderer", + "app.services.storage", + "app.services.thumbnails", + "app.api.v1.debug", +] +disable_error_code = ["no-untyped-call", "no-any-return", "no-untyped-def"] + +[[tool.mypy.overrides]] +module = ["app.tests.*"] +disable_error_code = ["no-untyped-call", "no-any-return", "no-untyped-def", "dict-item"] + [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["app/tests"] diff --git a/docker-compose.yml b/docker-compose.yml index 4be3bb5..c8388d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ services: backend: build: ./backend environment: - - PAPERJET_SECRET_KEY=${SECRET_KEY:-change-me-in-production} + - PAPERJET_SECRET_KEY=${SECRET_KEY:?Set SECRET_KEY in .env before starting PaperJet} - PAPERJET_MAX_UPLOAD_MB=${MAX_UPLOAD_MB:-200} - PAPERJET_TRASH_RETENTION_DAYS=${TRASH_RETENTION_DAYS:-30} - PAPERJET_AUTO_VERSION_RETENTION_DAYS=${AUTO_VERSION_RETENTION_DAYS:-30} @@ -10,7 +10,7 @@ services: - PAPERJET_DATABASE_PATH=/data/db/app.sqlite - PAPERJET_PDF_STORAGE_PATH=/data/pdfs - PAPERJET_THUMBNAILS_PATH=/data/thumbnails - - PAPERJET_DEBUG=true + - PAPERJET_DEBUG=${DEBUG:-false} volumes: - pdf_storage:/data/pdfs - thumbnails:/data/thumbnails diff --git a/frontend/README.md b/frontend/README.md index 7dbf7eb..44eb366 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,73 +1,20 @@ -# React + TypeScript + Vite +# PaperJet frontend -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +This directory contains the React/Vite client for PaperJet. Run the full stack +from the repository root; the root [README](../README.md) has Docker and local +development instructions. -Currently, two official plugins are available: +## Useful commands -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, - - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) +```sh +npm ci +npm run dev # Vite with /api proxied to localhost:8000 +npm test -- --run +npm run typecheck +npm run lint +npm run build ``` -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs['recommended-typescript'], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` +The editor renders PDF pages with PDF.js and uses Fabric.js for the annotation +layer. Annotation state is persisted through the backend API; the browser does +not write PDF bytes directly. diff --git a/frontend/src/features/auth/LoginForm.tsx b/frontend/src/features/auth/LoginForm.tsx index 69665ce..10c3b3d 100644 --- a/frontend/src/features/auth/LoginForm.tsx +++ b/frontend/src/features/auth/LoginForm.tsx @@ -14,7 +14,7 @@ export const LoginForm = () => { try { await login({ password }) navigate('/') - } catch (err) { + } catch { // Error is handled by the store } } diff --git a/frontend/src/features/auth/SetupForm.tsx b/frontend/src/features/auth/SetupForm.tsx index 0bd814a..085f548 100644 --- a/frontend/src/features/auth/SetupForm.tsx +++ b/frontend/src/features/auth/SetupForm.tsx @@ -26,7 +26,7 @@ export const SetupForm = () => { try { await setup({ password }) navigate('/') - } catch (err) { + } catch { // Error is handled by the store } } diff --git a/frontend/src/features/auth/useAuth.ts b/frontend/src/features/auth/useAuth.ts index 3f34898..6f6df03 100644 --- a/frontend/src/features/auth/useAuth.ts +++ b/frontend/src/features/auth/useAuth.ts @@ -16,6 +16,17 @@ interface AuthState { clearError: () => void } +function errorMessage(reason: unknown, fallback: string) { + if (reason instanceof Error && reason.message) return reason.message; + if (typeof reason === 'object' && reason !== null && 'error' in reason) { + const error = reason.error; + if (typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string') { + return error.message; + } + } + return fallback; +} + export const useAuth = create((set) => ({ isInitialized: false, setupRequired: false, @@ -33,9 +44,9 @@ export const useAuth = create((set) => ({ isInitialized: true, isLoading: false }) - } catch (err: any) { + } catch (err: unknown) { set({ - error: err.error?.message || err.message || 'Failed to initialize', + error: errorMessage(err, 'Failed to initialize'), isLoading: false, isInitialized: true }) @@ -47,9 +58,9 @@ export const useAuth = create((set) => ({ set({ isLoading: true, error: null }) await authApi.login(data) set({ loggedIn: true, isLoading: false }) - } catch (err: any) { + } catch (err: unknown) { set({ - error: err.error?.message || err.message || 'Failed to login', + error: errorMessage(err, 'Failed to login'), isLoading: false }) throw err @@ -61,9 +72,9 @@ export const useAuth = create((set) => ({ set({ isLoading: true, error: null }) await authApi.setup(data) set({ setupRequired: false, loggedIn: true, isLoading: false }) - } catch (err: any) { + } catch (err: unknown) { set({ - error: err.error?.message || err.message || 'Failed to setup', + error: errorMessage(err, 'Failed to setup'), isLoading: false }) throw err @@ -76,9 +87,9 @@ export const useAuth = create((set) => ({ await authApi.logout() set({ loggedIn: false, isLoading: false }) window.location.href = '/login' - } catch (err: any) { + } catch (err: unknown) { set({ - error: err.error?.message || err.message || 'Failed to logout', + error: errorMessage(err, 'Failed to logout'), isLoading: false }) } diff --git a/frontend/src/features/editor/canvas/AnnotationLayer.tsx b/frontend/src/features/editor/canvas/AnnotationLayer.tsx index 5bca331..5b570ec 100644 --- a/frontend/src/features/editor/canvas/AnnotationLayer.tsx +++ b/frontend/src/features/editor/canvas/AnnotationLayer.tsx @@ -1,9 +1,9 @@ -import { useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import * as fabric from 'fabric'; import { useEditorStore } from '../store'; import { getTool } from '../../../lib/annotations/registry'; import type { ViewportParams } from '../../../lib/coords'; -import { screenToPdf } from '../../../lib/coords'; +import { screenRectToPdf } from '../../../lib/coords'; import { TextFormatToolbar } from '../toolbar/TextFormatToolbar'; interface AnnotationLayerProps { @@ -13,208 +13,201 @@ interface AnnotationLayerProps { viewportParams: ViewportParams; } +type AnnotationObject = fabric.FabricObject & { id?: string }; + export function AnnotationLayer({ pageNumber, width, height, viewportParams }: AnnotationLayerProps) { const canvasRef = useRef(null); const fabricRef = useRef(null); - - const activeToolName = useEditorStore(state => state.activeTool); - - const annotations = useEditorStore(state => state.annotations); - + const renderingIds = useRef(new Set()); + const renderGeneration = useRef(0); const latestViewportParams = useRef(viewportParams); + const previousDimensions = useRef({ width, height }); + const [canvasInstance, setCanvasInstance] = useState(null); + + const activeToolName = useEditorStore((state) => state.activeTool); + const annotations = useEditorStore((state) => state.annotations); + const selection = useEditorStore((state) => state.selection); + const draftAnnotation = useEditorStore((state) => state.draftAnnotation); + useEffect(() => { latestViewportParams.current = viewportParams; }, [viewportParams]); - // Initial setup and event binding useEffect(() => { if (!canvasRef.current) return; - + const pendingRenderIds = renderingIds.current; const canvas = new fabric.Canvas(canvasRef.current, { width, height, selection: activeToolName === 'select', + enableRetinaScaling: true, }); - - (window as any).__fabricCanvas = canvas; - - // Sync fabric modifications back to Zustand - canvas.on('object:modified', (e) => { - const obj = e.target as any; - if (obj && obj.id) { - // Find existing annotation - const ann = useEditorStore.getState().annotations.find(a => a.id === obj.id); - if (ann) { - const currentVp = latestViewportParams.current; - const pt = screenToPdf({ x: obj.left, y: obj.top }, currentVp); - - const scaleX = obj.scaleX || 1; - const scaleY = obj.scaleY || 1; - - // Box width/height in PDF space - const newWidth = (obj.width * scaleX) / (currentVp.scale * (currentVp.dpr || 1)); - const newHeight = (obj.height * scaleY) / (currentVp.scale * (currentVp.dpr || 1)); - - useEditorStore.getState().updateAnnotation(obj.id, { - rect: { ...ann.rect, x: pt.x, y: pt.y, width: newWidth, height: newHeight } - }); - } - } + fabricRef.current = canvas; + setCanvasInstance(canvas); + + canvas.on('object:modified', (event) => { + const object = event.target as AnnotationObject | undefined; + if (!object?.id) return; + const annotation = useEditorStore.getState().annotations.find((item) => item.id === object.id); + if (!annotation) return; + const bounds = object.getBoundingRect(); + useEditorStore.getState().updateAnnotation(object.id, { + rect: screenRectToPdf( + { x: bounds.left, y: bounds.top, width: bounds.width, height: bounds.height }, + latestViewportParams.current, + ), + }); }); - const updateSelection = (_e?: any) => { - const activeObj = canvas.getActiveObject() as any; - if (activeObj && activeObj.id) { - useEditorStore.getState().setSelection(activeObj.id); - } else { - useEditorStore.getState().setSelection(null); - } + const updateSelection = () => { + const activeObject = canvas.getActiveObject() as AnnotationObject | undefined; + useEditorStore.getState().setSelection(activeObject?.id ?? null); }; - canvas.on('selection:created', updateSelection); canvas.on('selection:updated', updateSelection); canvas.on('selection:cleared', updateSelection); - // Keyboard shortcut for delete - const handleKeyDown = (e: KeyboardEvent) => { - // Don't intercept if user is typing in an input field outside of canvas - if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) { - return; - } - if (e.key === 'Delete' || e.key === 'Backspace') { - const activeObj = canvas.getActiveObject() as any; - if (activeObj && activeObj.isEditing === true) { - return; - } - - const activeObjects = canvas.getActiveObjects(); - if (activeObjects && activeObjects.length > 0) { - activeObjects.forEach((obj: any) => { - if (obj.id) { - useEditorStore.getState().deleteAnnotation(obj.id); - } - }); - canvas.discardActiveObject(); - canvas.requestRenderAll(); - e.preventDefault(); - } + const handleKeyDown = (event: KeyboardEvent) => { + if (event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement) return; + if (event.key !== 'Delete' && event.key !== 'Backspace') return; + const activeObject = canvas.getActiveObject() as AnnotationObject | undefined; + if (activeObject && 'isEditing' in activeObject && activeObject.isEditing) return; + const activeObjects = canvas.getActiveObjects() as AnnotationObject[]; + if (!activeObjects.length) return; + for (const object of activeObjects) { + if (object.id) useEditorStore.getState().deleteAnnotation(object.id); } + canvas.discardActiveObject(); + canvas.requestRenderAll(); + event.preventDefault(); }; - document.addEventListener('keydown', handleKeyDown); - fabricRef.current = canvas; - return () => { document.removeEventListener('keydown', handleKeyDown); + pendingRenderIds.clear(); + renderGeneration.current += 1; canvas.dispose(); fabricRef.current = null; + setCanvasInstance(null); }; - }, []); // Run once on mount + // The canvas is created once for this page. Dimension and tool changes are + // handled by the effects below. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - const prevScaleRef = useRef(viewportParams.scale); - - // Handle dimensions and re-rendering annotations - useEffect(() => { - if (!fabricRef.current) return; - const canvas = fabricRef.current; - canvas.setDimensions({ width, height }); - - const activeObj = canvas.getActiveObject() as any; - const activeId = activeObj?.id; - - const pageAnns = annotations.filter(a => a.page === pageNumber); - const annIds = new Set(pageAnns.map(a => a.id)); - - const scaleChanged = prevScaleRef.current !== viewportParams.scale; - prevScaleRef.current = viewportParams.scale; - - // Remove objects that are no longer in annotations, OR if the zoom scale changed - canvas.getObjects().forEach((obj: any) => { - // Don't remove the active object unless it was deleted from the store, - // UNLESS the scale changed (we must recreate everything on zoom) - if (!scaleChanged && obj.id === activeId && annIds.has(activeId)) return; - - if (scaleChanged || !annIds.has(obj.id)) { - canvas.remove(obj); - } - }); - - // Add missing annotations - const canvasObjIds = new Set(canvas.getObjects().map((o: any) => o.id)); - pageAnns.forEach(ann => { - if (!scaleChanged && ann.id === activeId) return; // Skip rendering the active object - - if (!canvasObjIds.has(ann.id)) { - const tool = getTool(ann.type); - if (tool && tool.renderToFabric) { - tool.renderToFabric(ann, canvas, viewportParams); - } - } - }); - - if (scaleChanged && activeId && annIds.has(activeId)) { - const newlyRenderedActiveObj = canvas.getObjects().find((o: any) => o.id === activeId); - if (newlyRenderedActiveObj) { - canvas.setActiveObject(newlyRenderedActiveObj); - } - } - }, [width, height, annotations, pageNumber, viewportParams.scale]); - - // Handle tool activation/deactivation and event binding useEffect(() => { const canvas = fabricRef.current; if (!canvas) return; + const generation = ++renderGeneration.current; + renderingIds.current.clear(); + canvas.setDimensions({ width, height }); - // First deactivate any previous tool logic - // This is a bit tricky if we don't remember the previous tool, - // but we can just clear event listeners. - canvas.off('mouse:down'); - canvas.off('mouse:move'); - canvas.off('mouse:up'); - - canvas.selection = activeToolName === 'select'; + const pageAnnotations = annotations.filter((annotation) => annotation.page === pageNumber); + const annotationIds = new Set(pageAnnotations.map((annotation) => annotation.id)); + const activeObject = canvas.getActiveObject() as AnnotationObject | undefined; + const activeId = activeObject?.id; + const scaleChanged = previousDimensions.current.width !== width || previousDimensions.current.height !== height; + previousDimensions.current = { width, height }; - const tool = getTool(activeToolName); - if (tool) { - if (tool.onActivate) tool.onActivate(canvas); - - if (tool.onPointerDown) { - canvas.on('mouse:down', (e) => tool.onPointerDown!(e, canvas, latestViewportParams.current, pageNumber)); - } - if (tool.onPointerMove) { - canvas.on('mouse:move', (e) => tool.onPointerMove!(e, canvas, latestViewportParams.current, pageNumber)); - } - if (tool.onPointerUp) { - canvas.on('mouse:up', (e) => tool.onPointerUp!(e, canvas, latestViewportParams.current, pageNumber)); - } - if (tool.onPathCreated) { - canvas.on('path:created', (e) => tool.onPathCreated!(e, canvas, latestViewportParams.current, pageNumber)); + for (const object of canvas.getObjects() as AnnotationObject[]) { + if (!object.id || !annotationIds.has(object.id) || scaleChanged) { + canvas.remove(object); } } - return () => { - if (tool && tool.onDeactivate) { - tool.onDeactivate(canvas); - } - }; - }, [activeToolName]); + for (const annotation of pageAnnotations) { + if (annotation.id === activeId && !scaleChanged) continue; + if (canvas.getObjects().some((object) => (object as AnnotationObject).id === annotation.id)) continue; + if (renderingIds.current.has(annotation.id)) continue; + const tool = getTool(annotation.type); + if (!tool?.renderToFabric) continue; + renderingIds.current.add(annotation.id); + const objectsBeforeRender = new Set(canvas.getObjects()); + void Promise.resolve() + .then(() => tool.renderToFabric?.(annotation, canvas, viewportParams)) + .then(() => { + const addedObjects = canvas.getObjects().filter( + (object) => !objectsBeforeRender.has(object) && (object as AnnotationObject).id === annotation.id, + ); + if (generation !== renderGeneration.current) { + for (const object of addedObjects) canvas.remove(object); + return; + } + if (activeId) { + const renderedActive = canvas.getObjects().find( + (object) => (object as AnnotationObject).id === activeId, + ); + if (renderedActive) canvas.setActiveObject(renderedActive); + } + canvas.requestRenderAll(); + }) + .catch((error: unknown) => { + console.error(`Failed to render ${annotation.type} annotation`, error); + }) + .finally(() => { + renderingIds.current.delete(annotation.id); + }); + } - const selection = useEditorStore(state => state.selection); - const draftAnnotation = useEditorStore(state => state.draftAnnotation); - const isSelectedOnThisPage = annotations.find(a => a.id === selection && a.page === pageNumber); - const isDraftOnThisPage = draftAnnotation?.page === pageNumber; - const activeAnn = isDraftOnThisPage ? draftAnnotation : isSelectedOnThisPage; - const toolbarAnnotationId = activeAnn ? activeAnn.id : null; + if (activeId) { + const renderedActive = canvas.getObjects().find( + (object) => (object as AnnotationObject).id === activeId, + ); + if (renderedActive) canvas.setActiveObject(renderedActive); + } + canvas.requestRenderAll(); + }, [annotations, height, pageNumber, viewportParams, width]); + + useEffect(() => { + const canvas = fabricRef.current; + if (!canvas) return; + canvas.off('mouse:down'); + canvas.off('mouse:move'); + canvas.off('mouse:up'); + canvas.off('path:created'); + canvas.selection = activeToolName === 'select'; + + const tool = getTool(activeToolName); + if (!tool) return; + tool.onActivate?.(canvas); + if (tool.onPointerDown) { + canvas.on('mouse:down', (event) => + tool.onPointerDown?.(event, canvas, latestViewportParams.current, pageNumber), + ); + } + if (tool.onPointerMove) { + canvas.on('mouse:move', (event) => + tool.onPointerMove?.(event, canvas, latestViewportParams.current, pageNumber), + ); + } + if (tool.onPointerUp) { + canvas.on('mouse:up', (event) => + tool.onPointerUp?.(event, canvas, latestViewportParams.current, pageNumber), + ); + } + if (tool.onPathCreated) { + canvas.on('path:created', (event) => + tool.onPathCreated?.(event, canvas, latestViewportParams.current, pageNumber), + ); + } + return () => tool.onDeactivate?.(canvas); + }, [activeToolName, pageNumber]); + + const activeAnnotation = + draftAnnotation?.page === pageNumber + ? draftAnnotation + : annotations.find((annotation) => annotation.id === selection && annotation.page === pageNumber); return ( -

+
- {toolbarAnnotationId && activeAnn && ( - <> - {activeAnn.type === 'text' && } - {/* We will add ShapeControls and DrawControls here once they are implemented */} - + {activeAnnotation?.type === 'text' && canvasInstance && ( + )}
); diff --git a/frontend/src/features/editor/pages/PageRenderer.tsx b/frontend/src/features/editor/pages/PageRenderer.tsx index 1a2a27d..f7d1798 100644 --- a/frontend/src/features/editor/pages/PageRenderer.tsx +++ b/frontend/src/features/editor/pages/PageRenderer.tsx @@ -1,87 +1,127 @@ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist'; import { AnnotationLayer } from '../canvas/AnnotationLayer'; interface PageRendererProps { pdfDoc: PDFDocumentProxy; - pageNumber: number; + pageIndex: number; scale: number; dpr: number; } -export function PageRenderer({ pdfDoc, pageNumber, scale, dpr }: PageRendererProps) { - const canvasRef = useRef(null); +export function PageRenderer({ pdfDoc, pageIndex, scale, dpr }: PageRendererProps) { const [page, setPage] = useState(null); useEffect(() => { let active = true; - pdfDoc.getPage(pageNumber).then(p => { - if (active) setPage(p); + const pageNumber = pageIndex + 1; + pdfDoc.getPage(pageNumber).then((nextPage) => { + if (active) setPage(nextPage); }); - return () => { active = false; }; - }, [pdfDoc, pageNumber]); - - useEffect(() => { - if (!page || !canvasRef.current) return; - - const viewport = page.getViewport({ scale: scale * dpr }); - - const canvas = canvasRef.current; - const context = canvas.getContext('2d'); - if (!context) return; - - canvas.width = viewport.width; - canvas.height = viewport.height; - - canvas.style.width = `${viewport.width / dpr}px`; - canvas.style.height = `${viewport.height / dpr}px`; - - const renderContext = { - canvas: canvas, - viewport: viewport, - }; - - let renderTask = page.render(renderContext); - return () => { - renderTask.cancel(); + active = false; }; - }, [page, scale, dpr]); + }, [pdfDoc, pageIndex]); if (!page) { return ( -
- Loading page {pageNumber}... + Loading page {pageIndex + 1}...
); } - const baseViewport = page ? page.getViewport({ scale: 1, rotation: 0 }) : null; + const canonicalViewport = page.getViewport({ scale: 1, rotation: 0 }); + const renderedViewport = page.getViewport({ + scale: scale * dpr, + rotation: page.rotate, + }); + const cssWidth = renderedViewport.width / dpr; + const cssHeight = renderedViewport.height / dpr; return ( -
- - - {baseViewport && ( - - )} - -
- {pageNumber} + + ); +} + +interface RenderedPageProps { + page: PDFPageProxy; + pageIndex: number; + scale: number; + dpr: number; + canonicalWidth: number; + canonicalHeight: number; + renderedWidth: number; + renderedHeight: number; + cssWidth: number; + cssHeight: number; +} + +function RenderedPage({ + page, + pageIndex, + scale, + dpr, + canonicalWidth, + canonicalHeight, + renderedWidth, + renderedHeight, + cssWidth, + cssHeight, +}: RenderedPageProps) { + const viewportParams = useMemo(() => ({ + scale, + rotation: page.rotate, + canonicalWidth, + canonicalHeight, + dpr, + }), [canonicalHeight, canonicalWidth, dpr, page.rotate, scale]); + + useEffect(() => { + const canvas = document.querySelector( + `[data-paperjet-page="${pageIndex}"]`, + ); + if (!canvas) return; + + const context = canvas.getContext('2d'); + if (!context) return; + canvas.width = renderedWidth; + canvas.height = renderedHeight; + canvas.style.width = `${cssWidth}px`; + canvas.style.height = `${cssHeight}px`; + + const renderTask = page.render({ canvas, viewport: page.getViewport({ scale: scale * dpr, rotation: page.rotate }) }); + renderTask.promise.catch(() => undefined); + return () => { + renderTask.cancel(); + }; + }, [page, pageIndex, scale, dpr, renderedWidth, renderedHeight, cssWidth, cssHeight]); + + return ( +
+ + +
+ {pageIndex + 1}
); diff --git a/frontend/src/features/editor/pages/PageStack.tsx b/frontend/src/features/editor/pages/PageStack.tsx index 0dbcc4f..19d919f 100644 --- a/frontend/src/features/editor/pages/PageStack.tsx +++ b/frontend/src/features/editor/pages/PageStack.tsx @@ -8,12 +8,13 @@ interface PageStackProps { export function PageStack({ pdfDoc }: PageStackProps) { const numPages = pdfDoc.numPages; - const pages = Array.from({ length: numPages }, (_, i) => i + 1); + const pages = Array.from({ length: numPages }, (_, i) => i); const zoom = useEditorStore(state => state.zoom); - // For now, render all pages vertically. Virtualization comes in Phase 7. - const scale = zoom * 2.0; + // PDF points map directly to CSS pixels at 100%. Device pixel ratio is + // applied only to the PDF.js backing canvas, not the annotation overlay. + const scale = zoom; const dpr = window.devicePixelRatio || 1; return ( @@ -22,7 +23,7 @@ export function PageStack({ pdfDoc }: PageStackProps) { diff --git a/frontend/src/features/editor/pages/PdfDocument.tsx b/frontend/src/features/editor/pages/PdfDocument.tsx index 5caeb75..5d7d774 100644 --- a/frontend/src/features/editor/pages/PdfDocument.tsx +++ b/frontend/src/features/editor/pages/PdfDocument.tsx @@ -4,50 +4,61 @@ import { PageStack } from './PageStack'; pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( 'pdfjs-dist/build/pdf.worker.mjs', - import.meta.url + import.meta.url, ).toString(); +interface LoadedDocument { + id: string; + document: pdfjsLib.PDFDocumentProxy; +} + +interface DocumentError { + id: string; + message: string; +} + export function PdfDocument({ documentId }: { documentId: string }) { - const [pdfDoc, setPdfDoc] = useState(null); - const [error, setError] = useState(null); - + const [loaded, setLoaded] = useState(null); + const [error, setError] = useState(null); + useEffect(() => { let active = true; - const url = `/api/v1/documents/${documentId}/file`; - - const loadingTask = pdfjsLib.getDocument({ url }); - - loadingTask.promise.then((doc) => { - if (active) setPdfDoc(doc); - }).catch(err => { - console.error('Failed to load PDF', err); - if (active) setError(err.message); + const loadingTask = pdfjsLib.getDocument({ url: `/api/v1/documents/${documentId}/file` }); + + loadingTask.promise.then((document) => { + if (active) setLoaded({ id: documentId, document }); + }).catch((reason: unknown) => { + if (active) { + const message = reason instanceof Error ? reason.message : 'Unable to load this PDF.'; + setError({ id: documentId, message }); + } }); - + return () => { active = false; - loadingTask.destroy(); + void loadingTask.destroy(); }; }, [documentId]); - - if (error) { + + const currentError = error?.id === documentId ? error.message : null; + const currentDocument = loaded?.id === documentId ? loaded.document : null; + + if (currentError) { return ( -
-
- Error loading PDF: {error} -
+
+
Error loading PDF: {currentError}
); } - - if (!pdfDoc) { + + if (!currentDocument) { return ( -
-
-
Loading document...
+
+
+
Loading document…
); } - - return ; + + return ; } diff --git a/frontend/src/features/editor/store.test.ts b/frontend/src/features/editor/store.test.ts new file mode 100644 index 0000000..9b82b04 --- /dev/null +++ b/frontend/src/features/editor/store.test.ts @@ -0,0 +1,56 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { useEditorStore } from './store'; +import type { TextAnnotation } from '../../lib/annotations/types'; + +const annotation: TextAnnotation = { + id: 'note-1', + page: 0, + type: 'text', + rect: { x: 10, y: 20, width: 100, height: 30 }, + rotation: 0, + z: 0, + props: { + text: 'Original', + fontFamily: 'Liberation Sans', + fontSize: 14, + color: '#000000', + align: 'left', + bold: false, + italic: false, + lineHeight: 1.2, + }, + createdAt: '2026-08-14T00:00:00Z', + updatedAt: '2026-08-14T00:00:00Z', +}; + +beforeEach(() => { + useEditorStore.getState().setDocumentId(null); +}); + +describe('editor history', () => { + it('undoes and redoes annotation mutations without sharing mutable state', () => { + const store = useEditorStore.getState(); + store.setDocumentId('document-1'); + store.addAnnotation(annotation); + store.updateAnnotation('note-1', { props: { ...annotation.props, text: 'Updated' } }); + + expect(useEditorStore.getState().annotations[0].props).toMatchObject({ text: 'Updated' }); + useEditorStore.getState().undo(); + expect(useEditorStore.getState().annotations[0].props).toMatchObject({ text: 'Original' }); + useEditorStore.getState().redo(); + expect(useEditorStore.getState().annotations[0].props).toMatchObject({ text: 'Updated' }); + }); + + it('clears working state and history when switching documents', () => { + const store = useEditorStore.getState(); + store.setDocumentId('document-1'); + store.addAnnotation(annotation); + store.setDocumentId('document-2'); + + const next = useEditorStore.getState(); + expect(next.documentId).toBe('document-2'); + expect(next.annotations).toEqual([]); + expect(next.past).toEqual([]); + expect(next.future).toEqual([]); + }); +}); diff --git a/frontend/src/features/editor/store.ts b/frontend/src/features/editor/store.ts index 302e385..4e316c4 100644 --- a/frontend/src/features/editor/store.ts +++ b/frontend/src/features/editor/store.ts @@ -1,74 +1,171 @@ import { create } from 'zustand'; -import type { Annotation, TextProps } from '../../lib/annotations/types'; +import type { + Annotation, + SignatureDrawProps, + SignatureTypeProps, + TextProps, +} from '../../lib/annotations/types'; -export type SaveStatus = 'idle' | 'saving' | 'saved' | 'error'; +export type SaveStatus = 'idle' | 'loading' | 'saving' | 'saved' | 'error'; +type SignatureProps = SignatureDrawProps | SignatureTypeProps; +type PendingImage = { ref: string; width: number; height: number }; interface EditorState { documentId: string | null; annotations: Annotation[]; - activeTool: string; + past: Annotation[][]; + future: Annotation[][]; selection: string | null; + activeTool: string; + activeShapeKind: 'rect' | 'ellipse' | 'line' | 'arrow'; zoom: number; saveStatus: SaveStatus; + annotationUpdatedAt: string | null; defaultTextProps: Partial; draftAnnotation: Annotation | null; isSignatureModalOpen: boolean; - pendingSignatureProps: any | null; - pendingImageRef: { ref: string, width: number, height: number } | null; - - // Actions + pendingSignatureProps: SignatureProps | null; + pendingImageRef: PendingImage | null; + setDocumentId: (id: string | null) => void; setAnnotations: (annotations: Annotation[]) => void; + setAnnotationUpdatedAt: (updatedAt: string | null) => void; addAnnotation: (annotation: Annotation) => void; updateAnnotation: (id: string, updates: Partial) => void; deleteAnnotation: (id: string) => void; + undo: () => void; + redo: () => void; + canUndo: () => boolean; + canRedo: () => boolean; setActiveTool: (tool: string) => void; setSelection: (id: string | null) => void; setZoom: (zoom: number) => void; setSaveStatus: (status: SaveStatus) => void; setDefaultTextProps: (props: Partial) => void; - setDraftAnnotation: (ann: Annotation | null) => void; + setDraftAnnotation: (annotation: Annotation | null) => void; setIsSignatureModalOpen: (isOpen: boolean) => void; - setPendingSignatureProps: (props: any | null) => void; - setPendingImageRef: (imgRef: { ref: string, width: number, height: number } | null) => void; - activeShapeKind: 'rect' | 'ellipse' | 'line'; - setActiveShapeKind: (kind: 'rect' | 'ellipse' | 'line') => void; + setPendingSignatureProps: (props: SignatureProps | null) => void; + setPendingImageRef: (image: PendingImage | null) => void; + setActiveShapeKind: (kind: EditorState['activeShapeKind']) => void; } -export const useEditorStore = create((set) => ({ +const MAX_HISTORY = 100; + +function cloneAnnotations(annotations: Annotation[]): Annotation[] { + return annotations.map((annotation) => ({ + ...annotation, + rect: { ...annotation.rect }, + props: structuredClone(annotation.props), + })) as Annotation[]; +} + +function withHistory(state: EditorState, annotations: Annotation[]): Partial { + return { + annotations, + past: [...state.past, cloneAnnotations(state.annotations)].slice(-MAX_HISTORY), + future: [], + }; +} + +export const useEditorStore = create((set, get) => ({ documentId: null, annotations: [], - activeTool: 'select', + past: [], + future: [], selection: null, + activeTool: 'select', + activeShapeKind: 'rect', zoom: 1, saveStatus: 'idle', + annotationUpdatedAt: null, defaultTextProps: {}, draftAnnotation: null, isSignatureModalOpen: false, pendingSignatureProps: null, pendingImageRef: null, - activeShapeKind: 'rect', - setDocumentId: (id) => set({ documentId: id, defaultTextProps: {}, draftAnnotation: null }), - setAnnotations: (annotations) => set({ annotations }), - addAnnotation: (annotation) => set((state) => ({ - annotations: [...state.annotations, annotation] - })), - updateAnnotation: (id, updates) => set((state) => ({ - annotations: state.annotations.map(a => a.id === id ? { ...a, ...updates } as Annotation : a) - })), - deleteAnnotation: (id) => set((state) => ({ - annotations: state.annotations.filter(a => a.id !== id), - selection: state.selection === id ? null : state.selection - })), + setDocumentId: (id) => + set({ + documentId: id, + annotations: [], + past: [], + future: [], + selection: null, + saveStatus: id ? 'loading' : 'idle', + annotationUpdatedAt: null, + defaultTextProps: {}, + draftAnnotation: null, + pendingSignatureProps: null, + pendingImageRef: null, + }), + setAnnotations: (annotations) => + set({ + annotations: cloneAnnotations(annotations), + past: [], + future: [], + selection: null, + draftAnnotation: null, + }), + setAnnotationUpdatedAt: (updatedAt) => set({ annotationUpdatedAt: updatedAt }), + addAnnotation: (annotation) => + set((state) => withHistory(state, cloneAnnotations([...state.annotations, annotation]))), + updateAnnotation: (id, updates) => + set((state) => { + const current = state.annotations.find((annotation) => annotation.id === id); + if (!current) return state; + const next = state.annotations.map((annotation) => + annotation.id === id + ? ({ + ...annotation, + ...updates, + props: updates.props ? { ...annotation.props, ...updates.props } : annotation.props, + updatedAt: new Date().toISOString(), + } as Annotation) + : annotation, + ); + return withHistory(state, next); + }), + deleteAnnotation: (id) => + set((state) => { + if (!state.annotations.some((annotation) => annotation.id === id)) return state; + return { + ...withHistory(state, state.annotations.filter((annotation) => annotation.id !== id)), + selection: state.selection === id ? null : state.selection, + }; + }), + undo: () => + set((state) => { + const previous = state.past.at(-1); + if (!previous) return state; + return { + annotations: cloneAnnotations(previous), + past: state.past.slice(0, -1), + future: [cloneAnnotations(state.annotations), ...state.future].slice(0, MAX_HISTORY), + selection: null, + }; + }), + redo: () => + set((state) => { + const next = state.future[0]; + if (!next) return state; + return { + annotations: cloneAnnotations(next), + past: [...state.past, cloneAnnotations(state.annotations)].slice(-MAX_HISTORY), + future: state.future.slice(1), + selection: null, + }; + }), + canUndo: () => get().past.length > 0, + canRedo: () => get().future.length > 0, setActiveTool: (tool) => set({ activeTool: tool }), setSelection: (id) => set({ selection: id }), - setZoom: (zoom) => set({ zoom }), + setZoom: (zoom) => set({ zoom: Math.max(0.5, Math.min(3, zoom)) }), setSaveStatus: (status) => set({ saveStatus: status }), - setDefaultTextProps: (props) => set((state) => ({ defaultTextProps: { ...state.defaultTextProps, ...props } })), - setDraftAnnotation: (ann) => set({ draftAnnotation: ann }), + setDefaultTextProps: (props) => + set((state) => ({ defaultTextProps: { ...state.defaultTextProps, ...props } })), + setDraftAnnotation: (annotation) => set({ draftAnnotation: annotation }), setIsSignatureModalOpen: (isOpen) => set({ isSignatureModalOpen: isOpen }), setPendingSignatureProps: (props) => set({ pendingSignatureProps: props }), - setPendingImageRef: (imgRef) => set({ pendingImageRef: imgRef }), + setPendingImageRef: (image) => set({ pendingImageRef: image }), setActiveShapeKind: (kind) => set({ activeShapeKind: kind }), })); diff --git a/frontend/src/features/editor/toolbar/EditorToolbar.tsx b/frontend/src/features/editor/toolbar/EditorToolbar.tsx index aeec619..b67c0df 100644 --- a/frontend/src/features/editor/toolbar/EditorToolbar.tsx +++ b/frontend/src/features/editor/toolbar/EditorToolbar.tsx @@ -1,161 +1,162 @@ -import { useRef, useState } from 'react'; -import { useEditorStore } from '../store'; +import { useRef, useState, type ChangeEvent } from 'react'; +import { + Download, + History, + Highlighter, + ImagePlus, + Minus, + MousePointer2, + PenLine, + Redo2, + Signature, + Square, + Type, + Undo2, + ZoomIn, +} from 'lucide-react'; import { SignatureModal } from '../tools/SignatureModal'; import { api } from '../../../lib/api/client'; +import { useEditorStore } from '../store'; +import type { SignatureDrawProps, SignatureTypeProps } from '../../../lib/annotations/types'; -export function EditorToolbar() { - const { - activeTool, - setActiveTool, - saveStatus, - zoom, +interface EditorToolbarProps { + onExport: () => void; + onOpenVersions: () => void; + isExporting: boolean; +} + +interface AssetUploadResponse { + ref: string; +} + +const toolButton = 'inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-semibold transition-colors'; +const inactive = 'text-neutral-600 hover:bg-neutral-100'; +const active = 'bg-accent-100 text-accent-700'; + +export function EditorToolbar({ onExport, onOpenVersions, isExporting }: EditorToolbarProps) { + const { + activeTool, + setActiveTool, + activeShapeKind, + setActiveShapeKind, + saveStatus, + zoom, setZoom, isSignatureModalOpen, setIsSignatureModalOpen, setPendingSignatureProps, setPendingImageRef, - documentId + documentId, + past, + future, + undo, + redo, } = useEditorStore(); const fileInputRef = useRef(null); const [isUploadingImage, setIsUploadingImage] = useState(false); - const handleZoomIn = () => setZoom(Math.min(zoom + 0.25, 3)); - const handleZoomOut = () => setZoom(Math.max(zoom - 0.25, 0.5)); - - const handleImageUpload = async (e: React.ChangeEvent) => { - const file = e.target.files?.[0]; + const handleImageUpload = async (event: ChangeEvent) => { + const file = event.target.files?.[0]; if (!file || !documentId) return; - setIsUploadingImage(true); try { const formData = new FormData(); formData.append('file', file); - - const data = await api.upload(`/documents/${documentId}/assets`, formData); - - // We don't have natural width/height immediately, we'll let the tool figure it out or pass placeholders - // A better way is to read image locally to get dimensions, but we can also just let fabric.Image.fromURL do it. - // We'll pass 0 for now and let the tool set scale to max-width. + const data = await api.upload(`/documents/${documentId}/assets`, formData); setPendingImageRef({ ref: data.ref, width: 0, height: 0 }); setActiveTool('image'); - } catch (err) { - console.error(err); - alert('Failed to upload image'); + } catch (reason) { + console.error('Failed to upload image', reason); + window.alert(reason instanceof Error ? reason.message : 'Failed to upload image.'); } finally { setIsUploadingImage(false); - // Reset input if (fileInputRef.current) fileInputRef.current.value = ''; } }; - const handleSignatureConfirm = (props: any) => { + const handleSignatureConfirm = (props: SignatureDrawProps | SignatureTypeProps) => { setPendingSignatureProps(props); setIsSignatureModalOpen(false); setActiveTool('signature'); }; + const isActive = (name: string) => activeTool === name ? active : inactive; + return ( <> -
- - - - - - - - - - - - - - -
- -
- - - {Math.round(zoom * 100)}% - - -
+ + + + + + )} + + + void handleImageUpload(event)} /> -
+ + + -
- {saveStatus === 'saving' && 'Saving...'} + + + {Math.round(zoom * 100)}% + + + + + + + + {saveStatus === 'loading' && 'Loading…'} + {saveStatus === 'saving' && 'Saving…'} {saveStatus === 'saved' && 'Saved'} - {saveStatus === 'error' && Error saving} - {saveStatus === 'idle' && ''} -
+ {saveStatus === 'error' && Save failed} +
{isSignatureModalOpen && ( - setIsSignatureModalOpen(false)} onConfirm={handleSignatureConfirm} /> diff --git a/frontend/src/features/editor/toolbar/TextFormatToolbar.tsx b/frontend/src/features/editor/toolbar/TextFormatToolbar.tsx index bfdaf27..3e7dbee 100644 --- a/frontend/src/features/editor/toolbar/TextFormatToolbar.tsx +++ b/frontend/src/features/editor/toolbar/TextFormatToolbar.tsx @@ -1,4 +1,6 @@ import { useState, useRef, useEffect } from 'react'; +import * as fabric from 'fabric'; +import type { Canvas } from 'fabric'; import { useEditorStore } from '../store'; import type { TextAnnotation, TextProps } from '../../../lib/annotations/types'; import type { ViewportParams } from '../../../lib/coords'; @@ -17,6 +19,7 @@ import { interface TextFormatToolbarProps { annotationId: string; viewportParams: ViewportParams; + canvas: Canvas; } const FONTS = ['Liberation Sans', 'Outfit', 'Plus Jakarta Sans', 'Arial', 'Times New Roman', 'Courier New']; @@ -24,7 +27,7 @@ const SIZES = [6, 7, 8, 10, 12, 14, 16, 18, 24, 36, 48, 72]; const COLORS = ['#000000', '#EF4444', '#3B82F6', '#10B981', '#F59E0B', '#ffffff']; const HIGHLIGHTS = ['transparent', '#FEF08A', '#BBF7D0', '#BFDBFE', '#FBCFE8', '#000000']; -export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatToolbarProps) { +export function TextFormatToolbar({ annotationId, viewportParams, canvas }: TextFormatToolbarProps) { const { annotations, updateAnnotation, deleteAnnotation, addAnnotation, setDefaultTextProps, draftAnnotation } = useEditorStore(); const [activeDropdown, setActiveDropdown] = useState<'font' | 'size' | 'color' | 'highlight' | null>(null); @@ -51,11 +54,9 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo const top = pt.y - 48; // 48px above const left = pt.x; - const applyStyle = (styleName: string, value: any, globalPropName: keyof TextProps, globalValue?: any) => { - const canvas = (window as any).__fabricCanvas as any; - - if (canvas) { - const activeObj = canvas.getActiveObject(); + const applyStyle = (styleName: string, value: unknown, globalPropName: keyof TextProps, globalValue?: unknown) => { + const activeObj = canvas.getActiveObject() as (fabric.Textbox & { id?: string; customHeight?: number }) | undefined; + if (activeObj) { if (activeObj && activeObj.id === annotationId) { const isStructural = styleName === 'fontSize' || styleName === 'fontFamily'; @@ -81,7 +82,7 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo activeObj.styles = {}; if (activeObj.hiddenTextarea) { if (styleName === 'fontSize') activeObj.hiddenTextarea.style.fontSize = `${value}px`; - if (styleName === 'fontFamily') activeObj.hiddenTextarea.style.fontFamily = value; + if (styleName === 'fontFamily') activeObj.hiddenTextarea.style.fontFamily = String(value); } } } else { @@ -100,7 +101,7 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo for (const line in activeObj.styles) { for (const char in activeObj.styles[line]) { if (activeObj.styles[line][char]) { - delete activeObj.styles[line][char][styleName]; + delete (activeObj.styles[line][char] as Record)[styleName]; } } } @@ -110,8 +111,8 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo // Critical: Fabric 7 heavily caches text. We MUST mark it dirty to force a redraw! activeObj.dirty = true; - if ((activeObj as any)._forceClearCache !== undefined) { - (activeObj as any)._forceClearCache = true; + if ('_forceClearCache' in activeObj) { + (activeObj as typeof activeObj & { _forceClearCache?: boolean })._forceClearCache = true; } // Remove manual height constraint so the box can grow with the new font size @@ -123,7 +124,7 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo } const finalGlobalValue = globalValue !== undefined ? globalValue : value; - const newProps = { [globalPropName]: finalGlobalValue } as any; + const newProps = { [globalPropName]: finalGlobalValue } as Partial; setDefaultTextProps(newProps); // Always update store so the toolbar displays the new value @@ -154,12 +155,9 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo const handleDelete = () => { if (isDraft) { useEditorStore.getState().setDraftAnnotation(null); - const canvas = (window as any).__fabricCanvas as any; - if (canvas) { - const activeObj = canvas.getActiveObject(); - if (activeObj && activeObj.id === annotationId) { - canvas.remove(activeObj); - } + const activeObj = canvas.getActiveObject(); + if (activeObj && (activeObj as fabric.FabricObject & { id?: string }).id === annotationId) { + canvas.remove(activeObj); } } else { deleteAnnotation(annotationId); @@ -220,7 +218,7 @@ export function TextFormatToolbar({ annotationId, viewportParams }: TextFormatTo diff --git a/frontend/src/features/editor/tools/DrawTool.ts b/frontend/src/features/editor/tools/DrawTool.ts index ab94d10..1e1dfe8 100644 --- a/frontend/src/features/editor/tools/DrawTool.ts +++ b/frontend/src/features/editor/tools/DrawTool.ts @@ -6,6 +6,12 @@ import type { Annotation, DrawAnnotation, DrawProps } from '../../../lib/annotat import { screenRectToPdf, pdfRectToScreen } from '../../../lib/coords'; import type { ViewportParams } from '../../../lib/coords'; +type FabricAnnotationObject = fabric.FabricObject & { + id?: string; + annotationType?: string; + annotationProps?: DrawProps; +}; + export const DrawTool: ToolHandler = { name: 'draw', @@ -21,7 +27,7 @@ export const DrawTool: ToolHandler = { canvas.isDrawingMode = false; }, - onPathCreated: (e: any, _canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { + onPathCreated: (e: fabric.CanvasEvents['path:created'], _canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { const pathObj = e.path as fabric.Path; pathObj.set({ @@ -33,27 +39,16 @@ export const DrawTool: ToolHandler = { padding: 5, }); - (pathObj as any).id = uuidv4(); - (pathObj as any).annotationType = 'draw'; + const annotatedPath = pathObj as FabricAnnotationObject; + annotatedPath.id = uuidv4(); + annotatedPath.annotationType = 'draw'; - // The path data is stored in `pathObj.path` array of commands, e.g. [['M', x, y], ['Q', cx, cy, x, y]] - // We can serialize it via pathObj.toObject().path or complexPathToString(pathObj.path) - // fabric 7 has toObject().path or you can just rely on the object's serialization - - // Convert paths to string representation + // Keep the SVG path for faithful browser re-rendering and also store a + // canonical point list for the server export renderer. const pathStr = Array.isArray(pathObj.path) ? pathObj.path.map(cmd => cmd.join(' ')).join(' ') : pathObj.path; - const props: DrawProps = { - paths: [], // we ignore points array for now and use svgPath - svgPath: pathStr as string, - strokeColor: pathObj.stroke as string, - strokeWidth: pathObj.strokeWidth, - opacity: pathObj.opacity - }; - (pathObj as any).annotationProps = props; - const bounds = pathObj.getBoundingRect(); const pdfRect = screenRectToPdf({ x: bounds.left, @@ -61,9 +56,36 @@ export const DrawTool: ToolHandler = { width: bounds.width, height: bounds.height }, vp); + const rawPoints = Array.isArray(pathObj.path) + ? pathObj.path.flatMap((command) => { + const values = command.slice(1).filter((value): value is number => typeof value === 'number'); + const points: [number, number][] = []; + for (let index = 0; index + 1 < values.length; index += 2) { + points.push([values[index], values[index + 1]]); + } + return points; + }) + : []; + const minX = rawPoints.length ? Math.min(...rawPoints.map(([x]) => x)) : 0; + const maxX = rawPoints.length ? Math.max(...rawPoints.map(([x]) => x)) : 1; + const minY = rawPoints.length ? Math.min(...rawPoints.map(([, y]) => y)) : 0; + const maxY = rawPoints.length ? Math.max(...rawPoints.map(([, y]) => y)) : 1; + const sourceWidth = Math.max(maxX - minX, 1e-6); + const sourceHeight = Math.max(maxY - minY, 1e-6); + const props: DrawProps = { + paths: rawPoints.map(([x, y]) => [ + ((x - minX) / sourceWidth) * pdfRect.width, + ((y - minY) / sourceHeight) * pdfRect.height, + ]), + svgPath: pathStr as string, + strokeColor: pathObj.stroke as string, + strokeWidth: pathObj.strokeWidth, + opacity: pathObj.opacity, + }; + annotatedPath.annotationProps = props; const annotation: DrawAnnotation = { - id: (pathObj as any).id, + id: annotatedPath.id as string, page: pageNumber, type: 'draw', rect: pdfRect, @@ -81,7 +103,7 @@ export const DrawTool: ToolHandler = { }, renderToFabric: async (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { - if (annotation.type !== 'draw') return null; + if (annotation.type !== 'draw') return; const drawAnn = annotation as DrawAnnotation; const props = drawAnn.props as DrawProps; const screenRect = pdfRectToScreen(drawAnn.rect, vp); @@ -103,6 +125,8 @@ export const DrawTool: ToolHandler = { pathObj.set({ left: screenRect.x, top: screenRect.y, + originX: 'left', + originY: 'top', scaleX: screenRect.width / pathObj.width!, scaleY: screenRect.height / pathObj.height!, }); @@ -111,6 +135,8 @@ export const DrawTool: ToolHandler = { pathObj = new fabric.Path('M 0 0', { left: screenRect.x, top: screenRect.y, + originX: 'left', + originY: 'top', width: screenRect.width, height: screenRect.height, stroke: props.strokeColor || '#000000', @@ -118,17 +144,18 @@ export const DrawTool: ToolHandler = { }); } + const annotatedPath = pathObj as FabricAnnotationObject; + annotatedPath.id = drawAnn.id; + annotatedPath.annotationType = 'draw'; + annotatedPath.annotationProps = drawAnn.props; pathObj.set({ - id: drawAnn.id, - annotationType: 'draw', - annotationProps: drawAnn.props, transparentCorners: false, cornerColor: '#3b82f6', cornerStrokeColor: '#3b82f6', borderColor: '#3b82f6', cornerSize: 8, padding: 5, - } as any); + }); canvas.add(pathObj); } diff --git a/frontend/src/features/editor/tools/HighlightTool.ts b/frontend/src/features/editor/tools/HighlightTool.ts new file mode 100644 index 0000000..0827a51 --- /dev/null +++ b/frontend/src/features/editor/tools/HighlightTool.ts @@ -0,0 +1,120 @@ +import * as fabric from 'fabric'; +import { v4 as uuidv4 } from 'uuid'; +import { useEditorStore } from '../store'; +import type { ToolHandler } from '../../../lib/annotations/registry'; +import type { Annotation, HighlightAnnotation, HighlightProps } from '../../../lib/annotations/types'; +import { pdfRectToScreen, screenRectToPdf } from '../../../lib/coords'; +import type { ViewportParams } from '../../../lib/coords'; + +type PointerEvent = fabric.TPointerEventInfo; +type Draft = { object: fabric.Rect; start: { x: number; y: number } }; +const drafts = new WeakMap(); + +function point(event: PointerEvent, canvas: fabric.Canvas) { + return event.scenePoint ?? canvas.getScenePoint(event.e); +} + +function configure(object: fabric.Rect) { + object.set({ + originX: 'left', + originY: 'top', + fill: '#facc15', + opacity: 0.35, + stroke: undefined, + transparentCorners: false, + cornerColor: '#3b82f6', + cornerStrokeColor: '#3b82f6', + borderColor: '#3b82f6', + cornerSize: 8, + }); +} + +export const HighlightTool: ToolHandler = { + name: 'highlight', + onActivate: (canvas) => { + canvas.defaultCursor = 'crosshair'; + canvas.selection = false; + }, + onDeactivate: (canvas) => { + const draft = drafts.get(canvas); + if (draft) canvas.remove(draft.object); + drafts.delete(canvas); + canvas.defaultCursor = 'default'; + }, + onPointerDown: (event: PointerEvent, canvas) => { + if (event.target) return; + const start = point(event, canvas); + const object = new fabric.Rect({ left: start.x, top: start.y, width: 0, height: 0 }); + configure(object); + drafts.set(canvas, { object, start }); + canvas.add(object); + }, + onPointerMove: (event: PointerEvent, canvas) => { + const draft = drafts.get(canvas); + if (!draft) return; + const current = point(event, canvas); + draft.object.set({ + left: Math.min(draft.start.x, current.x), + top: Math.min(draft.start.y, current.y), + width: Math.abs(current.x - draft.start.x), + height: Math.abs(current.y - draft.start.y), + }); + draft.object.setCoords(); + canvas.requestRenderAll(); + }, + onPointerUp: (event: PointerEvent, canvas, vp: ViewportParams, pageNumber) => { + const draft = drafts.get(canvas); + if (!draft) return; + const current = point(event, canvas); + draft.object.set({ + left: Math.min(draft.start.x, current.x), + top: Math.min(draft.start.y, current.y), + width: Math.abs(current.x - draft.start.x), + height: Math.abs(current.y - draft.start.y), + }); + draft.object.setCoords(); + const bounds = draft.object.getBoundingRect(); + drafts.delete(canvas); + if (bounds.width < 2 || bounds.height < 2) { + canvas.remove(draft.object); + return; + } + const id = uuidv4(); + draft.object.set({ id }); + const props: HighlightProps = { color: '#facc15', opacity: 0.35 }; + useEditorStore.getState().addAnnotation({ + id, + page: pageNumber, + type: 'highlight', + rect: screenRectToPdf( + { x: bounds.left, y: bounds.top, width: bounds.width, height: bounds.height }, + vp, + ), + rotation: 0, + z: 0, + props, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + } as HighlightAnnotation); + canvas.setActiveObject(draft.object); + canvas.requestRenderAll(); + }, + renderToFabric: (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { + if (annotation.type !== 'highlight') return; + const highlight = annotation as HighlightAnnotation; + const rect = pdfRectToScreen(highlight.rect, vp); + const object = new fabric.Rect({ + left: rect.x, + top: rect.y, + width: rect.width, + height: rect.height, + }); + configure(object); + object.set({ + id: highlight.id, + fill: highlight.props.color, + opacity: highlight.props.opacity, + }); + canvas.add(object); + }, +}; diff --git a/frontend/src/features/editor/tools/ImageTool.ts b/frontend/src/features/editor/tools/ImageTool.ts index 1bb4da0..9d791a3 100644 --- a/frontend/src/features/editor/tools/ImageTool.ts +++ b/frontend/src/features/editor/tools/ImageTool.ts @@ -6,6 +6,12 @@ import type { Annotation, ImageAnnotation, ImageProps } from '../../../lib/annot import { screenRectToPdf, pdfRectToScreen } from '../../../lib/coords'; import type { ViewportParams } from '../../../lib/coords'; +type FabricAnnotationObject = fabric.FabricObject & { + id?: string; + annotationType?: string; + annotationProps?: ImageProps; +}; + export const ImageTool: ToolHandler = { name: 'image', @@ -18,7 +24,7 @@ export const ImageTool: ToolHandler = { canvas.defaultCursor = 'default'; }, - onPointerDown: async (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { + onPointerDown: async (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { if (e.target) return; const storeState = useEditorStore.getState(); @@ -45,8 +51,8 @@ export const ImageTool: ToolHandler = { img.set({ left: pointer.x, top: pointer.y, - originX: 'center', - originY: 'center', + originX: 'left', + originY: 'top', transparentCorners: false, cornerColor: '#3b82f6', cornerStrokeColor: '#3b82f6', @@ -55,15 +61,16 @@ export const ImageTool: ToolHandler = { padding: 5, }); - (img as any).id = uuidv4(); - (img as any).annotationType = 'image'; + const annotatedImage = img as FabricAnnotationObject; + annotatedImage.id = uuidv4(); + annotatedImage.annotationType = 'image'; const props: ImageProps = { ref: pendingImage.ref, naturalWidth: pendingImage.width, naturalHeight: pendingImage.height }; - (img as any).annotationProps = props; + annotatedImage.annotationProps = props; canvas.add(img); canvas.setActiveObject(img); @@ -78,7 +85,7 @@ export const ImageTool: ToolHandler = { }, vp); const annotation: ImageAnnotation = { - id: (img as any).id, + id: annotatedImage.id as string, page: pageNumber, type: 'image', rect: pdfRect, @@ -97,7 +104,7 @@ export const ImageTool: ToolHandler = { }, renderToFabric: async (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { - if (annotation.type !== 'image') return null; + if (annotation.type !== 'image') return; const imgAnn = annotation as ImageAnnotation; const screenRect = pdfRectToScreen(imgAnn.rect, vp); @@ -107,24 +114,27 @@ export const ImageTool: ToolHandler = { img = await fabric.Image.fromURL(url); } catch (e) { console.error("Failed to load asset", e); - return null; + return; } + const annotatedImage = img as FabricAnnotationObject; + annotatedImage.id = imgAnn.id; + annotatedImage.annotationType = 'image'; + annotatedImage.annotationProps = imgAnn.props; img.set({ left: screenRect.x, top: screenRect.y, + originX: 'left', + originY: 'top', scaleX: screenRect.width / img.width!, scaleY: screenRect.height / img.height!, - id: imgAnn.id, - annotationType: 'image', - annotationProps: imgAnn.props, transparentCorners: false, cornerColor: '#3b82f6', cornerStrokeColor: '#3b82f6', borderColor: '#3b82f6', cornerSize: 8, padding: 5, - } as any); + }); canvas.add(img); } diff --git a/frontend/src/features/editor/tools/ShapeTool.ts b/frontend/src/features/editor/tools/ShapeTool.ts new file mode 100644 index 0000000..0e0e628 --- /dev/null +++ b/frontend/src/features/editor/tools/ShapeTool.ts @@ -0,0 +1,210 @@ +import * as fabric from 'fabric'; +import { v4 as uuidv4 } from 'uuid'; +import { useEditorStore } from '../store'; +import type { ToolHandler } from '../../../lib/annotations/registry'; +import type { Annotation, ShapeAnnotation, ShapeProps } from '../../../lib/annotations/types'; +import { pdfRectToScreen, screenRectToPdf } from '../../../lib/coords'; +import type { ViewportParams } from '../../../lib/coords'; + +type PointerEvent = fabric.TPointerEventInfo; +type Draft = { object: fabric.FabricObject; start: { x: number; y: number }; kind: ShapeProps['kind'] }; +const drafts = new WeakMap(); + +function pointer(event: PointerEvent, canvas: fabric.Canvas) { + return event.scenePoint ?? canvas.getScenePoint(event.e); +} + +function style(object: fabric.FabricObject) { + object.set({ + originX: 'left', + originY: 'top', + transparentCorners: false, + cornerColor: '#3b82f6', + cornerStrokeColor: '#3b82f6', + borderColor: '#3b82f6', + cornerSize: 8, + }); +} + +function arrowGeometry(start: { x: number; y: number }, end: { x: number; y: number }) { + const angle = Math.atan2(end.y - start.y, end.x - start.x); + const length = Math.min(12, Math.max(5, Math.hypot(end.x - start.x, end.y - start.y) * 0.2)); + const left = { + x: end.x - length * Math.cos(angle - Math.PI / 6), + y: end.y - length * Math.sin(angle - Math.PI / 6), + }; + const right = { + x: end.x - length * Math.cos(angle + Math.PI / 6), + y: end.y - length * Math.sin(angle + Math.PI / 6), + }; + const minX = Math.min(start.x, end.x, left.x, right.x); + const minY = Math.min(start.y, end.y, left.y, right.y); + const point = (value: { x: number; y: number }) => `${value.x - minX} ${value.y - minY}`; + return { + left: minX, + top: minY, + path: `M ${point(start)} L ${point(end)} M ${point(end)} L ${point(left)} M ${point(end)} L ${point(right)}`, + }; +} + +function createArrow(start: { x: number; y: number }, end: { x: number; y: number }) { + const geometry = arrowGeometry(start, end); + return new fabric.Path(geometry.path, { + left: geometry.left, + top: geometry.top, + fill: 'transparent', + stroke: '#111827', + strokeWidth: 2, + originX: 'left', + originY: 'top', + }); +} + +function createObject(kind: ShapeProps['kind'], start: { x: number; y: number }) { + const common = { left: start.x, top: start.y, fill: 'transparent', stroke: '#111827', strokeWidth: 2 }; + if (kind === 'ellipse') return new fabric.Ellipse({ ...common, rx: 0, ry: 0 }); + if (kind === 'arrow') return createArrow(start, start); + if (kind === 'line') return new fabric.Line([0, 0, 0, 0], common); + return new fabric.Rect({ ...common, width: 0, height: 0 }); +} + +function updateObject(draft: Draft, current: { x: number; y: number }, canvas: fabric.Canvas) { + const { object, start, kind } = draft; + if (kind === 'arrow') { + const replacement = createArrow(start, current); + style(replacement); + canvas.remove(object); + canvas.add(replacement); + draft.object = replacement; + return; + } + const width = current.x - start.x; + const height = current.y - start.y; + if (kind === 'line') { + object.set({ x2: width, y2: height }); + } else { + object.set({ + left: Math.min(start.x, current.x), + top: Math.min(start.y, current.y), + ...(kind === 'ellipse' + ? { rx: Math.abs(width) / 2, ry: Math.abs(height) / 2 } + : { width: Math.abs(width), height: Math.abs(height) }), + }); + } + object.setCoords(); +} + +export const ShapeTool: ToolHandler = { + name: 'shape', + onActivate: (canvas) => { + canvas.defaultCursor = 'crosshair'; + canvas.selection = false; + }, + onDeactivate: (canvas) => { + const draft = drafts.get(canvas); + if (draft) canvas.remove(draft.object); + drafts.delete(canvas); + canvas.defaultCursor = 'default'; + }, + onPointerDown: (event: PointerEvent, canvas) => { + if (event.target) return; + const start = pointer(event, canvas); + const kind = useEditorStore.getState().activeShapeKind; + const object = createObject(kind, start); + style(object); + drafts.set(canvas, { object, start, kind }); + canvas.add(object); + }, + onPointerMove: (event: PointerEvent, canvas) => { + const draft = drafts.get(canvas); + if (!draft) return; + updateObject(draft, pointer(event, canvas), canvas); + canvas.requestRenderAll(); + }, + onPointerUp: (event: PointerEvent, canvas, vp: ViewportParams, pageNumber) => { + const draft = drafts.get(canvas); + if (!draft) return; + updateObject(draft, pointer(event, canvas), canvas); + const bounds = draft.object.getBoundingRect(); + drafts.delete(canvas); + if (bounds.width < 2 && bounds.height < 2) { + canvas.remove(draft.object); + return; + } + const id = uuidv4(); + draft.object.set({ id }); + const props: ShapeProps = { + kind: draft.kind, + strokeColor: '#111827', + fillColor: 'transparent', + strokeWidth: 2, + }; + if (draft.kind === 'line' || draft.kind === 'arrow') { + const width = Math.max(bounds.width, 1); + const height = Math.max(bounds.height, 1); + const current = pointer(event, canvas); + props.start = [ + (draft.start.x - bounds.left) / width, + (draft.start.y - bounds.top) / height, + ]; + props.end = [ + (current.x - bounds.left) / width, + (current.y - bounds.top) / height, + ]; + } + useEditorStore.getState().addAnnotation({ + id, + page: pageNumber, + type: 'shape', + rect: screenRectToPdf( + { x: bounds.left, y: bounds.top, width: bounds.width, height: bounds.height }, + vp, + ), + rotation: 0, + z: 0, + props, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + } as ShapeAnnotation); + canvas.setActiveObject(draft.object); + canvas.requestRenderAll(); + }, + renderToFabric: (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { + if (annotation.type !== 'shape') return; + const shape = annotation as ShapeAnnotation; + const rect = pdfRectToScreen(shape.rect, vp); + const props = shape.props; + const common = { + fill: props.fillColor === 'transparent' ? 'transparent' : props.fillColor, + stroke: props.strokeColor, + strokeWidth: props.strokeWidth, + }; + let object: fabric.FabricObject; + if (props.kind === 'ellipse') { + object = new fabric.Ellipse({ ...common, left: rect.x, top: rect.y, rx: rect.width / 2, ry: rect.height / 2 }); + } else if (props.kind === 'line') { + const start = props.start ?? [0, 0]; + const end = props.end ?? [1, 1]; + const startPoint = { x: rect.x + start[0] * rect.width, y: rect.y + start[1] * rect.height }; + const endPoint = { x: rect.x + end[0] * rect.width, y: rect.y + end[1] * rect.height }; + const left = Math.min(startPoint.x, endPoint.x); + const top = Math.min(startPoint.y, endPoint.y); + object = new fabric.Line( + [startPoint.x - left, startPoint.y - top, endPoint.x - left, endPoint.y - top], + { ...common, left, top }, + ); + } else if (props.kind === 'arrow') { + const start = props.start ?? [0, 0]; + const end = props.end ?? [1, 1]; + const startPoint = { x: rect.x + start[0] * rect.width, y: rect.y + start[1] * rect.height }; + const endPoint = { x: rect.x + end[0] * rect.width, y: rect.y + end[1] * rect.height }; + object = createArrow(startPoint, endPoint); + object.set(common); + } else { + object = new fabric.Rect({ ...common, left: rect.x, top: rect.y, width: rect.width, height: rect.height }); + } + style(object); + object.set({ id: shape.id }); + canvas.add(object); + }, +}; diff --git a/frontend/src/features/editor/tools/SignatureModal.tsx b/frontend/src/features/editor/tools/SignatureModal.tsx index e97ba3e..b9543e8 100644 --- a/frontend/src/features/editor/tools/SignatureModal.tsx +++ b/frontend/src/features/editor/tools/SignatureModal.tsx @@ -17,6 +17,10 @@ const FONTS = [ 'Caveat' ]; +interface AssetUploadResponse { + ref: string; +} + export function SignatureModal({ onClose, onConfirm }: SignatureModalProps) { const [tab, setTab] = useState<'type' | 'draw'>('type'); const [text, setText] = useState('John Doe'); @@ -116,7 +120,7 @@ export function SignatureModal({ onClose, onConfirm }: SignatureModalProps) { const formData = new FormData(); formData.append('file', blob, 'signature.png'); - const data = await api.upload(`/documents/${documentId}/assets`, formData); + const data = await api.upload(`/documents/${documentId}/assets`, formData); onConfirm({ mode: 'draw', diff --git a/frontend/src/features/editor/tools/SignatureTool.ts b/frontend/src/features/editor/tools/SignatureTool.ts index 4fd06e6..855c075 100644 --- a/frontend/src/features/editor/tools/SignatureTool.ts +++ b/frontend/src/features/editor/tools/SignatureTool.ts @@ -6,11 +6,18 @@ import type { Annotation, SignatureAnnotation, SignatureDrawProps, SignatureType import { screenRectToPdf, pdfRectToScreen } from '../../../lib/coords'; import type { ViewportParams } from '../../../lib/coords'; +type SignatureProps = SignatureDrawProps | SignatureTypeProps; +type FabricSignatureObject = fabric.FabricObject & { + id?: string; + annotationType?: string; + annotationProps?: SignatureProps; +}; + let previewObj: fabric.FabricObject | null = null; let currentPreviewCanvas: fabric.Canvas | null = null; let isCreatingPreview = false; -const createPreview = async (canvas: fabric.Canvas, vp: ViewportParams, props: any) => { +const createPreview = async (canvas: fabric.Canvas, vp: ViewportParams, props: SignatureProps) => { isCreatingPreview = true; const storeState = useEditorStore.getState(); if (props.mode === 'draw') { @@ -23,11 +30,13 @@ const createPreview = async (canvas: fabric.Canvas, vp: ViewportParams, props: a } img.set({ originX: 'center', originY: 'center', opacity: 0.5, evented: false }); previewObj = img; - } catch (e) {} + } catch { + previewObj = null; + } } else { previewObj = new fabric.Text(props.text, { fontFamily: props.fontFamily, - fontSize: 48 * vp.scale * (vp.dpr || 1), + fontSize: 48 * vp.scale, fill: props.color, originX: 'center', originY: 'center', @@ -61,7 +70,7 @@ export const SignatureTool: ToolHandler = { isCreatingPreview = false; }, - onPointerMove: (e: any, canvas: fabric.Canvas, vp: ViewportParams, _pageNumber: number) => { + onPointerMove: (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams) => { const props = useEditorStore.getState().pendingSignatureProps; if (!props) return; @@ -86,7 +95,7 @@ export const SignatureTool: ToolHandler = { } }, - onPointerDown: async (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { + onPointerDown: async (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { if (e.target && e.target !== previewObj) return; const storeState = useEditorStore.getState(); @@ -120,7 +129,7 @@ export const SignatureTool: ToolHandler = { originY: 'center', }); // We set id on the object so it can be identified - (img as any).id = uuidv4(); + (img as FabricSignatureObject).id = uuidv4(); fabricObj = img; } catch (err) { console.error("Failed to load signature image", err); @@ -132,12 +141,12 @@ export const SignatureTool: ToolHandler = { left: pointer.x, top: pointer.y, fontFamily: typeProps.fontFamily, - fontSize: 48 * vp.scale * (vp.dpr || 1), + fontSize: 48 * vp.scale, fill: typeProps.color, originX: 'center', originY: 'center', }); - (textObj as any).id = uuidv4(); + (textObj as FabricSignatureObject).id = uuidv4(); fabricObj = textObj; } @@ -150,8 +159,9 @@ export const SignatureTool: ToolHandler = { padding: 5, }); - (fabricObj as any).annotationType = 'signature'; - (fabricObj as any).annotationProps = props; + const annotatedObject = fabricObj as FabricSignatureObject; + annotatedObject.annotationType = 'signature'; + annotatedObject.annotationProps = props; canvas.add(fabricObj); canvas.setActiveObject(fabricObj); @@ -167,7 +177,7 @@ export const SignatureTool: ToolHandler = { }, vp); const annotation: SignatureAnnotation = { - id: (fabricObj as any).id, + id: annotatedObject.id as string, page: pageNumber, type: 'signature', rect: pdfRect, @@ -186,7 +196,7 @@ export const SignatureTool: ToolHandler = { }, renderToFabric: async (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { - if (annotation.type !== 'signature') return null; + if (annotation.type !== 'signature') return; const sigAnn = annotation as SignatureAnnotation; const screenRect = pdfRectToScreen(sigAnn.rect, vp); @@ -199,19 +209,23 @@ export const SignatureTool: ToolHandler = { img.set({ left: screenRect.x, top: screenRect.y, + originX: 'left', + originY: 'top', scaleX: screenRect.width / img.width!, scaleY: screenRect.height / img.height!, }); fabricObj = img; } catch (e) { console.error("Failed to load signature asset", e); - return null; + return; } } else { const typeProps = sigAnn.props as SignatureTypeProps; fabricObj = new fabric.Text(typeProps.text, { left: screenRect.x, top: screenRect.y, + originX: 'left', + originY: 'top', fontFamily: typeProps.fontFamily, fill: typeProps.color, }); @@ -222,17 +236,18 @@ export const SignatureTool: ToolHandler = { }); } + const annotatedObject = fabricObj as FabricSignatureObject; + annotatedObject.id = sigAnn.id; + annotatedObject.annotationType = 'signature'; + annotatedObject.annotationProps = sigAnn.props; fabricObj.set({ - id: sigAnn.id, - annotationType: 'signature', - annotationProps: sigAnn.props, transparentCorners: false, cornerColor: '#3b82f6', cornerStrokeColor: '#3b82f6', borderColor: '#3b82f6', cornerSize: 8, padding: 5, - } as any); + }); canvas.add(fabricObj); } diff --git a/frontend/src/features/editor/tools/TextTool.ts b/frontend/src/features/editor/tools/TextTool.ts index a5acf4e..4fd31e0 100644 --- a/frontend/src/features/editor/tools/TextTool.ts +++ b/frontend/src/features/editor/tools/TextTool.ts @@ -3,9 +3,14 @@ import { v4 as uuidv4 } from 'uuid'; import { useEditorStore } from '../store'; import type { ToolHandler } from '../../../lib/annotations/registry'; import type { Annotation, TextAnnotation } from '../../../lib/annotations/types'; -import { screenToPdf, pdfRectToScreen } from '../../../lib/coords'; +import { pdfRectToScreen, screenRectToPdf } from '../../../lib/coords'; import type { ViewportParams } from '../../../lib/coords'; +type FabricTextObject = fabric.Textbox & { + id?: string; + customHeight?: number; +}; + export const TextTool: ToolHandler = { name: 'text', @@ -18,7 +23,7 @@ export const TextTool: ToolHandler = { canvas.defaultCursor = 'default'; }, - onPointerDown: (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { + onPointerDown: (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => { // If we clicked on an existing object, don't create a new one if (e.target) return; @@ -39,7 +44,7 @@ export const TextTool: ToolHandler = { top: pointer.y, width: 150 * vp.scale, fontFamily: fontFamily, - fontSize: fontSize * vp.scale * (vp.dpr || 1), + fontSize: fontSize * vp.scale, fontWeight: isBold ? 'bold' : 'normal', fontStyle: isItalic ? 'italic' : 'normal', fill: color, @@ -55,12 +60,13 @@ export const TextTool: ToolHandler = { }); // Allow manual height control - (textbox as any).customHeight = textbox.height; + const annotatedTextbox = textbox as FabricTextObject; + annotatedTextbox.customHeight = textbox.height; const originalInitDimensions = textbox.initDimensions.bind(textbox); textbox.initDimensions = function() { originalInitDimensions(); - if ((this as any).customHeight !== undefined) { - this.height = (this as any).customHeight; + if ((this as FabricTextObject).customHeight !== undefined) { + this.height = (this as FabricTextObject).customHeight as number; } }; @@ -94,7 +100,7 @@ export const TextTool: ToolHandler = { const w = textbox.width! * textbox.scaleX!; const h = textbox.height! * textbox.scaleY!; - (textbox as any).customHeight = h; + annotatedTextbox.customHeight = h; textbox.set({ width: w, @@ -106,24 +112,27 @@ export const TextTool: ToolHandler = { }); const newId = uuidv4(); - (textbox as any).id = newId; + annotatedTextbox.id = newId; canvas.add(textbox); canvas.setActiveObject(textbox); textbox.enterEditing(); // Add to store immediately so the toolbar shows up instantly - const pt = screenToPdf({ x: textbox.left!, y: textbox.top! }, vp); + const initialBounds = textbox.getBoundingRect(); const newAnn: TextAnnotation = { id: newId, page: pageNumber, type: 'text', - rect: { - x: pt.x, - y: pt.y, - width: textbox.width! / (vp.scale * (vp.dpr || 1)), - height: textbox.height! / (vp.scale * (vp.dpr || 1)) - }, + rect: screenRectToPdf( + { + x: initialBounds.left, + y: initialBounds.top, + width: initialBounds.width, + height: initialBounds.height, + }, + vp, + ), rotation: 0, z: 0, createdAt: new Date().toISOString(), @@ -143,41 +152,49 @@ export const TextTool: ToolHandler = { storeState.setDraftAnnotation(newAnn); textbox.on('editing:exited', () => { - // Clear draft - useEditorStore.getState().setDraftAnnotation(null); - if (!textbox.text || textbox.text.trim() === '') { + useEditorStore.getState().setDraftAnnotation(null); canvas.remove(textbox); return; } - // Get fresh annotation in case it was modified (e.g. bold/italic via toolbar) - const currentAnn = (useEditorStore.getState().annotations.find(a => a.id === newId) as TextAnnotation) || newAnn; - - // Update the text and push to main store - currentAnn.props.text = textbox.text; + const state = useEditorStore.getState(); + const currentAnn = (state.annotations.find(a => a.id === newId) as TextAnnotation | undefined) + ?? state.draftAnnotation as TextAnnotation | null + ?? newAnn; + const bounds = textbox.getBoundingRect(); + const nextAnnotation: TextAnnotation = { + ...currentAnn, + rect: screenRectToPdf( + { x: bounds.left, y: bounds.top, width: bounds.width, height: bounds.height }, + vp, + ), + props: { ...currentAnn.props, text: textbox.text }, + updatedAt: new Date().toISOString(), + }; // Save inline styles if any exist - if ((textbox as any).styles && Object.keys((textbox as any).styles).length > 0) { - currentAnn.props.styles = JSON.parse(JSON.stringify((textbox as any).styles)); + if (textbox.styles && Object.keys(textbox.styles).length > 0) { + nextAnnotation.props.styles = JSON.parse(JSON.stringify(textbox.styles)); } - useEditorStore.getState().addAnnotation(currentAnn); + state.setDraftAnnotation(null); + state.addAnnotation(nextAnnotation); }); }, renderToFabric: (annotation: Annotation, canvas: fabric.Canvas, vp: ViewportParams) => { const textAnn = annotation as TextAnnotation; const pt = pdfRectToScreen(textAnn.rect, vp); - const boxHeight = textAnn.rect.height * vp.scale * (vp.dpr || 1); + const boxHeight = textAnn.rect.height * vp.scale; const textbox = new fabric.Textbox(textAnn.props.text, { left: pt.x, top: pt.y, - width: textAnn.rect.width * vp.scale * (vp.dpr || 1), + width: textAnn.rect.width * vp.scale, height: boxHeight, fontFamily: textAnn.props.fontFamily, - fontSize: textAnn.props.fontSize * vp.scale * (vp.dpr || 1), + fontSize: textAnn.props.fontSize * vp.scale, fontWeight: textAnn.props.bold ? 'bold' : 'normal', fontStyle: textAnn.props.italic ? 'italic' : 'normal', fill: textAnn.props.color, @@ -194,12 +211,13 @@ export const TextTool: ToolHandler = { }); // Allow manual height control - (textbox as any).customHeight = boxHeight; + const annotatedTextbox = textbox as FabricTextObject; + annotatedTextbox.customHeight = boxHeight; const originalInitDimensions = textbox.initDimensions.bind(textbox); textbox.initDimensions = function() { originalInitDimensions(); - if ((this as any).customHeight !== undefined) { - this.height = (this as any).customHeight; + if ((this as FabricTextObject).customHeight !== undefined) { + this.height = (this as FabricTextObject).customHeight as number; } }; @@ -232,7 +250,7 @@ export const TextTool: ToolHandler = { const w = textbox.width! * textbox.scaleX!; const h = textbox.height! * textbox.scaleY!; - (textbox as any).customHeight = h; + annotatedTextbox.customHeight = h; textbox.set({ width: w, @@ -248,16 +266,16 @@ export const TextTool: ToolHandler = { const currentAnn = useEditorStore.getState().annotations.find(a => a.id === annotation.id) as TextAnnotation | undefined; if (!currentAnn) return; - const updates: any = { text: textbox.text }; - if ((textbox as any).styles && Object.keys((textbox as any).styles).length > 0) { - updates.styles = JSON.parse(JSON.stringify((textbox as any).styles)); + const updates: Partial = { text: textbox.text }; + if (textbox.styles && Object.keys(textbox.styles).length > 0) { + updates.styles = JSON.parse(JSON.stringify(textbox.styles)) as Record; } useEditorStore.getState().updateAnnotation(annotation.id, { props: { ...currentAnn.props, ...updates } }); }); - (textbox as any).id = annotation.id; + annotatedTextbox.id = annotation.id; canvas.add(textbox); } }; diff --git a/frontend/src/features/editor/tools/index.ts b/frontend/src/features/editor/tools/index.ts index 8e7d44d..b2979cf 100644 --- a/frontend/src/features/editor/tools/index.ts +++ b/frontend/src/features/editor/tools/index.ts @@ -3,12 +3,16 @@ import { TextTool } from './TextTool'; import { SignatureTool } from './SignatureTool'; import { ImageTool } from './ImageTool'; import { DrawTool } from './DrawTool'; +import { HighlightTool } from './HighlightTool'; +import { ShapeTool } from './ShapeTool'; // Register all tools here registerTool(TextTool); registerTool(SignatureTool); registerTool(ImageTool); registerTool(DrawTool); +registerTool(HighlightTool); +registerTool(ShapeTool); // SelectTool implementation registerTool({ diff --git a/frontend/src/features/editor/useAutosave.ts b/frontend/src/features/editor/useAutosave.ts index 5f060d6..b2d11c8 100644 --- a/frontend/src/features/editor/useAutosave.ts +++ b/frontend/src/features/editor/useAutosave.ts @@ -1,75 +1,135 @@ -import { useEffect, useRef } from 'react'; -import { useEditorStore } from './store'; +import { useCallback, useEffect, useRef } from 'react'; +import { api, ApiRequestError } from '../../lib/api/client'; import type { Annotation } from '../../lib/annotations/types'; +import { useEditorStore } from './store'; -export function useAutosave() { - const { documentId, annotations, setSaveStatus, setAnnotations } = useEditorStore(); +interface AnnotationResponse { + data: Annotation[]; + updatedAt: string; +} + +interface AnnotationUpdateResponse { + updatedAt: string; +} + +export function useAutosave(documentId: string | undefined) { + const loadedDocumentId = useRef(null); + const skipNextSave = useRef(false); const timeoutRef = useRef(null); - const isFirstLoad = useRef(true); + const saveGeneration = useRef(0); + const setDocumentId = useEditorStore((state) => state.setDocumentId); + const setAnnotations = useEditorStore((state) => state.setAnnotations); + const setAnnotationUpdatedAt = useEditorStore((state) => state.setAnnotationUpdatedAt); + const setSaveStatus = useEditorStore((state) => state.setSaveStatus); + const storeDocumentId = useEditorStore((state) => state.documentId); + const annotations = useEditorStore((state) => state.annotations); - // Initial load useEffect(() => { - if (!documentId) return; + saveGeneration.current += 1; + if (timeoutRef.current !== null) { + window.clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + setDocumentId(documentId ?? null); + loadedDocumentId.current = null; + skipNextSave.current = true; + }, [documentId, setDocumentId]); + useEffect(() => { + if (!documentId || storeDocumentId !== documentId) return; let active = true; + setSaveStatus('loading'); async function load() { try { - const res = await fetch(`/api/v1/documents/${documentId}/annotations`); - if (!res.ok) throw new Error('Failed to load annotations'); - const data = await res.json(); - - if (active) { - setAnnotations(data.data as Annotation[]); - setSaveStatus('saved'); - isFirstLoad.current = false; + const response = await api.get(`/documents/${documentId}/annotations`); + if (!active || useEditorStore.getState().documentId !== documentId) return; + skipNextSave.current = true; + setAnnotations(response.data); + setAnnotationUpdatedAt(response.updatedAt); + loadedDocumentId.current = documentId; + setSaveStatus('saved'); + } catch (error) { + if (active && useEditorStore.getState().documentId === documentId) { + console.error('Error loading annotations:', error); + setSaveStatus('error'); } - } catch (err) { - console.error('Error loading annotations:', err); - if (active) setSaveStatus('error'); } } - load(); - - return () => { active = false; }; - }, [documentId, setAnnotations, setSaveStatus]); - - // Debounced save - useEffect(() => { - // Don't save on the initial load! - if (isFirstLoad.current) return; - if (!documentId) return; + void load(); + return () => { + active = false; + }; + }, [documentId, setAnnotationUpdatedAt, setAnnotations, setSaveStatus, storeDocumentId]); + const flush = useCallback(async () => { + if (!documentId || useEditorStore.getState().documentId !== documentId || loadedDocumentId.current !== documentId) { + return false; + } + if (timeoutRef.current !== null) { + window.clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + const generation = ++saveGeneration.current; + const snapshot = useEditorStore.getState(); + const payload = { + data: snapshot.annotations, + baseUpdatedAt: snapshot.annotationUpdatedAt ?? undefined, + }; setSaveStatus('saving'); - if (timeoutRef.current) { - window.clearTimeout(timeoutRef.current); - } - - timeoutRef.current = window.setTimeout(async () => { - try { - const res = await fetch(`/api/v1/documents/${documentId}/annotations`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - 'X-Requested-With': 'XMLHttpRequest' - }, - body: JSON.stringify({ - data: annotations - }) + try { + const response = await api.put(`/documents/${documentId}/annotations`, payload) + .catch(async (error: unknown) => { + if (error instanceof ApiRequestError && error.status === 409) { + return api.put(`/documents/${documentId}/annotations`, { + data: snapshot.annotations, + }); + } + throw error; }); - - if (!res.ok) throw new Error('Failed to save'); + if (saveGeneration.current === generation && useEditorStore.getState().documentId === documentId) { + setAnnotationUpdatedAt(response.updatedAt); setSaveStatus('saved'); - } catch (err) { - console.error('Error saving annotations:', err); + } + return true; + } catch (error) { + if (saveGeneration.current === generation && useEditorStore.getState().documentId === documentId) { + console.error('Error saving annotations:', error); setSaveStatus('error'); } - }, 500); // 500ms debounce + return false; + } + }, [documentId, setAnnotationUpdatedAt, setSaveStatus]); + + useEffect(() => { + if (!documentId || storeDocumentId !== documentId || loadedDocumentId.current !== documentId) return; + if (skipNextSave.current) { + skipNextSave.current = false; + return; + } + + setSaveStatus('saving'); + if (timeoutRef.current !== null) window.clearTimeout(timeoutRef.current); + timeoutRef.current = window.setTimeout(() => { + timeoutRef.current = null; + void flush(); + }, 500); return () => { - if (timeoutRef.current) window.clearTimeout(timeoutRef.current); + saveGeneration.current += 1; + if (timeoutRef.current !== null) { + window.clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } }; - }, [annotations, documentId, setSaveStatus]); + }, [annotations, documentId, flush, setSaveStatus, storeDocumentId]); + + useEffect(() => () => { + saveGeneration.current += 1; + if (timeoutRef.current !== null) window.clearTimeout(timeoutRef.current); + }, []); + + return { flush }; } diff --git a/frontend/src/features/editor/versions/VersionPanel.tsx b/frontend/src/features/editor/versions/VersionPanel.tsx new file mode 100644 index 0000000..51b044e --- /dev/null +++ b/frontend/src/features/editor/versions/VersionPanel.tsx @@ -0,0 +1,236 @@ +import { useCallback, useEffect, useState } from 'react'; +import { Clock3, RotateCcw, Save, Trash2, X } from 'lucide-react'; +import { api } from '../../../lib/api/client'; +import type { Annotation } from '../../../lib/annotations/types'; +import { useEditorStore } from '../store'; + +interface VersionMeta { + id: string; + documentId: string; + label: string | null; + kind: 'manual' | 'auto'; + createdAt: string; + annotationCount: number; +} + +interface VersionListResponse { + items: VersionMeta[]; +} + +interface AnnotationResponse { + data: Annotation[]; + updatedAt: string; +} + +interface VersionPanelProps { + documentId: string; + onClose: () => void; +} + +function formatVersionDate(value: string) { + return new Intl.DateTimeFormat(undefined, { + dateStyle: 'medium', + timeStyle: 'short', + }).format(new Date(value)); +} + +export function VersionPanel({ documentId, onClose }: VersionPanelProps) { + const [versions, setVersions] = useState([]); + const [label, setLabel] = useState(''); + const [isLoading, setIsLoading] = useState(true); + const [busyId, setBusyId] = useState(null); + const [error, setError] = useState(null); + const setAnnotations = useEditorStore((state) => state.setAnnotations); + const setAnnotationUpdatedAt = useEditorStore((state) => state.setAnnotationUpdatedAt); + + const loadVersions = useCallback(async () => { + setIsLoading(true); + setError(null); + try { + const response = await api.get(`/documents/${documentId}/versions`); + setVersions(response.items); + } catch (reason) { + setError(reason instanceof Error ? reason.message : 'Unable to load checkpoints.'); + } finally { + setIsLoading(false); + } + }, [documentId]); + + useEffect(() => { + const timer = window.setTimeout(() => void loadVersions(), 0); + return () => window.clearTimeout(timer); + }, [loadVersions]); + + const createCheckpoint = async () => { + setBusyId('create'); + setError(null); + try { + await api.post(`/documents/${documentId}/versions`, { + label: label.trim() || null, + kind: 'manual', + }); + setLabel(''); + await loadVersions(); + } catch (reason) { + setError(reason instanceof Error ? reason.message : 'Unable to create checkpoint.'); + } finally { + setBusyId(null); + } + }; + + const restoreVersion = async (version: VersionMeta) => { + if (!window.confirm(`Restore “${version.label || 'Automatic checkpoint'}”? Your current work will be saved first.`)) { + return; + } + setBusyId(version.id); + setError(null); + try { + const restored = await api.post<{ updatedAt: string }>( + `/documents/${documentId}/versions/${version.id}/restore`, + ); + const current = await api.get(`/documents/${documentId}/annotations`); + setAnnotations(current.data); + setAnnotationUpdatedAt(restored.updatedAt || current.updatedAt); + await loadVersions(); + } catch (reason) { + setError(reason instanceof Error ? reason.message : 'Unable to restore checkpoint.'); + } finally { + setBusyId(null); + } + }; + + const deleteVersion = async (version: VersionMeta) => { + if (!window.confirm('Delete this checkpoint permanently?')) return; + setBusyId(version.id); + setError(null); + try { + await api.delete(`/documents/${documentId}/versions/${version.id}`); + setVersions((current) => current.filter((item) => item.id !== version.id)); + } catch (reason) { + setError(reason instanceof Error ? reason.message : 'Unable to delete checkpoint.'); + } finally { + setBusyId(null); + } + }; + + return ( + + ); +} diff --git a/frontend/src/features/library/DocumentGrid.tsx b/frontend/src/features/library/DocumentGrid.tsx index 7d7604b..b940699 100644 --- a/frontend/src/features/library/DocumentGrid.tsx +++ b/frontend/src/features/library/DocumentGrid.tsx @@ -6,7 +6,7 @@ import { formatDistanceToNow } from 'date-fns' import { ContextMenu } from './ContextMenu' export const DocumentGrid = ({ isTrash }: { isTrash: boolean }) => { - const { documents, selectedIds, isLoading, error, deleteDocument, restoreDocument, updateDocument } = useLibrary() + const { documents, selectedIds, isLoading, error, toggleSelection, deleteDocument, restoreDocument, updateDocument } = useLibrary() const navigate = useNavigate() const [contextMenu, setContextMenu] = useState<{ x: number, y: number, docId: string } | null>(null) @@ -61,6 +61,16 @@ export const DocumentGrid = ({ isTrash }: { isTrash: boolean }) => { isSelected ? 'border-accent-500 shadow-md ring-2 ring-accent-500/50 scale-[1.02]' : 'hover:border-accent-300 dark:hover:border-accent-700' }`} > + {isSelected && (
@@ -127,9 +137,13 @@ export const DocumentGrid = ({ isTrash }: { isTrash: boolean }) => { } } }} - onDelete={() => deleteDocument(contextMenu.docId)} + onDelete={() => { + if (window.confirm('Move this document to Trash?')) void deleteDocument(contextMenu.docId) + }} onRestore={() => restoreDocument(contextMenu.docId)} - onHardDelete={() => deleteDocument(contextMenu.docId, true)} + onHardDelete={() => { + if (window.confirm('Delete this document permanently? This cannot be undone.')) void deleteDocument(contextMenu.docId, true) + }} /> )} diff --git a/frontend/src/features/library/LibraryHeader.tsx b/frontend/src/features/library/LibraryHeader.tsx index 27a503c..62fcaca 100644 --- a/frontend/src/features/library/LibraryHeader.tsx +++ b/frontend/src/features/library/LibraryHeader.tsx @@ -94,7 +94,9 @@ export const LibraryHeader = ({ currentTab, onTabChange }: { currentTab: 'librar Restore
- - - {/* Invisible overlay that appears when dragging to prevent flickering */} - {isDragging && ( -
-
-
- - - -
-

Drop PDFs here

-

Release to upload to your library

-
-
- )} + fileInputRef.current?.click()}> +
void handleDrop(event)}> + void handleFileChange(event)} className="hidden" multiple /> - {children} -
- ) -} + {isDragging && ( +
+
+
+ + + +
+

Drop PDFs here

+

Release to upload to your library

+
+
+ )} + + {children} +
+ + ); +}; diff --git a/frontend/src/features/library/upload-context.ts b/frontend/src/features/library/upload-context.ts new file mode 100644 index 0000000..c791a87 --- /dev/null +++ b/frontend/src/features/library/upload-context.ts @@ -0,0 +1,9 @@ +import { createContext, useContext } from 'react'; + +export const UploadPickerContext = createContext<(() => void) | null>(null); + +export function useUploadPicker() { + const openPicker = useContext(UploadPickerContext); + if (!openPicker) throw new Error('useUploadPicker must be used inside UploadArea'); + return openPicker; +} diff --git a/frontend/src/features/library/useLibrary.ts b/frontend/src/features/library/useLibrary.ts index f429d95..38e2645 100644 --- a/frontend/src/features/library/useLibrary.ts +++ b/frontend/src/features/library/useLibrary.ts @@ -28,6 +28,17 @@ interface LibraryState { updateDocument: (id: string, data: DocumentUpdateRequest) => Promise } +function errorMessage(reason: unknown, fallback = 'Something went wrong.') { + if (reason instanceof Error && reason.message) return reason.message; + if (typeof reason === 'object' && reason !== null && 'error' in reason) { + const error = reason.error; + if (typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string') { + return error.message; + } + } + return fallback; +} + export const useLibrary = create((set, get) => ({ documents: [], total: 0, @@ -56,8 +67,8 @@ export const useLibrary = create((set, get) => ({ try { const data = await libraryApi.getDocuments(query) set({ documents: data.items, total: data.total, isLoading: false }) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) } }, @@ -66,8 +77,8 @@ export const useLibrary = create((set, get) => ({ try { const data = await libraryApi.getTrash() set({ documents: data.items, total: data.total, isLoading: false }) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) } }, @@ -81,8 +92,8 @@ export const useLibrary = create((set, get) => ({ isLoading: false })) return newDoc - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -97,8 +108,8 @@ export const useLibrary = create((set, get) => ({ selectedIds: new Set(Array.from(state.selectedIds).filter(sid => sid !== id)), isLoading: false })) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -113,8 +124,8 @@ export const useLibrary = create((set, get) => ({ selectedIds: new Set(Array.from(state.selectedIds).filter(sid => sid !== id)), isLoading: false })) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -138,8 +149,8 @@ export const useLibrary = create((set, get) => ({ selectedIds: new Set(), isLoading: false })) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -157,8 +168,8 @@ export const useLibrary = create((set, get) => ({ selectedIds: new Set(), isLoading: false })) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -173,8 +184,8 @@ export const useLibrary = create((set, get) => ({ selectedIds: new Set(), isLoading: false }) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } }, @@ -187,8 +198,8 @@ export const useLibrary = create((set, get) => ({ documents: state.documents.map(d => d.id === id ? updatedDoc : d), isLoading: false })) - } catch (err: any) { - set({ error: err.error?.message || err.message, isLoading: false }) + } catch (err: unknown) { + set({ error: errorMessage(err), isLoading: false }) throw err } } diff --git a/frontend/src/index.css b/frontend/src/index.css index 2848b5d..07e0507 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -6,6 +6,11 @@ @import "@fontsource/plus-jakarta-sans/500.css"; @import "@fontsource/plus-jakarta-sans/600.css"; @import "@fontsource/plus-jakarta-sans/700.css"; +@import "@fontsource/allura/400.css"; +@import "@fontsource/caveat/400.css"; +@import "@fontsource/dancing-script/400.css"; +@import "@fontsource/great-vibes/400.css"; +@import "@fontsource/sacramento/400.css"; @import "tailwindcss"; diff --git a/frontend/src/lib/annotations/registry.ts b/frontend/src/lib/annotations/registry.ts index 584752c..b50fde2 100644 --- a/frontend/src/lib/annotations/registry.ts +++ b/frontend/src/lib/annotations/registry.ts @@ -17,15 +17,19 @@ export interface ToolHandler { onDeactivate?: (canvas: Canvas) => void; /** Called when the user presses down on the canvas. */ - onPointerDown?: (e: any, canvas: Canvas, viewportParams: ViewportParams, pageNumber: number) => void; + onPointerDown?: (e: fabric.TPointerEventInfo, canvas: Canvas, viewportParams: ViewportParams, pageNumber: number) => void | Promise; /** Called when the user drags the pointer. */ - onPointerMove?: (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void; - onPointerUp?: (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void; - onPathCreated?: (e: any, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void; + onPointerMove?: (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void | Promise; + onPointerUp?: (e: fabric.TPointerEventInfo, canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void | Promise; + onPathCreated?: (e: fabric.CanvasEvents['path:created'], canvas: fabric.Canvas, vp: ViewportParams, pageNumber: number) => void | Promise; // Fabric to/from Annotation serialization - renderToFabric?: (annotation: Annotation, canvas: Canvas, viewportParams: ViewportParams) => void; + renderToFabric?: ( + annotation: Annotation, + canvas: Canvas, + viewportParams: ViewportParams, + ) => void | Promise; } const registry = new Map(); diff --git a/frontend/src/lib/annotations/types.ts b/frontend/src/lib/annotations/types.ts index be65af5..4dd7531 100644 --- a/frontend/src/lib/annotations/types.ts +++ b/frontend/src/lib/annotations/types.ts @@ -1,28 +1,125 @@ -import type { components } from '../../types/api'; +/** + * Client annotation model. + * + * The API intentionally exposes the working layer as an opaque JSON array so + * newer annotation types can round-trip through an older server. These types + * describe the v1 tools used by this client; the generated API types still + * describe the transport envelope and endpoint shapes. + */ -export type TextProps = components['schemas']['TextProps'] & { highlightColor?: string | null, styles?: Record | null }; +export interface Rect { + x: number; + y: number; + width: number; + height: number; +} -export type TextAnnotation = Omit & { +export interface AnnotationBase { + id: string; + page: number; + type: string; + rect: Rect; + rotation?: number; + z?: number; + createdAt: string; + updatedAt: string; +} + +export interface TextProps { + text: string; + fontFamily: string; + fontSize: number; + color: string; + align: 'left' | 'center' | 'right'; + bold: boolean; + italic: boolean; + lineHeight: number; + highlightColor?: string | null; + styles?: Record | null; +} + +export interface TextAnnotation extends AnnotationBase { + type: 'text'; props: TextProps; -}; -export type DrawAnnotation = components['schemas']['DrawAnnotation']; -export type SignatureAnnotation = components['schemas']['SignatureAnnotation']; -export type ImageAnnotation = components['schemas']['ImageAnnotation']; -export type HighlightAnnotation = components['schemas']['HighlightAnnotation']; -export type ShapeAnnotation = components['schemas']['ShapeAnnotation']; +} -export type Annotation = +export interface DrawProps { + paths: [number, number][]; + svgPath?: string; + strokeColor: string; + strokeWidth: number; + opacity: number; +} + +export interface DrawAnnotation extends AnnotationBase { + type: 'draw'; + props: DrawProps; +} + +export interface SignatureDrawProps { + mode: 'draw'; + ref: string; + strokeColor?: string; +} + +export interface SignatureTypeProps { + mode: 'type'; + text: string; + fontFamily: string; + color: string; +} + +export interface SignatureAnnotation extends AnnotationBase { + type: 'signature'; + props: SignatureDrawProps | SignatureTypeProps; +} + +export interface ImageProps { + ref: string; + naturalWidth: number; + naturalHeight: number; +} + +export interface ImageAnnotation extends AnnotationBase { + type: 'image'; + props: ImageProps; +} + +export interface HighlightProps { + color: string; + opacity: number; +} + +export interface HighlightAnnotation extends AnnotationBase { + type: 'highlight'; + props: HighlightProps; +} + +export interface ShapeProps { + kind: 'rect' | 'ellipse' | 'line' | 'arrow'; + strokeColor: string; + fillColor: string; + strokeWidth: number; + /** Normalized endpoints, retained for line/arrow direction. */ + start?: [number, number]; + end?: [number, number]; +} + +export interface ShapeAnnotation extends AnnotationBase { + type: 'shape'; + props: ShapeProps; +} + +export interface UnknownAnnotation extends AnnotationBase { + type: string; + props: Record; +} + +export type Annotation = | TextAnnotation | DrawAnnotation | SignatureAnnotation | ImageAnnotation | HighlightAnnotation - | ShapeAnnotation; - -export type Rect = components['schemas']['Rect']; -export type DrawProps = components['schemas']['DrawProps'] & { svgPath?: string }; -export type SignatureDrawProps = components['schemas']['SignatureDrawProps']; -export type SignatureTypeProps = components['schemas']['SignatureTypeProps']; -export type ImageProps = components['schemas']['ImageProps']; -export type HighlightProps = components['schemas']['HighlightProps']; -export type ShapeProps = components['schemas']['ShapeProps']; + | ShapeAnnotation + | UnknownAnnotation; diff --git a/frontend/src/lib/api/client.ts b/frontend/src/lib/api/client.ts index 5dc2e0c..e62504c 100644 --- a/frontend/src/lib/api/client.ts +++ b/frontend/src/lib/api/client.ts @@ -30,6 +30,21 @@ export class ApiRequestError extends Error { } } +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null; +} + +function toApiError(data: unknown, statusText: string): ApiError { + const record = isRecord(data) ? data : {}; + const nested = isRecord(record.error) ? record.error : {}; + return { + code: typeof nested.code === 'string' ? nested.code : 'unknown', + message: typeof nested.message === 'string' + ? nested.message + : typeof record.detail === 'string' ? record.detail : statusText, + }; +} + /** * Internal fetch wrapper with shared behavior. */ @@ -75,23 +90,19 @@ async function apiFetch( } // Parse response - let data: any = {} + let data: unknown = {} try { const text = await response.text() if (text) { data = JSON.parse(text) } - } catch (err) { + } catch { // If it's not JSON, we'll just fall back to the empty object } // Handle error responses if (!response.ok) { - const error: ApiError = { - code: data.error?.code ?? 'unknown', - message: data.error?.message ?? data.detail ?? response.statusText, - } - throw new ApiRequestError(response.status, error) + throw new ApiRequestError(response.status, toApiError(data, response.statusText)) } return data as T @@ -158,17 +169,15 @@ export const api = { } if (!response.ok) { - let data: any = {} + let data: unknown = {} try { const text = await response.text() if (text) data = JSON.parse(text) - } catch (err) {} - - const error: ApiError = { - code: data.error?.code ?? 'unknown', - message: data.error?.message ?? data.detail ?? response.statusText, + } catch { + data = {} } - throw new ApiRequestError(response.status, error) + + throw new ApiRequestError(response.status, toApiError(data, response.statusText)) } return response.blob() diff --git a/frontend/src/lib/coords.test.ts b/frontend/src/lib/coords.test.ts index 0d4f37a..7e44e79 100644 --- a/frontend/src/lib/coords.test.ts +++ b/frontend/src/lib/coords.test.ts @@ -92,4 +92,16 @@ describe('Coordinate Transforms', () => { expect(blS.x).toBeCloseTo(0, 2); expect(blS.y).toBeCloseTo(0, 2); }); + + it('keeps CSS geometry independent from device pixel ratio', () => { + const standard = pdfToScreen( + { x: 120, y: 180 }, + { scale: 1.5, rotation: 0, canonicalWidth: W, canonicalHeight: H, dpr: 1 }, + ); + const retina = pdfToScreen( + { x: 120, y: 180 }, + { scale: 1.5, rotation: 0, canonicalWidth: W, canonicalHeight: H, dpr: 2 }, + ); + expect(retina).toEqual(standard); + }); }); diff --git a/frontend/src/lib/coords.ts b/frontend/src/lib/coords.ts index 701d530..90bb824 100644 --- a/frontend/src/lib/coords.ts +++ b/frontend/src/lib/coords.ts @@ -5,19 +5,18 @@ export interface PdfRect { x: number; y: number; width: number; height: number } export interface ScreenRect { x: number; y: number; width: number; height: number } export interface ViewportParams { - scale: number; // CSS Zoom level (1.0 = 100%) + scale: number; // CSS zoom level (1.0 = 100%) rotation: number; // 0, 90, 180, 270 (clockwise) canonicalWidth: number; // Unrotated CropBox width in PDF points canonicalHeight: number;// Unrotated CropBox height in PDF points - dpr?: number; // Device Pixel Ratio (defaults to 1) -} - -function getEffectiveScale(vp: ViewportParams): number { - return vp.scale * (vp.dpr || 1); + dpr?: number; // Backing-store density; never part of CSS geometry } export function pdfToScreen(p: PdfPoint, vp: ViewportParams): ScreenPoint { - const s = getEffectiveScale(vp); + // Screen points are CSS pixels. Device-pixel-ratio only controls the PDF.js + // backing canvas; including it here would make Fabric objects overflow the + // CSS overlay on retina displays. + const s = vp.scale; const { rotation, canonicalWidth: W, canonicalHeight: H } = vp; const { x, y } = p; @@ -33,7 +32,7 @@ export function pdfToScreen(p: PdfPoint, vp: ViewportParams): ScreenPoint { } export function screenToPdf(p: ScreenPoint, vp: ViewportParams): PdfPoint { - const s = getEffectiveScale(vp); + const s = vp.scale; const { rotation, canonicalWidth: W, canonicalHeight: H } = vp; const sx = p.x / s; const sy = p.y / s; diff --git a/frontend/src/pages/EditorPage.tsx b/frontend/src/pages/EditorPage.tsx index 11579dd..a4f5094 100644 --- a/frontend/src/pages/EditorPage.tsx +++ b/frontend/src/pages/EditorPage.tsx @@ -1,61 +1,113 @@ -import { useParams, Link } from 'react-router-dom' -import { useEffect } from 'react' -import { PdfDocument } from '../features/editor/pages/PdfDocument' -import { EditorToolbar } from '../features/editor/toolbar/EditorToolbar' -import { useEditorStore } from '../features/editor/store' -import { useAutosave } from '../features/editor/useAutosave' -import '../features/editor/tools' +import { useCallback, useEffect, useState } from 'react'; +import { Link, useParams } from 'react-router-dom'; +import { api } from '../lib/api/client'; +import { PdfDocument } from '../features/editor/pages/PdfDocument'; +import { EditorToolbar } from '../features/editor/toolbar/EditorToolbar'; +import { VersionPanel } from '../features/editor/versions/VersionPanel'; +import { useEditorStore } from '../features/editor/store'; +import { useAutosave } from '../features/editor/useAutosave'; +import '../features/editor/tools'; + +interface DocumentSummary { + title: string; +} -/** - * Editor page — PDF canvas workspace. - */ export function EditorPage() { - const { id } = useParams<{ id: string }>() - const { setDocumentId } = useEditorStore() - useAutosave() + const { id } = useParams<{ id: string }>(); + const [title, setTitle] = useState('Untitled document'); + const [isExporting, setIsExporting] = useState(false); + const [exportError, setExportError] = useState(null); + const [isVersionPanelOpen, setIsVersionPanelOpen] = useState(false); + const undo = useEditorStore((state) => state.undo); + const redo = useEditorStore((state) => state.redo); + + const { flush } = useAutosave(id); useEffect(() => { - if (id) { - setDocumentId(id) - } - }, [id, setDocumentId]) + if (!id) return; + let active = true; + void api.get(`/documents/${id}`).then((document) => { + if (active) setTitle(document.title); + }).catch(() => { + if (active) setTitle('Untitled document'); + }); + return () => { + active = false; + }; + }, [id]); - if (!id) return
Invalid document ID
+ useEffect(() => { + const handleHistoryShortcut = (event: KeyboardEvent) => { + const target = event.target; + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || (target instanceof HTMLElement && target.isContentEditable)) { + return; + } + if (!(event.metaKey || event.ctrlKey) || event.key.toLowerCase() !== 'z') return; + event.preventDefault(); + if (event.shiftKey) redo(); + else undo(); + }; + document.addEventListener('keydown', handleHistoryShortcut); + return () => document.removeEventListener('keydown', handleHistoryShortcut); + }, [redo, undo]); + + const handleExport = useCallback(async () => { + if (!id) return; + setIsExporting(true); + setExportError(null); + try { + if (document.activeElement instanceof HTMLElement) document.activeElement.blur(); + await new Promise((resolve) => window.setTimeout(resolve, 0)); + const saved = await flush(); + if (!saved && useEditorStore.getState().saveStatus === 'loading') { + throw new Error('Please wait for the annotation layer to finish loading.'); + } + const blob = await api.fetchBlob(`/documents/${id}/export`, { + method: 'POST', + body: JSON.stringify({ flatten: true }), + }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = title.toLowerCase().endsWith('.pdf') ? title : `${title}.pdf`; + document.body.appendChild(link); + link.click(); + link.remove(); + window.setTimeout(() => URL.revokeObjectURL(url), 1000); + } catch (reason) { + const message = reason instanceof Error ? reason.message : 'Unable to export this PDF.'; + setExportError(message); + } finally { + setIsExporting(false); + } + }, [flush, id, title]); + + if (!id) return
Invalid document ID.
; return ( -
- {/* Editor toolbar */} -
-
- +
+
+
+ ← Back - - Document {id} - +
+ {title}
-
- - - Saved - -
- {/* Main workspace area */} -
- +
+ void handleExport()} onOpenVersions={() => setIsVersionPanelOpen(true)} isExporting={isExporting} /> -
+ + + {isVersionPanelOpen && setIsVersionPanelOpen(false)} />}
- ) + ); } diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx index 11d9149..9b20c3c 100644 --- a/frontend/src/pages/HomePage.tsx +++ b/frontend/src/pages/HomePage.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' import { LibraryHeader } from '../features/library/LibraryHeader' -import { UploadArea } from '../features/library/UploadArea' +import { UploadArea, UploadTrigger } from '../features/library/UploadArea' import { DocumentGrid } from '../features/library/DocumentGrid' import { useLibrary } from '../features/library/useLibrary' @@ -38,26 +38,12 @@ export function HomePage() {

Upload any PDF to instantly annotate, sign, and modify it. Drop your files right here to get started.

- +
{/* Visual Graphic */} diff --git a/frontend/src/types/api.d.ts b/frontend/src/types/api.d.ts index 2f33baf..0d449e2 100644 --- a/frontend/src/types/api.d.ts +++ b/frontend/src/types/api.d.ts @@ -272,6 +272,46 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/documents/{id}/assets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Upload Asset + * @description Upload a PNG, JPEG, GIF, or WebP annotation asset. + */ + post: operations["upload_asset_api_v1_documents__id__assets_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{id}/assets/{ref}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Asset + * @description Serve an annotation asset to an authenticated session. + */ + get: operations["get_asset_api_v1_documents__id__assets__ref__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/documents/{document_id}/annotations": { parameters: { query?: never; @@ -290,6 +330,79 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/documents/{document_id}/versions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List Versions */ + get: operations["list_versions_api_v1_documents__document_id__versions_get"]; + put?: never; + /** Create Version */ + post: operations["create_version_api_v1_documents__document_id__versions_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/versions/{version_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get Version */ + get: operations["get_version_api_v1_documents__document_id__versions__version_id__get"]; + put?: never; + post?: never; + /** Delete Version */ + delete: operations["delete_version_api_v1_documents__document_id__versions__version_id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/versions/{version_id}/restore": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Restore Version */ + post: operations["restore_version_api_v1_documents__document_id__versions__version_id__restore_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/export": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Export Document + * @description Export the working layer or a selected version as a downloadable PDF. + */ + post: operations["export_document_api_v1_documents__document_id__export_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/health": { parameters: { query?: never; @@ -310,28 +423,6 @@ export interface paths { patch?: never; trace?: never; }; - "/api/v1/debug/verify-coords": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Verify Coords - * @description Test endpoint for cross-engine coordinate verification. - * Takes a canonical rect, draws it on the PDF using PyMuPDF, - * and returns the flattened PDF. - */ - post: operations["verify_coords_api_v1_debug_verify_coords_post"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { @@ -339,7 +430,9 @@ export interface components { /** AnnotationStateResponse */ AnnotationStateResponse: { /** Data */ - data: (components["schemas"]["TextAnnotation"] | components["schemas"]["DrawAnnotation"] | components["schemas"]["SignatureAnnotation"] | components["schemas"]["ImageAnnotation"] | components["schemas"]["HighlightAnnotation"] | components["schemas"]["ShapeAnnotation"])[]; + data: { + [key: string]: unknown; + }[]; /** * Updatedat * Format: date-time @@ -349,7 +442,9 @@ export interface components { /** AnnotationStateUpdateRequest */ AnnotationStateUpdateRequest: { /** Data */ - data: (components["schemas"]["TextAnnotation"] | components["schemas"]["DrawAnnotation"] | components["schemas"]["SignatureAnnotation"] | components["schemas"]["ImageAnnotation"] | components["schemas"]["HighlightAnnotation"] | components["schemas"]["ShapeAnnotation"])[]; + data: { + [key: string]: unknown; + }[]; /** Baseupdatedat */ baseUpdatedAt?: string | null; }; @@ -368,6 +463,11 @@ export interface components { /** Loggedin */ loggedIn: boolean; }; + /** Body_upload_asset_api_v1_documents__id__assets_post */ + Body_upload_asset_api_v1_documents__id__assets_post: { + /** File */ + file: string; + }; /** Body_upload_document_api_v1_documents_post */ Body_upload_document_api_v1_documents_post: { /** File */ @@ -425,402 +525,31 @@ export interface components { /** In Trash */ in_trash?: boolean | null; }; - /** DrawAnnotation */ - DrawAnnotation: { + /** ExportRequest */ + ExportRequest: { + /** Versionid */ + versionId?: string | null; /** - * Id - * Format: uuid + * Flatten + * @default true */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "draw"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["DrawProps"]; - }; - /** DrawProps */ - DrawProps: { - /** Paths */ - paths: [ - number, - number - ][]; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - /** - * Strokewidth - * @default 2 - */ - strokeWidth: number; - /** - * Opacity - * @default 1 - */ - opacity: number; + flatten: boolean; }; /** HTTPValidationError */ HTTPValidationError: { /** Detail */ detail?: components["schemas"]["ValidationError"][]; }; - /** HighlightAnnotation */ - HighlightAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "highlight"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["HighlightProps"]; - }; - /** HighlightProps */ - HighlightProps: { - /** - * Color - * @default #FFEB3B - */ - color: string; - /** - * Opacity - * @default 0.3 - */ - opacity: number; - }; - /** ImageAnnotation */ - ImageAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "image"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["ImageProps"]; - }; - /** ImageProps */ - ImageProps: { - /** Ref */ - ref: string; - /** Naturalwidth */ - naturalWidth: number; - /** Naturalheight */ - naturalHeight: number; - }; /** LoginRequest */ LoginRequest: { /** Password */ password: string; }; - /** Rect */ - Rect: { - /** X */ - x: number; - /** Y */ - y: number; - /** Width */ - width: number; - /** Height */ - height: number; - }; /** SetupRequest */ SetupRequest: { /** Password */ password: string; }; - /** ShapeAnnotation */ - ShapeAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "shape"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["ShapeProps"]; - }; - /** ShapeProps */ - ShapeProps: { - /** - * Kind - * @enum {string} - */ - kind: "rect" | "ellipse" | "line" | "arrow"; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - /** - * Fillcolor - * @default transparent - */ - fillColor: string; - /** - * Strokewidth - * @default 2 - */ - strokeWidth: number; - }; - /** SignatureAnnotation */ - SignatureAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "signature"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - /** Props */ - props: components["schemas"]["SignatureDrawProps"] | components["schemas"]["SignatureTypeProps"]; - }; - /** SignatureDrawProps */ - SignatureDrawProps: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - mode: "draw"; - /** Ref */ - ref: string; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - }; - /** SignatureTypeProps */ - SignatureTypeProps: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - mode: "type"; - /** Text */ - text: string; - /** Fontfamily */ - fontFamily: string; - /** - * Color - * @default #000000 - */ - color: string; - }; - /** TextAnnotation */ - TextAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "text"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["TextProps"]; - }; - /** TextProps */ - TextProps: { - /** Text */ - text: string; - /** - * Fontfamily - * @default Liberation Sans - */ - fontFamily: string; - /** - * Fontsize - * @default 14 - */ - fontSize: number; - /** - * Color - * @default #000000 - */ - color: string; - /** - * Align - * @default left - * @enum {string} - */ - align: "left" | "center" | "right"; - /** - * Bold - * @default false - */ - bold: boolean; - /** - * Italic - * @default false - */ - italic: boolean; - /** - * Lineheight - * @default 1.2 - */ - lineHeight: number; - /** Highlightcolor */ - highlightColor?: string | null; - /** Styles */ - styles?: { - [key: string]: unknown; - } | null; - }; /** ValidationError */ ValidationError: { /** Location */ @@ -834,20 +563,58 @@ export interface components { /** Context */ ctx?: Record; }; - /** VerifyCoordsRequest */ - VerifyCoordsRequest: { - /** Document Id */ - document_id: string; - /** Page */ - page: number; - /** X */ - x: number; - /** Y */ - y: number; - /** Width */ - width: number; - /** Height */ - height: number; + /** VersionCreateRequest */ + VersionCreateRequest: { + /** Label */ + label?: string | null; + /** + * Kind + * @default manual + * @enum {string} + */ + kind: "manual" | "auto"; + }; + /** VersionDataResponse */ + VersionDataResponse: { + /** Data */ + data: { + [key: string]: unknown; + }[]; + meta: components["schemas"]["VersionMeta"]; + }; + /** VersionListResponse */ + VersionListResponse: { + /** Items */ + items: components["schemas"]["VersionMeta"][]; + }; + /** VersionMeta */ + VersionMeta: { + /** Id */ + id: string; + /** Documentid */ + documentId: string; + /** Label */ + label: string | null; + /** + * Kind + * @enum {string} + */ + kind: "manual" | "auto"; + /** + * Createdat + * Format: date-time + */ + createdAt: string; + /** Annotationcount */ + annotationCount: number; + }; + /** VersionRestoreResponse */ + VersionRestoreResponse: { + /** + * Updatedat + * Format: date-time + */ + updatedAt: string; }; }; responses: never; @@ -1052,7 +819,7 @@ export interface operations { }; responses: { /** @description Successful Response */ - 200: { + 201: { headers: { [name: string]: unknown; }; @@ -1381,6 +1148,75 @@ export interface operations { }; }; }; + upload_asset_api_v1_documents__id__assets_post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_upload_asset_api_v1_documents__id__assets_post"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + get_asset_api_v1_documents__id__assets__ref__get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ref: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; get_annotations_api_v1_documents__document_id__annotations_get: { parameters: { query?: never; @@ -1447,11 +1283,13 @@ export interface operations { }; }; }; - health_check_api_v1_health_get: { + list_versions_api_v1_documents__document_id__versions_get: { parameters: { query?: never; header?: never; - path?: never; + path: { + document_id: string; + }; cookie?: never; }; requestBody?: never; @@ -1462,23 +1300,161 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": { - [key: string]: string; - }; + "application/json": components["schemas"]["VersionListResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; - verify_coords_api_v1_debug_verify_coords_post: { + create_version_api_v1_documents__document_id__versions_post: { parameters: { query?: never; header?: never; - path?: never; + path: { + document_id: string; + }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["VerifyCoordsRequest"]; + "application/json": components["schemas"]["VersionCreateRequest"]; + }; + }; + responses: { + /** @description Successful Response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionMeta"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + get_version_api_v1_documents__document_id__versions__version_id__get: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionDataResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + delete_version_api_v1_documents__document_id__versions__version_id__delete: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + restore_version_api_v1_documents__document_id__versions__version_id__restore_post: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionRestoreResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + export_document_api_v1_documents__document_id__export_post: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ExportRequest"]; }; }; responses: { @@ -1502,4 +1478,26 @@ export interface operations { }; }; }; + health_check_api_v1_health_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + }; + }; } diff --git a/frontend/src/types/api.ts b/frontend/src/types/api.ts index 630a6de..0d449e2 100644 --- a/frontend/src/types/api.ts +++ b/frontend/src/types/api.ts @@ -272,6 +272,46 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/documents/{id}/assets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Upload Asset + * @description Upload a PNG, JPEG, GIF, or WebP annotation asset. + */ + post: operations["upload_asset_api_v1_documents__id__assets_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{id}/assets/{ref}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Asset + * @description Serve an annotation asset to an authenticated session. + */ + get: operations["get_asset_api_v1_documents__id__assets__ref__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/documents/{document_id}/annotations": { parameters: { query?: never; @@ -290,6 +330,79 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/documents/{document_id}/versions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List Versions */ + get: operations["list_versions_api_v1_documents__document_id__versions_get"]; + put?: never; + /** Create Version */ + post: operations["create_version_api_v1_documents__document_id__versions_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/versions/{version_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get Version */ + get: operations["get_version_api_v1_documents__document_id__versions__version_id__get"]; + put?: never; + post?: never; + /** Delete Version */ + delete: operations["delete_version_api_v1_documents__document_id__versions__version_id__delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/versions/{version_id}/restore": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Restore Version */ + post: operations["restore_version_api_v1_documents__document_id__versions__version_id__restore_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/documents/{document_id}/export": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Export Document + * @description Export the working layer or a selected version as a downloadable PDF. + */ + post: operations["export_document_api_v1_documents__document_id__export_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/health": { parameters: { query?: never; @@ -310,28 +423,6 @@ export interface paths { patch?: never; trace?: never; }; - "/api/v1/debug/verify-coords": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Verify Coords - * @description Test endpoint for cross-engine coordinate verification. - * Takes a canonical rect, draws it on the PDF using PyMuPDF, - * and returns the flattened PDF. - */ - post: operations["verify_coords_api_v1_debug_verify_coords_post"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { @@ -339,7 +430,9 @@ export interface components { /** AnnotationStateResponse */ AnnotationStateResponse: { /** Data */ - data: (components["schemas"]["TextAnnotation"] | components["schemas"]["DrawAnnotation"] | components["schemas"]["SignatureAnnotation"] | components["schemas"]["ImageAnnotation"] | components["schemas"]["HighlightAnnotation"] | components["schemas"]["ShapeAnnotation"])[]; + data: { + [key: string]: unknown; + }[]; /** * Updatedat * Format: date-time @@ -349,7 +442,9 @@ export interface components { /** AnnotationStateUpdateRequest */ AnnotationStateUpdateRequest: { /** Data */ - data: (components["schemas"]["TextAnnotation"] | components["schemas"]["DrawAnnotation"] | components["schemas"]["SignatureAnnotation"] | components["schemas"]["ImageAnnotation"] | components["schemas"]["HighlightAnnotation"] | components["schemas"]["ShapeAnnotation"])[]; + data: { + [key: string]: unknown; + }[]; /** Baseupdatedat */ baseUpdatedAt?: string | null; }; @@ -368,6 +463,11 @@ export interface components { /** Loggedin */ loggedIn: boolean; }; + /** Body_upload_asset_api_v1_documents__id__assets_post */ + Body_upload_asset_api_v1_documents__id__assets_post: { + /** File */ + file: string; + }; /** Body_upload_document_api_v1_documents_post */ Body_upload_document_api_v1_documents_post: { /** File */ @@ -425,396 +525,31 @@ export interface components { /** In Trash */ in_trash?: boolean | null; }; - /** DrawAnnotation */ - DrawAnnotation: { + /** ExportRequest */ + ExportRequest: { + /** Versionid */ + versionId?: string | null; /** - * Id - * Format: uuid + * Flatten + * @default true */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "draw"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["DrawProps"]; - }; - /** DrawProps */ - DrawProps: { - /** Paths */ - paths: [ - number, - number - ][]; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - /** - * Strokewidth - * @default 2 - */ - strokeWidth: number; - /** - * Opacity - * @default 1 - */ - opacity: number; + flatten: boolean; }; /** HTTPValidationError */ HTTPValidationError: { /** Detail */ detail?: components["schemas"]["ValidationError"][]; }; - /** HighlightAnnotation */ - HighlightAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "highlight"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["HighlightProps"]; - }; - /** HighlightProps */ - HighlightProps: { - /** - * Color - * @default #FFEB3B - */ - color: string; - /** - * Opacity - * @default 0.3 - */ - opacity: number; - }; - /** ImageAnnotation */ - ImageAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "image"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["ImageProps"]; - }; - /** ImageProps */ - ImageProps: { - /** Ref */ - ref: string; - /** Naturalwidth */ - naturalWidth: number; - /** Naturalheight */ - naturalHeight: number; - }; /** LoginRequest */ LoginRequest: { /** Password */ password: string; }; - /** Rect */ - Rect: { - /** X */ - x: number; - /** Y */ - y: number; - /** Width */ - width: number; - /** Height */ - height: number; - }; /** SetupRequest */ SetupRequest: { /** Password */ password: string; }; - /** ShapeAnnotation */ - ShapeAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "shape"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["ShapeProps"]; - }; - /** ShapeProps */ - ShapeProps: { - /** - * Kind - * @enum {string} - */ - kind: "rect" | "ellipse" | "line" | "arrow"; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - /** - * Fillcolor - * @default transparent - */ - fillColor: string; - /** - * Strokewidth - * @default 2 - */ - strokeWidth: number; - }; - /** SignatureAnnotation */ - SignatureAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "signature"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - /** Props */ - props: components["schemas"]["SignatureDrawProps"] | components["schemas"]["SignatureTypeProps"]; - }; - /** SignatureDrawProps */ - SignatureDrawProps: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - mode: "draw"; - /** Ref */ - ref: string; - /** - * Strokecolor - * @default #000000 - */ - strokeColor: string; - }; - /** SignatureTypeProps */ - SignatureTypeProps: { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - mode: "type"; - /** Text */ - text: string; - /** Fontfamily */ - fontFamily: string; - /** - * Color - * @default #000000 - */ - color: string; - }; - /** TextAnnotation */ - TextAnnotation: { - /** - * Id - * Format: uuid - */ - id: string; - /** Page */ - page: number; - /** - * Type - * @constant - */ - type: "text"; - rect: components["schemas"]["Rect"]; - /** - * Rotation - * @default 0 - */ - rotation: number; - /** - * Z - * @default 0 - */ - z: number; - /** - * Createdat - * Format: date-time - */ - createdAt: string; - /** - * Updatedat - * Format: date-time - */ - updatedAt: string; - props: components["schemas"]["TextProps"]; - }; - /** TextProps */ - TextProps: { - /** Text */ - text: string; - /** - * Fontfamily - * @default Liberation Sans - */ - fontFamily: string; - /** - * Fontsize - * @default 14 - */ - fontSize: number; - /** - * Color - * @default #000000 - */ - color: string; - /** - * Align - * @default left - * @enum {string} - */ - align: "left" | "center" | "right"; - /** - * Bold - * @default false - */ - bold: boolean; - /** - * Italic - * @default false - */ - italic: boolean; - /** - * Lineheight - * @default 1.2 - */ - lineHeight: number; - }; /** ValidationError */ ValidationError: { /** Location */ @@ -828,20 +563,58 @@ export interface components { /** Context */ ctx?: Record; }; - /** VerifyCoordsRequest */ - VerifyCoordsRequest: { - /** Document Id */ - document_id: string; - /** Page */ - page: number; - /** X */ - x: number; - /** Y */ - y: number; - /** Width */ - width: number; - /** Height */ - height: number; + /** VersionCreateRequest */ + VersionCreateRequest: { + /** Label */ + label?: string | null; + /** + * Kind + * @default manual + * @enum {string} + */ + kind: "manual" | "auto"; + }; + /** VersionDataResponse */ + VersionDataResponse: { + /** Data */ + data: { + [key: string]: unknown; + }[]; + meta: components["schemas"]["VersionMeta"]; + }; + /** VersionListResponse */ + VersionListResponse: { + /** Items */ + items: components["schemas"]["VersionMeta"][]; + }; + /** VersionMeta */ + VersionMeta: { + /** Id */ + id: string; + /** Documentid */ + documentId: string; + /** Label */ + label: string | null; + /** + * Kind + * @enum {string} + */ + kind: "manual" | "auto"; + /** + * Createdat + * Format: date-time + */ + createdAt: string; + /** Annotationcount */ + annotationCount: number; + }; + /** VersionRestoreResponse */ + VersionRestoreResponse: { + /** + * Updatedat + * Format: date-time + */ + updatedAt: string; }; }; responses: never; @@ -1046,7 +819,7 @@ export interface operations { }; responses: { /** @description Successful Response */ - 200: { + 201: { headers: { [name: string]: unknown; }; @@ -1375,6 +1148,75 @@ export interface operations { }; }; }; + upload_asset_api_v1_documents__id__assets_post: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_upload_asset_api_v1_documents__id__assets_post"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + get_asset_api_v1_documents__id__assets__ref__get: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + ref: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; get_annotations_api_v1_documents__document_id__annotations_get: { parameters: { query?: never; @@ -1441,11 +1283,13 @@ export interface operations { }; }; }; - health_check_api_v1_health_get: { + list_versions_api_v1_documents__document_id__versions_get: { parameters: { query?: never; header?: never; - path?: never; + path: { + document_id: string; + }; cookie?: never; }; requestBody?: never; @@ -1456,23 +1300,161 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": { - [key: string]: string; - }; + "application/json": components["schemas"]["VersionListResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; - verify_coords_api_v1_debug_verify_coords_post: { + create_version_api_v1_documents__document_id__versions_post: { parameters: { query?: never; header?: never; - path?: never; + path: { + document_id: string; + }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["VerifyCoordsRequest"]; + "application/json": components["schemas"]["VersionCreateRequest"]; + }; + }; + responses: { + /** @description Successful Response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionMeta"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + get_version_api_v1_documents__document_id__versions__version_id__get: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionDataResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + delete_version_api_v1_documents__document_id__versions__version_id__delete: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + restore_version_api_v1_documents__document_id__versions__version_id__restore_post: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + version_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["VersionRestoreResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + export_document_api_v1_documents__document_id__export_post: { + parameters: { + query?: never; + header?: never; + path: { + document_id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ExportRequest"]; }; }; responses: { @@ -1496,4 +1478,26 @@ export interface operations { }; }; }; + health_check_api_v1_health_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + }; + }; } diff --git a/openapi.json b/openapi.json index 62b6e82..bf1facb 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"PaperJet","description":"Self-hosted PDF editor API","version":"0.1.0"},"paths":{"/api/v1/auth/status":{"get":{"tags":["auth"],"summary":"Get Auth Status","description":"Check if app requires setup and if user is logged in.","operationId":"get_auth_status_api_v1_auth_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthStatusResponse"}}}}}}},"/api/v1/auth/setup":{"post":{"tags":["auth"],"summary":"Setup Password","description":"First-run setup.","operationId":"setup_password_api_v1_auth_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Setup Password Api V1 Auth Setup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Validate password and issue session cookie.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Login Api V1 Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Clear session cookie.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Logout Api V1 Auth Logout Post"}}}}}}},"/api/v1/auth/password":{"put":{"tags":["auth"],"summary":"Change Password","description":"Change an existing password.","operationId":"change_password_api_v1_auth_password_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Change Password Api V1 Auth Password Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents":{"get":{"tags":["documents"],"summary":"List Documents","description":"List non-trashed documents.","operationId":"list_documents_api_v1_documents_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["documents"],"summary":"Upload Document","description":"Upload a new PDF document.","operationId":"upload_document_api_v1_documents_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_api_v1_documents_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/trash":{"get":{"tags":["documents"],"summary":"List Trash","description":"List trashed documents.","operationId":"list_trash_api_v1_documents_trash_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}":{"get":{"tags":["documents"],"summary":"Get Document","operationId":"get_document_api_v1_documents__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["documents"],"summary":"Update Document","operationId":"update_document_api_v1_documents__id__patch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["documents"],"summary":"Delete Document","description":"Soft delete by default. Hard delete if permanent=True AND already in trash.","operationId":"delete_document_api_v1_documents__id__delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"permanent","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Permanent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/restore":{"post":{"tags":["documents"],"summary":"Restore Document","operationId":"restore_document_api_v1_documents__id__restore_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-delete":{"post":{"tags":["documents"],"summary":"Bulk Delete","operationId":"bulk_delete_api_v1_documents_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-restore":{"post":{"tags":["documents"],"summary":"Bulk Restore","operationId":"bulk_restore_api_v1_documents_bulk_restore_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRestoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/trash/empty":{"post":{"tags":["documents"],"summary":"Empty Trash","operationId":"empty_trash_api_v1_documents_trash_empty_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/documents/{id}/file":{"get":{"tags":["documents"],"summary":"Get Document File","operationId":"get_document_file_api_v1_documents__id__file_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/thumbnail":{"get":{"tags":["documents"],"summary":"Get Document Thumbnail","operationId":"get_document_thumbnail_api_v1_documents__id__thumbnail_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/annotations":{"get":{"tags":["Annotations"],"summary":"Get Annotations","operationId":"get_annotations_api_v1_documents__document_id__annotations_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Annotations"],"summary":"Update Annotations","operationId":"update_annotations_api_v1_documents__document_id__annotations_put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Return service health status and version.","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Api V1 Health Get"}}}}}}},"/api/v1/debug/verify-coords":{"post":{"tags":["Debug"],"summary":"Verify Coords","description":"Test endpoint for cross-engine coordinate verification.\nTakes a canonical rect, draws it on the PDF using PyMuPDF,\nand returns the flattened PDF.","operationId":"verify_coords_api_v1_debug_verify_coords_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCoordsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AnnotationStateResponse":{"properties":{"data":{"items":{"anyOf":[{"$ref":"#/components/schemas/TextAnnotation"},{"$ref":"#/components/schemas/DrawAnnotation"},{"$ref":"#/components/schemas/SignatureAnnotation"},{"$ref":"#/components/schemas/ImageAnnotation"},{"$ref":"#/components/schemas/HighlightAnnotation"},{"$ref":"#/components/schemas/ShapeAnnotation"}]},"type":"array","title":"Data"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["data","updatedAt"],"title":"AnnotationStateResponse"},"AnnotationStateUpdateRequest":{"properties":{"data":{"items":{"anyOf":[{"$ref":"#/components/schemas/TextAnnotation"},{"$ref":"#/components/schemas/DrawAnnotation"},{"$ref":"#/components/schemas/SignatureAnnotation"},{"$ref":"#/components/schemas/ImageAnnotation"},{"$ref":"#/components/schemas/HighlightAnnotation"},{"$ref":"#/components/schemas/ShapeAnnotation"}]},"type":"array","title":"Data"},"baseUpdatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseupdatedat"}},"type":"object","required":["data"],"title":"AnnotationStateUpdateRequest"},"AnnotationStateUpdateResponse":{"properties":{"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["updatedAt"],"title":"AnnotationStateUpdateResponse"},"AuthStatusResponse":{"properties":{"setupRequired":{"type":"boolean","title":"Setuprequired"},"loggedIn":{"type":"boolean","title":"Loggedin"}},"type":"object","required":["setupRequired","loggedIn"],"title":"AuthStatusResponse"},"Body_upload_document_api_v1_documents_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_v1_documents_post"},"BulkDeleteRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"BulkDeleteRequest"},"BulkRestoreRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"BulkRestoreRequest"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"DocumentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DocumentMeta"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"DocumentListResponse"},"DocumentMeta":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"filename":{"type":"string","title":"Filename"},"mime_type":{"type":"string","title":"Mime Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"in_trash":{"type":"boolean","title":"In Trash"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["id","title","filename","mime_type","size_bytes","in_trash","created_at","updated_at","deleted_at"],"title":"DocumentMeta"},"DocumentUpdateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"in_trash":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Trash"}},"type":"object","title":"DocumentUpdateRequest"},"DrawAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"draw","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"$ref":"#/components/schemas/DrawProps"}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"DrawAnnotation"},"DrawProps":{"properties":{"paths":{"items":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},"type":"array","title":"Paths"},"strokeColor":{"type":"string","title":"Strokecolor","default":"#000000"},"strokeWidth":{"type":"number","title":"Strokewidth","default":2},"opacity":{"type":"number","title":"Opacity","default":1.0}},"type":"object","required":["paths"],"title":"DrawProps"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HighlightAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"highlight","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"$ref":"#/components/schemas/HighlightProps"}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"HighlightAnnotation"},"HighlightProps":{"properties":{"color":{"type":"string","title":"Color","default":"#FFEB3B"},"opacity":{"type":"number","title":"Opacity","default":0.3}},"type":"object","title":"HighlightProps"},"ImageAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"image","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"$ref":"#/components/schemas/ImageProps"}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"ImageAnnotation"},"ImageProps":{"properties":{"ref":{"type":"string","title":"Ref"},"naturalWidth":{"type":"number","title":"Naturalwidth"},"naturalHeight":{"type":"number","title":"Naturalheight"}},"type":"object","required":["ref","naturalWidth","naturalHeight"],"title":"ImageProps"},"LoginRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"LoginRequest"},"Rect":{"properties":{"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["x","y","width","height"],"title":"Rect"},"SetupRequest":{"properties":{"password":{"type":"string","minLength":8,"title":"Password"}},"type":"object","required":["password"],"title":"SetupRequest"},"ShapeAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"shape","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"$ref":"#/components/schemas/ShapeProps"}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"ShapeAnnotation"},"ShapeProps":{"properties":{"kind":{"type":"string","enum":["rect","ellipse","line","arrow"],"title":"Kind"},"strokeColor":{"type":"string","title":"Strokecolor","default":"#000000"},"fillColor":{"type":"string","title":"Fillcolor","default":"transparent"},"strokeWidth":{"type":"number","title":"Strokewidth","default":2}},"type":"object","required":["kind"],"title":"ShapeProps"},"SignatureAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"signature","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"oneOf":[{"$ref":"#/components/schemas/SignatureDrawProps"},{"$ref":"#/components/schemas/SignatureTypeProps"}],"title":"Props","discriminator":{"propertyName":"mode","mapping":{"draw":"#/components/schemas/SignatureDrawProps","type":"#/components/schemas/SignatureTypeProps"}}}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"SignatureAnnotation"},"SignatureDrawProps":{"properties":{"mode":{"type":"string","const":"draw","title":"Mode"},"ref":{"type":"string","title":"Ref"},"strokeColor":{"type":"string","title":"Strokecolor","default":"#000000"}},"type":"object","required":["mode","ref"],"title":"SignatureDrawProps"},"SignatureTypeProps":{"properties":{"mode":{"type":"string","const":"type","title":"Mode"},"text":{"type":"string","title":"Text"},"fontFamily":{"type":"string","title":"Fontfamily"},"color":{"type":"string","title":"Color","default":"#000000"}},"type":"object","required":["mode","text","fontFamily"],"title":"SignatureTypeProps"},"TextAnnotation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"page":{"type":"integer","minimum":0.0,"title":"Page"},"type":{"type":"string","const":"text","title":"Type"},"rect":{"$ref":"#/components/schemas/Rect"},"rotation":{"type":"number","title":"Rotation","default":0.0},"z":{"type":"integer","title":"Z","default":0},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"props":{"$ref":"#/components/schemas/TextProps"}},"type":"object","required":["id","page","type","rect","createdAt","updatedAt","props"],"title":"TextAnnotation"},"TextProps":{"properties":{"text":{"type":"string","title":"Text"},"fontFamily":{"type":"string","title":"Fontfamily","default":"Liberation Sans"},"fontSize":{"type":"number","title":"Fontsize","default":14},"color":{"type":"string","title":"Color","default":"#000000"},"align":{"type":"string","enum":["left","center","right"],"title":"Align","default":"left"},"bold":{"type":"boolean","title":"Bold","default":false},"italic":{"type":"boolean","title":"Italic","default":false},"lineHeight":{"type":"number","title":"Lineheight","default":1.2}},"type":"object","required":["text"],"title":"TextProps"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCoordsRequest":{"properties":{"document_id":{"type":"string","title":"Document Id"},"page":{"type":"integer","title":"Page"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["document_id","page","x","y","width","height"],"title":"VerifyCoordsRequest"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"PaperJet","description":"Self-hosted PDF editor API","version":"0.1.0"},"paths":{"/api/v1/auth/status":{"get":{"tags":["auth"],"summary":"Get Auth Status","description":"Check if app requires setup and if user is logged in.","operationId":"get_auth_status_api_v1_auth_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthStatusResponse"}}}}}}},"/api/v1/auth/setup":{"post":{"tags":["auth"],"summary":"Setup Password","description":"First-run setup.","operationId":"setup_password_api_v1_auth_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Setup Password Api V1 Auth Setup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Validate password and issue session cookie.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Login Api V1 Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Clear session cookie.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Logout Api V1 Auth Logout Post"}}}}}}},"/api/v1/auth/password":{"put":{"tags":["auth"],"summary":"Change Password","description":"Change an existing password.","operationId":"change_password_api_v1_auth_password_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Change Password Api V1 Auth Password Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents":{"get":{"tags":["documents"],"summary":"List Documents","description":"List non-trashed documents.","operationId":"list_documents_api_v1_documents_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["documents"],"summary":"Upload Document","description":"Upload a new PDF document.","operationId":"upload_document_api_v1_documents_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_api_v1_documents_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/trash":{"get":{"tags":["documents"],"summary":"List Trash","description":"List trashed documents.","operationId":"list_trash_api_v1_documents_trash_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}":{"get":{"tags":["documents"],"summary":"Get Document","operationId":"get_document_api_v1_documents__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["documents"],"summary":"Update Document","operationId":"update_document_api_v1_documents__id__patch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["documents"],"summary":"Delete Document","description":"Soft delete by default. Hard delete if permanent=True AND already in trash.","operationId":"delete_document_api_v1_documents__id__delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"permanent","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Permanent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/restore":{"post":{"tags":["documents"],"summary":"Restore Document","operationId":"restore_document_api_v1_documents__id__restore_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-delete":{"post":{"tags":["documents"],"summary":"Bulk Delete","operationId":"bulk_delete_api_v1_documents_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bulk-restore":{"post":{"tags":["documents"],"summary":"Bulk Restore","operationId":"bulk_restore_api_v1_documents_bulk_restore_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRestoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/trash/empty":{"post":{"tags":["documents"],"summary":"Empty Trash","operationId":"empty_trash_api_v1_documents_trash_empty_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/documents/{id}/file":{"get":{"tags":["documents"],"summary":"Get Document File","operationId":"get_document_file_api_v1_documents__id__file_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/thumbnail":{"get":{"tags":["documents"],"summary":"Get Document Thumbnail","operationId":"get_document_thumbnail_api_v1_documents__id__thumbnail_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/assets":{"post":{"tags":["Assets"],"summary":"Upload Asset","description":"Upload a PNG, JPEG, GIF, or WebP annotation asset.","operationId":"upload_asset_api_v1_documents__id__assets_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_asset_api_v1_documents__id__assets_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Upload Asset Api V1 Documents Id Assets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{id}/assets/{ref}":{"get":{"tags":["Assets"],"summary":"Get Asset","description":"Serve an annotation asset to an authenticated session.","operationId":"get_asset_api_v1_documents__id__assets__ref__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/annotations":{"get":{"tags":["annotations"],"summary":"Get Annotations","operationId":"get_annotations_api_v1_documents__document_id__annotations_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["annotations"],"summary":"Update Annotations","operationId":"update_annotations_api_v1_documents__document_id__annotations_put","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationStateUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/versions":{"get":{"tags":["versions"],"summary":"List Versions","operationId":"list_versions_api_v1_documents__document_id__versions_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["versions"],"summary":"Create Version","operationId":"create_version_api_v1_documents__document_id__versions_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/versions/{version_id}":{"get":{"tags":["versions"],"summary":"Get Version","operationId":"get_version_api_v1_documents__document_id__versions__version_id__get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["versions"],"summary":"Delete Version","operationId":"delete_version_api_v1_documents__document_id__versions__version_id__delete","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/versions/{version_id}/restore":{"post":{"tags":["versions"],"summary":"Restore Version","operationId":"restore_version_api_v1_documents__document_id__versions__version_id__restore_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionRestoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/export":{"post":{"tags":["export"],"summary":"Export Document","description":"Export the working layer or a selected version as a downloadable PDF.","operationId":"export_document_api_v1_documents__document_id__export_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","title":"Document Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Return service health status and version.","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Api V1 Health Get"}}}}}}}},"components":{"schemas":{"AnnotationStateResponse":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["data","updatedAt"],"title":"AnnotationStateResponse"},"AnnotationStateUpdateRequest":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"baseUpdatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseupdatedat"}},"type":"object","required":["data"],"title":"AnnotationStateUpdateRequest"},"AnnotationStateUpdateResponse":{"properties":{"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["updatedAt"],"title":"AnnotationStateUpdateResponse"},"AuthStatusResponse":{"properties":{"setupRequired":{"type":"boolean","title":"Setuprequired"},"loggedIn":{"type":"boolean","title":"Loggedin"}},"type":"object","required":["setupRequired","loggedIn"],"title":"AuthStatusResponse"},"Body_upload_asset_api_v1_documents__id__assets_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_asset_api_v1_documents__id__assets_post"},"Body_upload_document_api_v1_documents_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_v1_documents_post"},"BulkDeleteRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"BulkDeleteRequest"},"BulkRestoreRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"BulkRestoreRequest"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"DocumentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DocumentMeta"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"DocumentListResponse"},"DocumentMeta":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"filename":{"type":"string","title":"Filename"},"mime_type":{"type":"string","title":"Mime Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"in_trash":{"type":"boolean","title":"In Trash"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["id","title","filename","mime_type","size_bytes","in_trash","created_at","updated_at","deleted_at"],"title":"DocumentMeta"},"DocumentUpdateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"in_trash":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Trash"}},"type":"object","title":"DocumentUpdateRequest"},"ExportRequest":{"properties":{"versionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Versionid"},"flatten":{"type":"boolean","title":"Flatten","default":true}},"type":"object","title":"ExportRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"LoginRequest"},"SetupRequest":{"properties":{"password":{"type":"string","minLength":8,"title":"Password"}},"type":"object","required":["password"],"title":"SetupRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreateRequest":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"},"kind":{"type":"string","enum":["manual","auto"],"title":"Kind","default":"manual"}},"type":"object","title":"VersionCreateRequest"},"VersionDataResponse":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/VersionMeta"}},"type":"object","required":["data","meta"],"title":"VersionDataResponse"},"VersionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VersionMeta"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"VersionListResponse"},"VersionMeta":{"properties":{"id":{"type":"string","title":"Id"},"documentId":{"type":"string","title":"Documentid"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"kind":{"type":"string","enum":["manual","auto"],"title":"Kind"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"annotationCount":{"type":"integer","title":"Annotationcount"}},"type":"object","required":["id","documentId","label","kind","createdAt","annotationCount"],"title":"VersionMeta"},"VersionRestoreResponse":{"properties":{"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["updatedAt"],"title":"VersionRestoreResponse"}}}} \ No newline at end of file diff --git a/openapi_pretty.json b/openapi_pretty.json index 896226d..e84200e 100644 --- a/openapi_pretty.json +++ b/openapi_pretty.json @@ -1,1893 +1,1738 @@ { - "openapi": "3.1.0", - "info": { - "title": "PaperJet", - "description": "Self-hosted PDF editor API", - "version": "0.1.0" - }, - "paths": { - "/api/v1/auth/status": { - "get": { - "tags": [ - "auth" - ], - "summary": "Get Auth Status", - "description": "Check if app requires setup and if user is logged in.", - "operationId": "get_auth_status_api_v1_auth_status_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuthStatusResponse" - } - } - } - } - } - } - }, - "/api/v1/auth/setup": { - "post": { - "tags": [ - "auth" - ], - "summary": "Setup Password", - "description": "First-run setup.", - "operationId": "setup_password_api_v1_auth_setup_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetupRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Response Setup Password Api V1 Auth Setup Post" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/auth/login": { - "post": { - "tags": [ - "auth" - ], - "summary": "Login", - "description": "Validate password and issue session cookie.", - "operationId": "login_api_v1_auth_login_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LoginRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Response Login Api V1 Auth Login Post" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/auth/logout": { - "post": { - "tags": [ - "auth" - ], - "summary": "Logout", - "description": "Clear session cookie.", - "operationId": "logout_api_v1_auth_logout_post", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Response Logout Api V1 Auth Logout Post" - } - } - } - } - } - } - }, - "/api/v1/auth/password": { - "put": { - "tags": [ - "auth" - ], - "summary": "Change Password", - "description": "Change an existing password.", - "operationId": "change_password_api_v1_auth_password_put", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangePasswordRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Response Change Password Api V1 Auth Password Put" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents": { - "get": { - "tags": [ - "documents" - ], - "summary": "List Documents", - "description": "List non-trashed documents.", - "operationId": "list_documents_api_v1_documents_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "", - "title": "Query" - } - }, - { - "name": "skip", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 0, - "default": 0, - "title": "Skip" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentListResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "post": { - "tags": [ - "documents" - ], - "summary": "Upload Document", - "description": "Upload a new PDF document.", - "operationId": "upload_document_api_v1_documents_post", - "requestBody": { - "required": true, - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/Body_upload_document_api_v1_documents_post" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentMeta" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/trash": { - "get": { - "tags": [ - "documents" - ], - "summary": "List Trash", - "description": "List trashed documents.", - "operationId": "list_trash_api_v1_documents_trash_get", - "parameters": [ - { - "name": "skip", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 0, - "default": 0, - "title": "Skip" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentListResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/{id}": { - "get": { - "tags": [ - "documents" - ], - "summary": "Get Document", - "operationId": "get_document_api_v1_documents__id__get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentMeta" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "patch": { - "tags": [ - "documents" - ], - "summary": "Update Document", - "operationId": "update_document_api_v1_documents__id__patch", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentUpdateRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentMeta" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "documents" - ], - "summary": "Delete Document", - "description": "Soft delete by default. Hard delete if permanent=True AND already in trash.", - "operationId": "delete_document_api_v1_documents__id__delete", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - }, - { - "name": "permanent", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false, - "title": "Permanent" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/{id}/restore": { - "post": { - "tags": [ - "documents" - ], - "summary": "Restore Document", - "operationId": "restore_document_api_v1_documents__id__restore_post", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DocumentMeta" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/bulk-delete": { - "post": { - "tags": [ - "documents" - ], - "summary": "Bulk Delete", - "operationId": "bulk_delete_api_v1_documents_bulk_delete_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkDeleteRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/bulk-restore": { - "post": { - "tags": [ - "documents" - ], - "summary": "Bulk Restore", - "operationId": "bulk_restore_api_v1_documents_bulk_restore_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkRestoreRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/trash/empty": { - "post": { - "tags": [ - "documents" - ], - "summary": "Empty Trash", - "operationId": "empty_trash_api_v1_documents_trash_empty_post", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/api/v1/documents/{id}/file": { - "get": { - "tags": [ - "documents" - ], - "summary": "Get Document File", - "operationId": "get_document_file_api_v1_documents__id__file_get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/{id}/thumbnail": { - "get": { - "tags": [ - "documents" - ], - "summary": "Get Document Thumbnail", - "operationId": "get_document_thumbnail_api_v1_documents__id__thumbnail_get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/documents/{document_id}/annotations": { - "get": { - "tags": [ - "Annotations" - ], - "summary": "Get Annotations", - "operationId": "get_annotations_api_v1_documents__document_id__annotations_get", - "parameters": [ - { - "name": "document_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Document Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AnnotationStateResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "put": { - "tags": [ - "Annotations" - ], - "summary": "Update Annotations", - "operationId": "update_annotations_api_v1_documents__document_id__annotations_put", - "parameters": [ - { - "name": "document_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Document Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AnnotationStateUpdateRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AnnotationStateUpdateResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/api/v1/health": { - "get": { - "tags": [ - "health" - ], - "summary": "Health Check", - "description": "Return service health status and version.", - "operationId": "health_check_api_v1_health_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Response Health Check Api V1 Health Get" - } - } - } - } - } - } - }, - "/api/v1/debug/verify-coords": { - "post": { - "tags": [ - "Debug" - ], - "summary": "Verify Coords", - "description": "Test endpoint for cross-engine coordinate verification.\nTakes a canonical rect, draws it on the PDF using PyMuPDF,\nand returns the flattened PDF.", - "operationId": "verify_coords_api_v1_debug_verify_coords_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/VerifyCoordsRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } + "openapi": "3.1.0", + "info": { + "title": "PaperJet", + "description": "Self-hosted PDF editor API", + "version": "0.1.0" + }, + "paths": { + "/api/v1/auth/status": { + "get": { + "tags": [ + "auth" + ], + "summary": "Get Auth Status", + "description": "Check if app requires setup and if user is logged in.", + "operationId": "get_auth_status_api_v1_auth_status_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthStatusResponse" } + } } + } } + } }, - "components": { - "schemas": { - "AnnotationStateResponse": { - "properties": { - "data": { - "items": { - "anyOf": [ - { - "$ref": "#/components/schemas/TextAnnotation" - }, - { - "$ref": "#/components/schemas/DrawAnnotation" - }, - { - "$ref": "#/components/schemas/SignatureAnnotation" - }, - { - "$ref": "#/components/schemas/ImageAnnotation" - }, - { - "$ref": "#/components/schemas/HighlightAnnotation" - }, - { - "$ref": "#/components/schemas/ShapeAnnotation" - } - ] - }, - "type": "array", - "title": "Data" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - } - }, - "type": "object", - "required": [ - "data", - "updatedAt" - ], - "title": "AnnotationStateResponse" - }, - "AnnotationStateUpdateRequest": { - "properties": { - "data": { - "items": { - "anyOf": [ - { - "$ref": "#/components/schemas/TextAnnotation" - }, - { - "$ref": "#/components/schemas/DrawAnnotation" - }, - { - "$ref": "#/components/schemas/SignatureAnnotation" - }, - { - "$ref": "#/components/schemas/ImageAnnotation" - }, - { - "$ref": "#/components/schemas/HighlightAnnotation" - }, - { - "$ref": "#/components/schemas/ShapeAnnotation" - } - ] - }, - "type": "array", - "title": "Data" - }, - "baseUpdatedAt": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Baseupdatedat" - } - }, - "type": "object", - "required": [ - "data" - ], - "title": "AnnotationStateUpdateRequest" - }, - "AnnotationStateUpdateResponse": { - "properties": { - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - } - }, - "type": "object", - "required": [ - "updatedAt" - ], - "title": "AnnotationStateUpdateResponse" - }, - "AuthStatusResponse": { - "properties": { - "setupRequired": { - "type": "boolean", - "title": "Setuprequired" - }, - "loggedIn": { - "type": "boolean", - "title": "Loggedin" - } - }, - "type": "object", - "required": [ - "setupRequired", - "loggedIn" - ], - "title": "AuthStatusResponse" - }, - "Body_upload_document_api_v1_documents_post": { - "properties": { - "file": { - "type": "string", - "contentMediaType": "application/octet-stream", - "title": "File" - } - }, - "type": "object", - "required": [ - "file" - ], - "title": "Body_upload_document_api_v1_documents_post" - }, - "BulkDeleteRequest": { - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Ids" - } - }, - "type": "object", - "required": [ - "ids" - ], - "title": "BulkDeleteRequest" - }, - "BulkRestoreRequest": { - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Ids" - } - }, - "type": "object", - "required": [ - "ids" - ], - "title": "BulkRestoreRequest" - }, - "ChangePasswordRequest": { - "properties": { - "current_password": { - "type": "string", - "title": "Current Password" - }, - "new_password": { - "type": "string", - "minLength": 8, - "title": "New Password" - } - }, - "type": "object", - "required": [ - "current_password", - "new_password" - ], - "title": "ChangePasswordRequest" - }, - "DocumentListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/DocumentMeta" - }, - "type": "array", - "title": "Items" - }, - "total": { - "type": "integer", - "title": "Total" - } - }, - "type": "object", - "required": [ - "items", - "total" - ], - "title": "DocumentListResponse" - }, - "DocumentMeta": { - "properties": { - "id": { - "type": "string", - "title": "Id" - }, - "title": { - "type": "string", - "title": "Title" - }, - "filename": { - "type": "string", - "title": "Filename" - }, - "mime_type": { - "type": "string", - "title": "Mime Type" - }, - "size_bytes": { - "type": "integer", - "title": "Size Bytes" - }, - "in_trash": { - "type": "boolean", - "title": "In Trash" - }, - "created_at": { - "type": "string", - "title": "Created At" - }, - "updated_at": { - "type": "string", - "title": "Updated At" - }, - "deleted_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Deleted At" - } - }, - "type": "object", - "required": [ - "id", - "title", - "filename", - "mime_type", - "size_bytes", - "in_trash", - "created_at", - "updated_at", - "deleted_at" - ], - "title": "DocumentMeta" - }, - "DocumentUpdateRequest": { - "properties": { - "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Title" - }, - "in_trash": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "In Trash" - } - }, - "type": "object", - "title": "DocumentUpdateRequest" - }, - "DrawAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "draw", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "$ref": "#/components/schemas/DrawProps" - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "DrawAnnotation" - }, - "DrawProps": { - "properties": { - "paths": { - "items": { - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array", - "maxItems": 2, - "minItems": 2 - }, - "type": "array", - "title": "Paths" - }, - "strokeColor": { - "type": "string", - "title": "Strokecolor", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "title": "Strokewidth", - "default": 2 - }, - "opacity": { - "type": "number", - "title": "Opacity", - "default": 1.0 - } - }, - "type": "object", - "required": [ - "paths" - ], - "title": "DrawProps" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "HighlightAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "highlight", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "$ref": "#/components/schemas/HighlightProps" - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "HighlightAnnotation" - }, - "HighlightProps": { - "properties": { - "color": { - "type": "string", - "title": "Color", - "default": "#FFEB3B" - }, - "opacity": { - "type": "number", - "title": "Opacity", - "default": 0.3 - } - }, - "type": "object", - "title": "HighlightProps" - }, - "ImageAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "image", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "$ref": "#/components/schemas/ImageProps" - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "ImageAnnotation" - }, - "ImageProps": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" - }, - "naturalWidth": { - "type": "number", - "title": "Naturalwidth" - }, - "naturalHeight": { - "type": "number", - "title": "Naturalheight" - } - }, - "type": "object", - "required": [ - "ref", - "naturalWidth", - "naturalHeight" - ], - "title": "ImageProps" - }, - "LoginRequest": { - "properties": { - "password": { - "type": "string", - "title": "Password" - } - }, - "type": "object", - "required": [ - "password" - ], - "title": "LoginRequest" - }, - "Rect": { - "properties": { - "x": { - "type": "number", - "title": "X" - }, - "y": { - "type": "number", - "title": "Y" - }, - "width": { - "type": "number", - "title": "Width" - }, - "height": { - "type": "number", - "title": "Height" - } - }, - "type": "object", - "required": [ - "x", - "y", - "width", - "height" - ], - "title": "Rect" - }, - "SetupRequest": { - "properties": { - "password": { - "type": "string", - "minLength": 8, - "title": "Password" - } - }, - "type": "object", - "required": [ - "password" - ], - "title": "SetupRequest" - }, - "ShapeAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "shape", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "$ref": "#/components/schemas/ShapeProps" - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "ShapeAnnotation" - }, - "ShapeProps": { - "properties": { - "kind": { - "type": "string", - "enum": [ - "rect", - "ellipse", - "line", - "arrow" - ], - "title": "Kind" - }, - "strokeColor": { - "type": "string", - "title": "Strokecolor", - "default": "#000000" - }, - "fillColor": { - "type": "string", - "title": "Fillcolor", - "default": "transparent" - }, - "strokeWidth": { - "type": "number", - "title": "Strokewidth", - "default": 2 - } - }, - "type": "object", - "required": [ - "kind" - ], - "title": "ShapeProps" - }, - "SignatureAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "signature", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "oneOf": [ - { - "$ref": "#/components/schemas/SignatureDrawProps" - }, - { - "$ref": "#/components/schemas/SignatureTypeProps" - } - ], - "title": "Props", - "discriminator": { - "propertyName": "mode", - "mapping": { - "draw": "#/components/schemas/SignatureDrawProps", - "type": "#/components/schemas/SignatureTypeProps" - } - } - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "SignatureAnnotation" - }, - "SignatureDrawProps": { - "properties": { - "mode": { - "type": "string", - "const": "draw", - "title": "Mode" - }, - "ref": { - "type": "string", - "title": "Ref" - }, - "strokeColor": { - "type": "string", - "title": "Strokecolor", - "default": "#000000" - } - }, - "type": "object", - "required": [ - "mode", - "ref" - ], - "title": "SignatureDrawProps" - }, - "SignatureTypeProps": { - "properties": { - "mode": { - "type": "string", - "const": "type", - "title": "Mode" - }, - "text": { - "type": "string", - "title": "Text" - }, - "fontFamily": { - "type": "string", - "title": "Fontfamily" - }, - "color": { - "type": "string", - "title": "Color", - "default": "#000000" - } - }, - "type": "object", - "required": [ - "mode", - "text", - "fontFamily" - ], - "title": "SignatureTypeProps" - }, - "TextAnnotation": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "page": { - "type": "integer", - "minimum": 0.0, - "title": "Page" - }, - "type": { - "type": "string", - "const": "text", - "title": "Type" - }, - "rect": { - "$ref": "#/components/schemas/Rect" - }, - "rotation": { - "type": "number", - "title": "Rotation", - "default": 0.0 - }, - "z": { - "type": "integer", - "title": "Z", - "default": 0 - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "title": "Updatedat" - }, - "props": { - "$ref": "#/components/schemas/TextProps" - } - }, - "type": "object", - "required": [ - "id", - "page", - "type", - "rect", - "createdAt", - "updatedAt", - "props" - ], - "title": "TextAnnotation" - }, - "TextProps": { - "properties": { - "text": { - "type": "string", - "title": "Text" - }, - "fontFamily": { - "type": "string", - "title": "Fontfamily", - "default": "Liberation Sans" - }, - "fontSize": { - "type": "number", - "title": "Fontsize", - "default": 14 - }, - "color": { - "type": "string", - "title": "Color", - "default": "#000000" - }, - "align": { - "type": "string", - "enum": [ - "left", - "center", - "right" - ], - "title": "Align", - "default": "left" - }, - "bold": { - "type": "boolean", - "title": "Bold", - "default": false - }, - "italic": { - "type": "boolean", - "title": "Italic", - "default": false - }, - "lineHeight": { - "type": "number", - "title": "Lineheight", - "default": 1.2 - } - }, - "type": "object", - "required": [ - "text" - ], - "title": "TextProps" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - }, - "input": { - "title": "Input" - }, - "ctx": { - "type": "object", - "title": "Context" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "VerifyCoordsRequest": { - "properties": { - "document_id": { - "type": "string", - "title": "Document Id" - }, - "page": { - "type": "integer", - "title": "Page" - }, - "x": { - "type": "number", - "title": "X" - }, - "y": { - "type": "number", - "title": "Y" - }, - "width": { - "type": "number", - "title": "Width" - }, - "height": { - "type": "number", - "title": "Height" - } - }, - "type": "object", - "required": [ - "document_id", - "page", - "x", - "y", - "width", - "height" - ], - "title": "VerifyCoordsRequest" + "/api/v1/auth/setup": { + "post": { + "tags": [ + "auth" + ], + "summary": "Setup Password", + "description": "First-run setup.", + "operationId": "setup_password_api_v1_auth_setup_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetupRequest" + } } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Setup Password Api V1 Auth Setup Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } } + } + }, + "/api/v1/auth/login": { + "post": { + "tags": [ + "auth" + ], + "summary": "Login", + "description": "Validate password and issue session cookie.", + "operationId": "login_api_v1_auth_login_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Login Api V1 Auth Login Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/auth/logout": { + "post": { + "tags": [ + "auth" + ], + "summary": "Logout", + "description": "Clear session cookie.", + "operationId": "logout_api_v1_auth_logout_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Logout Api V1 Auth Logout Post" + } + } + } + } + } + } + }, + "/api/v1/auth/password": { + "put": { + "tags": [ + "auth" + ], + "summary": "Change Password", + "description": "Change an existing password.", + "operationId": "change_password_api_v1_auth_password_put", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePasswordRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Change Password Api V1 Auth Password Put" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Documents", + "description": "List non-trashed documents.", + "operationId": "list_documents_api_v1_documents_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Query" + } + }, + { + "name": "skip", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Skip" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentListResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "documents" + ], + "summary": "Upload Document", + "description": "Upload a new PDF document.", + "operationId": "upload_document_api_v1_documents_post", + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_document_api_v1_documents_post" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentMeta" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/trash": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Trash", + "description": "List trashed documents.", + "operationId": "list_trash_api_v1_documents_trash_get", + "parameters": [ + { + "name": "skip", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Skip" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentListResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{id}": { + "get": { + "tags": [ + "documents" + ], + "summary": "Get Document", + "operationId": "get_document_api_v1_documents__id__get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentMeta" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "documents" + ], + "summary": "Update Document", + "operationId": "update_document_api_v1_documents__id__patch", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentMeta" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "documents" + ], + "summary": "Delete Document", + "description": "Soft delete by default. Hard delete if permanent=True AND already in trash.", + "operationId": "delete_document_api_v1_documents__id__delete", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + }, + { + "name": "permanent", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Permanent" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{id}/restore": { + "post": { + "tags": [ + "documents" + ], + "summary": "Restore Document", + "operationId": "restore_document_api_v1_documents__id__restore_post", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentMeta" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/bulk-delete": { + "post": { + "tags": [ + "documents" + ], + "summary": "Bulk Delete", + "operationId": "bulk_delete_api_v1_documents_bulk_delete_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkDeleteRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/bulk-restore": { + "post": { + "tags": [ + "documents" + ], + "summary": "Bulk Restore", + "operationId": "bulk_restore_api_v1_documents_bulk_restore_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkRestoreRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/trash/empty": { + "post": { + "tags": [ + "documents" + ], + "summary": "Empty Trash", + "operationId": "empty_trash_api_v1_documents_trash_empty_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/api/v1/documents/{id}/file": { + "get": { + "tags": [ + "documents" + ], + "summary": "Get Document File", + "operationId": "get_document_file_api_v1_documents__id__file_get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{id}/thumbnail": { + "get": { + "tags": [ + "documents" + ], + "summary": "Get Document Thumbnail", + "operationId": "get_document_thumbnail_api_v1_documents__id__thumbnail_get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{id}/assets": { + "post": { + "tags": [ + "Assets" + ], + "summary": "Upload Asset", + "description": "Upload a PNG, JPEG, GIF, or WebP annotation asset.", + "operationId": "upload_asset_api_v1_documents__id__assets_post", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_asset_api_v1_documents__id__assets_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Response Upload Asset Api V1 Documents Id Assets Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{id}/assets/{ref}": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get Asset", + "description": "Serve an annotation asset to an authenticated session.", + "operationId": "get_asset_api_v1_documents__id__assets__ref__get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + }, + { + "name": "ref", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Ref" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{document_id}/annotations": { + "get": { + "tags": [ + "annotations" + ], + "summary": "Get Annotations", + "operationId": "get_annotations_api_v1_documents__document_id__annotations_get", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationStateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": [ + "annotations" + ], + "summary": "Update Annotations", + "operationId": "update_annotations_api_v1_documents__document_id__annotations_put", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationStateUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationStateUpdateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{document_id}/versions": { + "get": { + "tags": [ + "versions" + ], + "summary": "List Versions", + "operationId": "list_versions_api_v1_documents__document_id__versions_get", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionListResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "versions" + ], + "summary": "Create Version", + "operationId": "create_version_api_v1_documents__document_id__versions_post", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionCreateRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionMeta" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{document_id}/versions/{version_id}": { + "get": { + "tags": [ + "versions" + ], + "summary": "Get Version", + "operationId": "get_version_api_v1_documents__document_id__versions__version_id__get", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "version_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Version Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionDataResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "versions" + ], + "summary": "Delete Version", + "operationId": "delete_version_api_v1_documents__document_id__versions__version_id__delete", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "version_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Version Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{document_id}/versions/{version_id}/restore": { + "post": { + "tags": [ + "versions" + ], + "summary": "Restore Version", + "operationId": "restore_version_api_v1_documents__document_id__versions__version_id__restore_post", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + }, + { + "name": "version_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Version Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionRestoreResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/documents/{document_id}/export": { + "post": { + "tags": [ + "export" + ], + "summary": "Export Document", + "description": "Export the working layer or a selected version as a downloadable PDF.", + "operationId": "export_document_api_v1_documents__document_id__export_post", + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/health": { + "get": { + "tags": [ + "health" + ], + "summary": "Health Check", + "description": "Return service health status and version.", + "operationId": "health_check_api_v1_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Health Check Api V1 Health Get" + } + } + } + } + } + } } -} + }, + "components": { + "schemas": { + "AnnotationStateResponse": { + "properties": { + "data": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Data" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "title": "Updatedat" + } + }, + "type": "object", + "required": [ + "data", + "updatedAt" + ], + "title": "AnnotationStateResponse" + }, + "AnnotationStateUpdateRequest": { + "properties": { + "data": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Data" + }, + "baseUpdatedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Baseupdatedat" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "AnnotationStateUpdateRequest" + }, + "AnnotationStateUpdateResponse": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time", + "title": "Updatedat" + } + }, + "type": "object", + "required": [ + "updatedAt" + ], + "title": "AnnotationStateUpdateResponse" + }, + "AuthStatusResponse": { + "properties": { + "setupRequired": { + "type": "boolean", + "title": "Setuprequired" + }, + "loggedIn": { + "type": "boolean", + "title": "Loggedin" + } + }, + "type": "object", + "required": [ + "setupRequired", + "loggedIn" + ], + "title": "AuthStatusResponse" + }, + "Body_upload_asset_api_v1_documents__id__assets_post": { + "properties": { + "file": { + "type": "string", + "contentMediaType": "application/octet-stream", + "title": "File" + } + }, + "type": "object", + "required": [ + "file" + ], + "title": "Body_upload_asset_api_v1_documents__id__assets_post" + }, + "Body_upload_document_api_v1_documents_post": { + "properties": { + "file": { + "type": "string", + "contentMediaType": "application/octet-stream", + "title": "File" + } + }, + "type": "object", + "required": [ + "file" + ], + "title": "Body_upload_document_api_v1_documents_post" + }, + "BulkDeleteRequest": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Ids" + } + }, + "type": "object", + "required": [ + "ids" + ], + "title": "BulkDeleteRequest" + }, + "BulkRestoreRequest": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Ids" + } + }, + "type": "object", + "required": [ + "ids" + ], + "title": "BulkRestoreRequest" + }, + "ChangePasswordRequest": { + "properties": { + "current_password": { + "type": "string", + "title": "Current Password" + }, + "new_password": { + "type": "string", + "minLength": 8, + "title": "New Password" + } + }, + "type": "object", + "required": [ + "current_password", + "new_password" + ], + "title": "ChangePasswordRequest" + }, + "DocumentListResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/DocumentMeta" + }, + "type": "array", + "title": "Items" + }, + "total": { + "type": "integer", + "title": "Total" + } + }, + "type": "object", + "required": [ + "items", + "total" + ], + "title": "DocumentListResponse" + }, + "DocumentMeta": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "filename": { + "type": "string", + "title": "Filename" + }, + "mime_type": { + "type": "string", + "title": "Mime Type" + }, + "size_bytes": { + "type": "integer", + "title": "Size Bytes" + }, + "in_trash": { + "type": "boolean", + "title": "In Trash" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + } + }, + "type": "object", + "required": [ + "id", + "title", + "filename", + "mime_type", + "size_bytes", + "in_trash", + "created_at", + "updated_at", + "deleted_at" + ], + "title": "DocumentMeta" + }, + "DocumentUpdateRequest": { + "properties": { + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "in_trash": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "In Trash" + } + }, + "type": "object", + "title": "DocumentUpdateRequest" + }, + "ExportRequest": { + "properties": { + "versionId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Versionid" + }, + "flatten": { + "type": "boolean", + "title": "Flatten", + "default": true + } + }, + "type": "object", + "title": "ExportRequest" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "LoginRequest": { + "properties": { + "password": { + "type": "string", + "title": "Password" + } + }, + "type": "object", + "required": [ + "password" + ], + "title": "LoginRequest" + }, + "SetupRequest": { + "properties": { + "password": { + "type": "string", + "minLength": 8, + "title": "Password" + } + }, + "type": "object", + "required": [ + "password" + ], + "title": "SetupRequest" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VersionCreateRequest": { + "properties": { + "label": { + "anyOf": [ + { + "type": "string", + "maxLength": 120 + }, + { + "type": "null" + } + ], + "title": "Label" + }, + "kind": { + "type": "string", + "enum": [ + "manual", + "auto" + ], + "title": "Kind", + "default": "manual" + } + }, + "type": "object", + "title": "VersionCreateRequest" + }, + "VersionDataResponse": { + "properties": { + "data": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Data" + }, + "meta": { + "$ref": "#/components/schemas/VersionMeta" + } + }, + "type": "object", + "required": [ + "data", + "meta" + ], + "title": "VersionDataResponse" + }, + "VersionListResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/VersionMeta" + }, + "type": "array", + "title": "Items" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "VersionListResponse" + }, + "VersionMeta": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "documentId": { + "type": "string", + "title": "Documentid" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label" + }, + "kind": { + "type": "string", + "enum": [ + "manual", + "auto" + ], + "title": "Kind" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "title": "Createdat" + }, + "annotationCount": { + "type": "integer", + "title": "Annotationcount" + } + }, + "type": "object", + "required": [ + "id", + "documentId", + "label", + "kind", + "createdAt", + "annotationCount" + ], + "title": "VersionMeta" + }, + "VersionRestoreResponse": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time", + "title": "Updatedat" + } + }, + "type": "object", + "required": [ + "updatedAt" + ], + "title": "VersionRestoreResponse" + } + } + } +} \ No newline at end of file diff --git a/shared/annotation-schema.json b/shared/annotation-schema.json index accf8c2..bd1e3fd 100644 --- a/shared/annotation-schema.json +++ b/shared/annotation-schema.json @@ -104,7 +104,9 @@ "kind": { "type": "string", "enum": ["rect", "ellipse", "line", "arrow"] }, "strokeColor": { "type": "string", "default": "#000000" }, "fillColor": { "type": "string", "default": "transparent" }, - "strokeWidth": { "type": "number", "default": 2 } + "strokeWidth": { "type": "number", "default": 2 }, + "start": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 }, + "end": { "type": "array", "items": { "type": "number" }, "minItems": 2, "maxItems": 2 } }, "required": ["kind"] } From 65abb5154e5032b8361f799c23daef7505c36edf Mon Sep 17 00:00:00 2001 From: Elijah Date: Sat, 15 Aug 2026 11:07:59 -0700 Subject: [PATCH 2/2] Consolidate Docker deployment into a single PaperJet container --- .dockerignore | 20 ++++++++ .env.example | 6 ++- .forgejo/workflows/build.yml | 25 --------- .forgejo/workflows/ci.yml | 70 ++++++++++++++++++++++++++ Dockerfile | 55 ++++++++++++++++++++ Project Architecture.md | 98 ++++++++++++++++++------------------ README.md | 38 ++++++++++++-- backend/Dockerfile | 25 --------- backend/alembic/env.py | 4 +- docker-compose.yml | 32 ++++++------ docker-entrypoint.sh | 36 +++++++++++++ frontend/Dockerfile | 24 --------- frontend/nginx.conf | 8 +-- 13 files changed, 290 insertions(+), 151 deletions(-) create mode 100644 .dockerignore delete mode 100644 .forgejo/workflows/build.yml create mode 100644 Dockerfile delete mode 100644 backend/Dockerfile create mode 100644 docker-entrypoint.sh delete mode 100644 frontend/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9d0edc8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,20 @@ +.git +.forgejo +.env +.env.* +!.env.example + +frontend/node_modules +frontend/dist + +**/__pycache__ +**/*.py[cod] +**/.pytest_cache +**/.mypy_cache +**/.ruff_cache +**/*.egg-info + +*.sqlite +*.sqlite-shm +*.sqlite-wal +*.log diff --git a/.env.example b/.env.example index cb63f2f..e0cf067 100644 --- a/.env.example +++ b/.env.example @@ -40,9 +40,13 @@ COOKIE_SECURE=false # -------------------------------------------- # Networking # -------------------------------------------- -# Port the frontend container publishes. Your outer reverse proxy targets this. +# Port the PaperJet container publishes. Your outer reverse proxy targets this. HTTP_PORT=4982 +# Optional image reference for a pulled Forgejo build. +# Leave unset for local builds; set this before docker compose pull in production. +# PAPERJET_IMAGE=git.elijahkuntz.com/your-user/paperjet:latest + # -------------------------------------------- # Debug # -------------------------------------------- diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml deleted file mode 100644 index 4ed4ca5..0000000 --- a/.forgejo/workflows/build.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Automated Container Build - -on: - push: - branches: - - main - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Log into Local Registry - run: | - echo "${{ secrets.FORGEJO_PAT }}" | docker login git.elijahkuntz.com -u "${{ gitea.actor }}" --password-stdin - - - name: Build and Push Image - run: | - # Force the entire image path string to lowercase dynamically - IMAGE_PATH=$(echo "git.elijahkuntz.com/${{ gitea.actor }}/${{ github.event.repository.name }}:latest" | tr '[:upper:]' '[:lower:]') - - docker build -t "$IMAGE_PATH" . - docker push "$IMAGE_PATH" \ No newline at end of file diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 39f912e..994bcdc 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -69,3 +69,73 @@ jobs: - name: Test (vitest) working-directory: frontend run: npx vitest run + + container: + name: Container (Docker) + runs-on: ubuntu-latest + needs: [backend, frontend] + + steps: + - uses: actions/checkout@v4 + + - name: Validate Compose configuration + run: docker compose --env-file .env.example config --quiet + + - name: Build container image + run: | + IMAGE_PATH=$(printf 'git.elijahkuntz.com/${{ gitea.actor }}/${{ github.event.repository.name }}' | tr '[:upper:]' '[:lower:]') + docker build \ + -t paperjet:ci \ + -t "$IMAGE_PATH:latest" \ + -t "$IMAGE_PATH:${{ github.sha }}" \ + . + + - name: Run container smoke test + run: | + set -Eeuo pipefail + + docker run \ + --detach \ + --name paperjet-ci \ + --publish 18080:80 \ + --env PAPERJET_SECRET_KEY=ci-only-secret \ + --env PAPERJET_COOKIE_SECURE=false \ + --env PAPERJET_DEBUG=false \ + paperjet:ci + + cleanup() { + docker rm --force paperjet-ci >/dev/null 2>&1 || true + } + trap cleanup EXIT + + curl --fail --retry 30 --retry-delay 1 --retry-connrefused \ + http://127.0.0.1:18080/ + curl --fail --retry 30 --retry-delay 1 --retry-connrefused \ + http://127.0.0.1:18080/api/v1/health + + for attempt in $(seq 1 30); do + status=$(docker inspect --format '{{.State.Health.Status}}' paperjet-ci) + if [ "$status" = "healthy" ]; then + exit 0 + fi + if [ "$status" = "unhealthy" ]; then + docker logs paperjet-ci + exit 1 + fi + sleep 1 + done + + docker logs paperjet-ci + exit 1 + + - name: Log into Local Registry + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + run: | + echo "${{ secrets.FORGEJO_PAT }}" | docker login git.elijahkuntz.com -u "${{ gitea.actor }}" --password-stdin + + - name: Push main image tags + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + run: | + IMAGE_PATH=$(printf 'git.elijahkuntz.com/${{ gitea.actor }}/${{ github.event.repository.name }}' | tr '[:upper:]' '[:lower:]') + docker push "$IMAGE_PATH:latest" + docker push "$IMAGE_PATH:${{ github.sha }}" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0282e40 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +# syntax=docker/dockerfile:1 + +# Build the React/Vite application first so the runtime image contains only +# the compiled frontend and the Python/nginx runtime. +FROM node:22-alpine AS frontend-build + +WORKDIR /frontend + +COPY frontend/package.json frontend/package-lock.json ./ +RUN npm ci --legacy-peer-deps + +COPY frontend/ ./ +RUN npm run build + +# The runtime image contains both public-facing nginx and the loopback-only +# FastAPI/uvicorn process. This keeps deployment to one container while +# preserving the existing nginx -> API boundary. +FROM python:3.12-slim AS runtime + +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=/app + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash \ + fontconfig \ + fonts-liberation \ + nginx \ + && rm -rf /var/lib/apt/lists/* \ + && fc-cache -fv \ + && rm -f /etc/nginx/sites-enabled/default /etc/nginx/conf.d/default.conf + +WORKDIR /app + +# Copy the source tree into /app before installing so the runtime can resolve +# the local package (including bundled signature fonts) from PYTHONPATH. +COPY backend/pyproject.toml ./ +COPY backend/app ./app +RUN pip install --no-cache-dir . + +COPY --from=frontend-build /frontend/dist /usr/share/nginx/html +COPY frontend/nginx.conf /etc/nginx/conf.d/default.conf +COPY docker-entrypoint.sh /usr/local/bin/paperjet-entrypoint + +RUN chmod +x /usr/local/bin/paperjet-entrypoint \ + && nginx -t \ + && mkdir -p /data/pdfs /data/thumbnails /data/db + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ + CMD ["python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1/api/v1/health', timeout=3)"] + +ENTRYPOINT ["paperjet-entrypoint"] diff --git a/Project Architecture.md b/Project Architecture.md index e22db8e..2a934a5 100644 --- a/Project Architecture.md +++ b/Project Architecture.md @@ -1,10 +1,10 @@ # Self-Hosted PDF Editor — Implementation Plan **Project codename:** `paperjet` (rename freely) -**Document version:** 1.1 +**Document version:** 1.2 **Status:** Foundational specification — this document is the single source of truth. Every AI agent working on this project reads this file first, in full, before writing code. -> **v1.1 changes:** resolved the four open questions — upload ceiling set to 200 MB; versioning reframed around accidental-loss recovery with a document-level **trash/restore** added as the primary safety net; cookie/proxy behavior pinned (direct HTTP for dev only, everything through the HTTPS proxy in production); signature capture specified as **draw + type-to-signature with live multi-font preview**. +> **v1.2 changes:** the runtime deployment is consolidated into one Docker image containing nginx, the compiled SPA, and FastAPI/uvicorn. The existing v1.1 decisions remain unchanged. --- @@ -12,7 +12,7 @@ A self-hosted, single-user, browser-based PDF editor with a Sejda-style annotation workflow. The user adds text boxes, freehand drawing, signatures, images, highlights, and shapes onto a PDF, moves and resizes them freely, and exports a flattened PDF. The application persists work continuously (autosave), keeps a per-file version history, and supports undo/redo. -It runs on the user's own server via Docker Compose, is reachable over LAN and over WAN through an nginx reverse proxy, and is protected by a single password. It depends on **no external programs, no external containers, and no third-party APIs**. Libraries and packages bundled into the application's own containers are permitted. +It runs on the user's own server via Docker Compose, is reachable over LAN and over WAN through an nginx reverse proxy, and is protected by a single password. It depends on **no external programs, no external containers, and no third-party APIs**. Libraries and packages bundled into the application image are permitted. ### Non-goals (v1) - Multi-user collaboration / real-time co-editing @@ -78,8 +78,8 @@ Because the app is WAN-exposed, auth is a real login screen backed by an Argon2i | ORM | SQLAlchemy 2.x | With Alembic for migrations | | Database | SQLite (WAL mode) | Single-user scale; embedded, no extra container | | Password hashing | Argon2id (`argon2-cffi`) | | -| Web server (frontend) | nginx | Serves the static React build; also the app-internal entry | -| ASGI server (backend) | uvicorn | Behind nginx | +| Web server | nginx | Serves the static React build and proxies /api to loopback uvicorn | +| ASGI server | uvicorn | Runs on loopback inside the same application image | | Orchestration | Docker Compose | | | External programs / containers / APIs | **None** | Hard requirement | @@ -98,43 +98,44 @@ Because the app is WAN-exposed, auth is a real login screen backed by an Argon2i ┌─────────────▼─────────────────────────────┐ │ Docker Compose │ │ │ - │ ┌──────────────┐ ┌────────────────┐ │ - │ │ frontend │ │ backend │ │ - │ │ nginx │─────▶│ FastAPI │ │ - │ │ serves SPA │ /api │ uvicorn │ │ - │ │ proxies /api│ │ PyMuPDF │ │ - │ └──────────────┘ │ SQLAlchemy │ │ - │ └───────┬────────┘ │ - │ │ │ - │ ┌──────────▼────────┐ │ - │ │ volumes │ │ - │ │ pdf_storage/ │ │ - │ │ thumbnails/ │ │ - │ │ db/app.sqlite │ │ - │ └───────────────────┘ │ + │ ┌──────────────────────────────────────┐ │ + │ │ paperjet image │ │ + │ │ nginx :80 ── /api ──▶ uvicorn :8000 │ │ + │ │ React SPA FastAPI + PyMuPDF │ │ + │ └───────────────────┬──────────────────┘ │ + │ │ │ + │ ┌──────────▼────────┐ │ + │ │ volumes │ │ + │ │ pdf_storage/ │ │ + │ │ thumbnails/ │ │ + │ │ db/app.sqlite │ │ + │ └───────────────────┘ │ └────────────────────────────────────────────┘ ``` -- The `frontend` nginx serves the SPA and reverse-proxies `/api/*` to the `backend`. This means the browser sees a single origin — no CORS complexity, cookies "just work." -- The user's outer reverse proxy points at the `frontend` container's published port. +- The single `paperjet` container serves the SPA and reverse-proxies `/api/*` to its loopback-only FastAPI process. The browser sees a single origin — no CORS complexity, cookies "just work." +- The user's outer reverse proxy points at the published port of the `paperjet` container. --- ## 5. Repository Structure -A single monorepo. Two deployable images. +A single monorepo with one deployable runtime image. The Dockerfile uses a +Node build stage and a Python/nginx runtime stage. ``` paperjet/ ├── README.md ├── ARCHITECTURE.md # symlink or copy of THIS plan; agents read first ├── docker-compose.yml +├── Dockerfile +├── docker-entrypoint.sh +├── .dockerignore ├── .env.example -├── .github/workflows/ci.yml # lint + typecheck + test on push +├── .forgejo/workflows/ci.yml # lint, tests, image build, and publish │ ├── frontend/ -│ ├── Dockerfile # multi-stage: build SPA, serve via nginx -│ ├── nginx.conf # SPA fallback + /api proxy +│ ├── nginx.conf # SPA fallback + loopback /api proxy │ ├── package.json │ ├── tsconfig.json # strict: true │ ├── vite.config.ts @@ -163,7 +164,6 @@ paperjet/ │ └── types/ # generated from backend OpenAPI │ ├── backend/ -│ ├── Dockerfile │ ├── pyproject.toml │ ├── alembic/ # migrations │ └── app/ @@ -342,7 +342,7 @@ In-document accidental edits during a single session are also covered by the in- - The registry is a dict `{type: handler}`; adding a type adds a handler, nothing else. - Missing handler → log + skip, never crash (§7.3). - Export accepts an optional `versionId` to export a historical version instead of the working state. -- Fonts: bundle inside the backend image (no external program) two font sets so server export matches the live editor exactly: (a) standard-metric fonts — the Liberation family for Helvetica/Times/Courier compatibility — for `text` annotations; and (b) a small curated set of **signature/script fonts** for typed signatures (§7.2, §12.5), the same faces offered in the editor's live preview. Embed used fonts into the output for portability. +- Fonts: bundle inside the application image (no external program) two font sets so server export matches the live editor exactly: (a) standard-metric fonts — the Liberation family for Helvetica/Times/Courier compatibility — for `text` annotations; and (b) a small curated set of **signature/script fonts** for typed signatures (§7.2, §12.5), the same faces offered in the editor's live preview. Embed used fonts into the output for portability. ### 9.4 Assets (binary annotation payloads) - `POST /documents/{id}/assets` (multipart) stores a signature PNG or placed image on the `pdf_storage` volume, returns `{ ref }`. @@ -499,29 +499,29 @@ Target the Sejda feel: bright, airy, light mode, generous whitespace, a restrain ## 13. Docker Compose & Deployment ```yaml -# docker-compose.yml (illustrative; agents finalize) +# docker-compose.yml services: - backend: - build: ./backend + paperjet: + image: ${PAPERJET_IMAGE:-paperjet:local} + build: + context: . + dockerfile: Dockerfile environment: - - SECRET_KEY=${SECRET_KEY} - - MAX_UPLOAD_MB=${MAX_UPLOAD_MB:-200} - - TRASH_RETENTION_DAYS=${TRASH_RETENTION_DAYS:-30} - - AUTO_VERSION_RETENTION_DAYS=${AUTO_VERSION_RETENTION_DAYS:-30} - - COOKIE_SECURE=${COOKIE_SECURE:-false} # false for direct-HTTP dev; set true in production (behind the HTTPS proxy) + PAPERJET_SECRET_KEY: ${SECRET_KEY:?Set SECRET_KEY in .env before starting PaperJet} + PAPERJET_MAX_UPLOAD_MB: ${MAX_UPLOAD_MB:-200} + PAPERJET_TRASH_RETENTION_DAYS: ${TRASH_RETENTION_DAYS:-30} + PAPERJET_AUTO_VERSION_RETENTION_DAYS: ${AUTO_VERSION_RETENTION_DAYS:-30} + PAPERJET_COOKIE_SECURE: ${COOKIE_SECURE:-false} + PAPERJET_DATABASE_PATH: /data/db/app.sqlite + PAPERJET_PDF_STORAGE_PATH: /data/pdfs + PAPERJET_THUMBNAILS_PATH: /data/thumbnails + PAPERJET_DEBUG: ${DEBUG:-false} volumes: - pdf_storage:/data/pdfs - thumbnails:/data/thumbnails - db:/data/db - expose: - - "8000" - restart: unless-stopped - - frontend: - build: ./frontend - depends_on: [backend] ports: - - "${HTTP_PORT:-8080}:80" # user's outer reverse proxy targets this + - "${HTTP_PORT:-4982}:80" restart: unless-stopped volumes: @@ -530,10 +530,10 @@ volumes: db: ``` -- `frontend/nginx.conf` serves the SPA with history-API fallback and proxies `/api/` to `backend:8000`, passing through cookies and the `X-Requested-With` header. Set `client_max_body_size` to match `MAX_UPLOAD_MB` (≥200 MB) so large PDFs aren't rejected at the proxy layer — and remind the user to raise the same limit in their **outer** reverse proxy, since that's the other place a large upload can be silently truncated. +- `frontend/nginx.conf` serves the SPA with history-API fallback and proxies `/api/` to `127.0.0.1:8000`, passing through cookies and the `X-Requested-With` header. Set `client_max_body_size` to match `MAX_UPLOAD_MB` (≥200 MB) so large PDFs aren't rejected at the proxy layer — and remind the user to raise the same limit in their **outer** reverse proxy, since that's the other place a large upload can be silently truncated. - A 200 MB ceiling comfortably covers 100–200 page documents with embedded images; PDF.js page virtualization (§12.2) keeps the editor responsive on documents that large. -- Backend Dockerfile installs Python deps and the bundled fonts; PyMuPDF comes from its wheel (no system packages, no external programs). -- Frontend Dockerfile is multi-stage: Node builds the SPA, the result is copied into an nginx image. +- The root Dockerfile builds the SPA with Node, installs production Python dependencies and bundled fonts, and copies both into one nginx/Python runtime image. +- docker-entrypoint.sh supervises nginx and loopback uvicorn so a failed child process stops the container cleanly. - All persistent state lives in named volumes mountable on the user's Unraid array. Document the volume → host-path mapping for backups. --- @@ -563,7 +563,7 @@ Every agent (Claude / Codex / Gemini) follows these. Paste this section (or the 3. **One coordinate-transform module.** All space conversions go through `lib/coords.ts`. Never compute transforms inline in a component or duplicate the logic. Canonical space is always PDF points, top-left origin (§8). 4. **Store coordinates only in canonical space.** Never persist screen pixels. 5. **Types are generated, not hand-written.** After any backend schema change, regenerate the OpenAPI types for the frontend. Keep the TS annotation union and the Pydantic models in sync with `shared/annotation-schema.json`. -6. **No external programs, containers, or third-party APIs.** Libraries/packages bundled into the existing two images are fine. If a task seems to need an external dependency, stop and flag it; do not add one. +6. **No external programs, containers, or third-party APIs.** Libraries/packages bundled into the application image are fine. If a task seems to need an external dependency, stop and flag it; do not add one. 7. **Extend via registries.** New annotation types/tools register themselves; never scatter `switch(type)` logic across the codebase. Unknown types must round-trip without crashing. 8. **Security code is review-gated.** Do not modify auth, session, hashing, upload validation, or path handling without explicitly calling it out for review. Never log secrets or password material. 9. **Tests are required for the risk areas:** the coordinate module (round-trip + cross-engine), the export renderer per handler, auth flows, and upload validation. A feature touching these isn't done until its tests pass. @@ -580,7 +580,7 @@ Every agent (Claude / Codex / Gemini) follows these. Paste this section (or the Sequenced so each phase is independently testable and the riskiest correctness work (coordinates, export) is validated early. **Phase 0 — Scaffolding** -Monorepo, both Dockerfiles, compose, `.env.example`, CI (lint/typecheck/test), nginx config, empty FastAPI app with `/health`, SPA shell with routing. *Done when:* `docker compose up` serves a blank authenticated-shell app and `/api/v1/health` responds. +Monorepo, the root Dockerfile and entrypoint, single-service Compose, `.env.example`, CI (lint/typecheck/test/container smoke), nginx config, empty FastAPI app with `/health`, SPA shell with routing. *Done when:* `docker compose up` serves a blank authenticated-shell app and `/api/v1/health` responds. **Phase 1 — Auth & Library core** First-run setup, login/logout, session cookie, rate limiting. Upload (button + drag-drop), document list, thumbnails, soft delete + **trash/restore** (single + bulk, empty trash, retention purge sweep), home page (recent + library + trash). *Done when:* a user can log in, upload, see, delete, and restore PDFs. @@ -616,4 +616,4 @@ All four open questions are now settled: --- -*End of plan v1.1. Amendments are made to this document first, then to code.* +*End of plan v1.2. Amendments are made to this document first, then to code.* diff --git a/README.md b/README.md index e20ef30..f70815f 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,34 @@ PaperJet is a self-hosted, single-user PDF annotation editor. It keeps the uploa 1. Copy `.env.example` to `.env`. 2. Replace `SECRET_KEY` with a long random value. Compose refuses to start without it. -3. Start the stack: +3. Build and start the single-container application: ```sh docker compose up --build -d ``` -Open `http://localhost:4982` (or the value of `HTTP_PORT`). The first visit asks you to create the single master password. +The container serves the React application through nginx and proxies `/api` +requests to the loopback-only FastAPI process. Open `http://localhost:4982` +(or the value of `HTTP_PORT`). The first visit asks you to create the single +master password. -The `db`, `pdf_storage`, and `thumbnails` volumes contain application data. Back them up before maintenance or upgrades. Put the frontend behind HTTPS when exposing PaperJet beyond localhost and set `COOKIE_SECURE=true`. +The `db`, `pdf_storage`, and `thumbnails` volumes contain application data. +Back them up before maintenance or upgrades. Put the frontend behind HTTPS +when exposing PaperJet beyond localhost and set `COOKIE_SECURE=true`. + +### Run a Forgejo-published image + +Set `PAPERJET_IMAGE` in `.env` to the desired registry tag, for example the +`latest` or commit-SHA tag published by Forgejo. Then pull and start without +building locally: + +```sh +docker compose pull +docker compose up -d --no-build +``` + +The published image exposes only port 80. Your outer reverse proxy should +target the Compose port configured by `HTTP_PORT`. ## Development @@ -39,6 +58,12 @@ The Vite server proxies `/api` to `http://localhost:8000`. ## Validation ```sh +# container +docker compose --env-file .env.example config --quiet +docker compose up --build -d +curl http://localhost:4982/api/v1/health +docker compose ps + # frontend cd frontend npm test -- --run @@ -53,4 +78,9 @@ mypy app/ ruff check . ``` -The editor uses PDF.js for display and PyMuPDF for export. Stored annotation coordinates are PDF points with a top-left origin relative to the unrotated CropBox; this is the contract shared by the editor and export renderer. +Stop the local stack with `docker compose down`. Do not use `-v` unless you +intend to remove the local application volumes. + +The editor uses PDF.js for display and PyMuPDF for export. Stored annotation +coordinates are PDF points with a top-left origin relative to the unrotated +CropBox; this is the contract shared by the editor and export renderer. diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 0879421..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM python:3.12-slim AS backend - -# System dependencies: fonts for PDF export + fontconfig -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - fonts-liberation \ - fontconfig && \ - rm -rf /var/lib/apt/lists/* && \ - fc-cache -fv - -WORKDIR /app - -# Install Python dependencies -COPY pyproject.toml ./ -RUN pip install --no-cache-dir -e ".[dev]" - -# Copy application code -COPY . . - -# Create data directories (will be overridden by volume mounts) -RUN mkdir -p /data/pdfs /data/thumbnails /data/db - -EXPOSE 8000 - -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"] diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 23ba9db..63a7402 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -2,11 +2,11 @@ from logging.config import fileConfig -from alembic import context from sqlalchemy import engine_from_config, pool +from alembic import context from app.db import Base -from app.models import * # noqa: F401, F403 — ensure all models are imported +from app.models import * # noqa: F403 — ensure all models are imported config = context.config if config.config_file_name is not None: diff --git a/docker-compose.yml b/docker-compose.yml index c8388d4..4567c1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,27 +1,23 @@ services: - backend: - build: ./backend + paperjet: + image: ${PAPERJET_IMAGE:-paperjet:local} + build: + context: . + dockerfile: Dockerfile environment: - - PAPERJET_SECRET_KEY=${SECRET_KEY:?Set SECRET_KEY in .env before starting PaperJet} - - PAPERJET_MAX_UPLOAD_MB=${MAX_UPLOAD_MB:-200} - - PAPERJET_TRASH_RETENTION_DAYS=${TRASH_RETENTION_DAYS:-30} - - PAPERJET_AUTO_VERSION_RETENTION_DAYS=${AUTO_VERSION_RETENTION_DAYS:-30} - - PAPERJET_COOKIE_SECURE=${COOKIE_SECURE:-false} - - PAPERJET_DATABASE_PATH=/data/db/app.sqlite - - PAPERJET_PDF_STORAGE_PATH=/data/pdfs - - PAPERJET_THUMBNAILS_PATH=/data/thumbnails - - PAPERJET_DEBUG=${DEBUG:-false} + PAPERJET_SECRET_KEY: ${SECRET_KEY:?Set SECRET_KEY in .env before starting PaperJet} + PAPERJET_MAX_UPLOAD_MB: ${MAX_UPLOAD_MB:-200} + PAPERJET_TRASH_RETENTION_DAYS: ${TRASH_RETENTION_DAYS:-30} + PAPERJET_AUTO_VERSION_RETENTION_DAYS: ${AUTO_VERSION_RETENTION_DAYS:-30} + PAPERJET_COOKIE_SECURE: ${COOKIE_SECURE:-false} + PAPERJET_DATABASE_PATH: /data/db/app.sqlite + PAPERJET_PDF_STORAGE_PATH: /data/pdfs + PAPERJET_THUMBNAILS_PATH: /data/thumbnails + PAPERJET_DEBUG: ${DEBUG:-false} volumes: - pdf_storage:/data/pdfs - thumbnails:/data/thumbnails - db:/data/db - ports: - - "8000:8000" - restart: unless-stopped - - frontend: - build: ./frontend - depends_on: [backend] ports: - "${HTTP_PORT:-4982}:80" restart: unless-stopped diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..9d96914 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +uvicorn --app-dir /app app.main:app \ + --host 127.0.0.1 \ + --port 8000 \ + --workers 1 & +backend_pid=$! + +nginx -g "daemon off;" & +nginx_pid=$! + +stop_children() { + kill -TERM "$backend_pid" "$nginx_pid" 2>/dev/null || true + wait "$backend_pid" 2>/dev/null || true + wait "$nginx_pid" 2>/dev/null || true +} + +shutdown() { + trap - TERM INT + stop_children + exit 143 +} + +trap shutdown TERM INT + +# If either service exits, stop the other one and let Docker restart/report the +# container rather than leaving a partially working instance running. +set +e +wait -n "$backend_pid" "$nginx_pid" +exit_code=$? +set -e + +stop_children +exit "$exit_code" diff --git a/frontend/Dockerfile b/frontend/Dockerfile deleted file mode 100644 index e1c8fe5..0000000 --- a/frontend/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Stage 1: Build the SPA -FROM node:22-alpine AS build - -WORKDIR /app -COPY package.json package-lock.json ./ -RUN npm install --legacy-peer-deps -COPY . . -RUN npm run build - -# Stage 2: Serve via nginx -FROM nginx:alpine - -# Remove default nginx config -RUN rm /etc/nginx/conf.d/default.conf - -# Copy our nginx config -COPY nginx.conf /etc/nginx/conf.d/default.conf - -# Copy built SPA from build stage -COPY --from=build /app/dist /usr/share/nginx/html - -EXPOSE 80 - -CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 7f1e76c..b8a0a62 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -2,10 +2,12 @@ server { listen 80; server_name _; + access_log /dev/stdout; + error_log /dev/stderr warn; + include /etc/nginx/mime.types; types { application/javascript mjs; - application/wasm wasm; } # Match MAX_UPLOAD_MB — raise in both this and the outer reverse proxy @@ -25,9 +27,9 @@ server { try_files $uri $uri/ /index.html; } - # Proxy /api/ to the backend container + # Proxy /api/ to the loopback-only FastAPI process in this container location /api/ { - proxy_pass http://backend:8000; + proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Ci3GeM!E0^e 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 cQ8&*x}opOcTk7HdZ_UZGO$A^ENaOu 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�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