diff --git a/app/shared/schemas.py b/app/shared/schemas.py index f860f45..2a91fd7 100644 --- a/app/shared/schemas.py +++ b/app/shared/schemas.py @@ -9,19 +9,6 @@ class SubmitSheet(BaseModel): author_id: str | None = None group_id: str = "default" tags: set[str] | None = set() - columns: dict | None = {} # TODO: implement/remove - - -class SubmitManual(BaseModel): # deprecated - result: str # should be a Metadata.to_json() - public: bool = False - author_id: str | None = None - group_id: str | None = None - tags: set[str] | None = set() - -# API REQUESTS BELOW -# TODO: replace existing schemas with these - class ArchiveUrl(BaseModel): url: str @@ -30,9 +17,6 @@ class ArchiveUrl(BaseModel): group_id: str | None tags: set[str] | None = set() -# API RESPONSES BELOW - - class ArchiveResult(BaseModel): id: str url: str diff --git a/app/web/main.py b/app/web/main.py index 3bd8962..cc7774c 100644 --- a/app/web/main.py +++ b/app/web/main.py @@ -1,24 +1,15 @@ import os -from celery.result import AsyncResult -from fastapi import FastAPI, Depends, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import JSONResponse +from fastapi import FastAPI, Depends from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from prometheus_fastapi_instrumentator import Instrumentator -from datetime import datetime -from sqlalchemy.orm import Session from loguru import logger -from app.shared.log import log_error from app.web.middleware import logging_middleware -from app.shared import schemas from app.shared.task_messaging import get_celery -from app.web.db import crud -from app.web.security import get_user_auth, token_api_key_auth, get_token_or_user_auth +from app.web.security import token_api_key_auth from app.web.config import VERSION, API_DESCRIPTION -from app.shared.db.database import get_db_dependency from app.web.events import lifespan from app.shared.settings import get_settings @@ -66,110 +57,4 @@ def app_factory(settings = get_settings()): logger.warning(f"MOUNTing local archive {settings.SERVE_LOCAL_ARCHIVE}") app.mount(settings.SERVE_LOCAL_ARCHIVE, StaticFiles(directory=local_dir), name=settings.SERVE_LOCAL_ARCHIVE) - - - # -----Submit URL and manipulate tasks. Bearer protected below - - - @app.get("/tasks/search-url", response_model=list[schemas.Archive], deprecated=True) # DEPRECATED - def search_by_url(url: str, skip: int = 0, limit: int = 100, archived_after: datetime = None, archived_before: datetime = None, db: Session = Depends(get_db_dependency), email=Depends(get_token_or_user_auth)): - return crud.search_archives_by_url(db, url.strip(), email, skip=skip, limit=limit, archived_after=archived_after, archived_before=archived_before) - - - @app.get("/tasks/sync", response_model=list[schemas.Archive], deprecated=True) # DEPRECATED - def search(skip: int = 0, limit: int = 100, db: Session = Depends(get_db_dependency), email=Depends(get_user_auth)): - return crud.search_archives_by_email(db, email, skip=skip, limit=limit) - - - @app.post("/tasks", status_code=201, deprecated=True) # DEPRECATED - def archive_tasks(archive: schemas.ArchiveCreate, email=Depends(get_token_or_user_auth)): - archive.author_id = email - url = archive.url - logger.info(f"new {archive.public=} task for {email=} and {archive.group_id=}: {url}") - if type(url) != str or len(url) <= 5: - raise HTTPException(status_code=422, detail=f"Invalid URL received: {url}") - logger.info("creating task") - - task = celery.signature("create_archive_task", args=[archive.model_dump_json()]).delay() - return JSONResponse({"id": task.id}) - - - @app.get("/archive/{task_id}", deprecated=True) # DEPRECATED - def lookup(task_id, db: Session = Depends(get_db_dependency), email=Depends(get_token_or_user_auth)): - return crud.get_archive(db, task_id, email) - - - @app.get("/tasks/{task_id}", deprecated=True) # DEPRECATED - def get_status(task_id, email=Depends(get_token_or_user_auth)): - logger.info(f"status check for user {email} task {task_id}") - task = AsyncResult(task_id, app=celery) - try: - if task.status == "FAILURE": - # *FAILURE* The task raised an exception, or has exceeded the retry limit. - # The :attr:`result` attribute then contains the exception raised by the task. - # https://docs.celeryq.dev/en/stable/_modules/celery/result.html#AsyncResult - raise task.result - - response = { - "id": task_id, - "status": task.status, - "result": task.result - } - return JSONResponse(jsonable_encoder(response, exclude_unset=True)) - - except Exception as e: - log_error(e) - return JSONResponse({ - "id": task_id, - "status": "FAILURE", - "result": {"error": str(e)} - }) - - - @app.delete("/tasks/{task_id}", deprecated=True) # DEPRECATED - def delete_task(task_id, db: Session = Depends(get_db_dependency), email=Depends(get_user_auth)): - logger.info(f"deleting task {task_id} request by {email}") - return JSONResponse({ - "id": task_id, - "deleted": crud.soft_delete_task(db, task_id, email) - }) - - # ----- Google Sheets Logic - - - @app.post("/sheet", status_code=201, deprecated=True) # DEPRECATED - def archive_sheet(sheet: schemas.SubmitSheet, email=Depends(get_user_auth), db: Session = Depends(get_db_dependency)): - logger.info(f"SHEET TASK for {sheet=}") - sheet.author_id = email - #NB: no longer working - if not crud.is_user_in_group(email, sheet.group_id): - raise HTTPException(status_code=403, detail="User does not have access to this group.") - task = celery.signature("create_sheet_task", args=[sheet.model_dump_json()]).delay() - return JSONResponse({"id": task.id}) - - - @app.post("/sheet_service", status_code=201, deprecated=True) # DEPRECATED - def archive_sheet_service(sheet: schemas.SubmitSheet, auth=Depends(token_api_key_auth)): - logger.info(f"SHEET TASK for {sheet=}") - sheet.author_id = sheet.author_id or "api-endpoint" - - task = celery.signature("create_sheet_task", args=[sheet.model_dump_json()]).delay() - return JSONResponse({"id": task.id}) - - # ----- endpoint to submit data archived elsewhere - - - @app.post("/submit-archive", status_code=201, deprecated=True) # DEPRECATED - def submit_manual_archive(manual: schemas.SubmitManual, auth=Depends(token_api_key_auth)): - raise HTTPException(status_code=410, detail="This endpoint is deprecated. Use /interop/submit-archive instead.") - # result = Metadata.from_json(manual.result) - # logger.info(f"MANUAL SUBMIT {result.get_url()} {manual.author_id}") - # manual.tags.add("manual") - # try: - # # archive_id = insert_result_into_db(result, manual.tags, manual.public, manual.group_id, manual.author_id, models.generate_uuid()) - # except sqlalchemy.exc.IntegrityError as e: - # log_error(e) - # raise HTTPException(status_code=422, detail=f"Cannot insert into DB due to integrity error") - # return JSONResponse({"id": archive_id}) - return app \ No newline at end of file