1- import uuid
21from typing import Any
3-
4- from fastapi import APIRouter , HTTPException
5- from sqlmodel import func , select
6-
72from app .api .deps import CurrentUser , SessionDep
8- from app .models import Document , DocumentCreate , DocumentPublic , DocumentsPublic , DocumentUpdate , Message
3+ from app .models import Document , DocumentCreate , DocumentPublic
4+ from fastapi import APIRouter , BackgroundTasks , File , UploadFile , HTTPException
5+ from app .s3 import upload_file_to_s3 , generate_s3_url
96
107router = APIRouter (prefix = "/documents" , tags = ["documents" ])
11-
12-
13- @router .get ("/" , response_model = DocumentsPublic )
14- def read_documents (
15- session : SessionDep , current_user : CurrentUser , skip : int = 0 , limit : int = 100
16- ) -> Any :
17- """
18- Retrieve documents.
19- """
20-
21- if current_user .is_superuser :
22- count_statement = select (func .count ()).select_from (Document )
23- count = session .exec (count_statement ).one ()
24- statement = select (Document ).offset (skip ).limit (limit )
25- documents = session .exec (statement ).all ()
26- else :
27- count_statement = (
28- select (func .count ())
29- .select_from (Document )
30- .where (Document .owner_id == current_user .id )
31- )
32- count = session .exec (count_statement ).one ()
33- statement = (
34- select (Document )
35- .where (Document .owner_id == current_user .id )
36- .offset (skip )
37- .limit (limit )
38- )
39- documents = session .exec (statement ).all ()
40-
41- return DocumentsPublic (data = documents , count = count )
42-
43-
44- @router .get ("/{id}" , response_model = DocumentPublic )
45- def read_document (session : SessionDep , current_user : CurrentUser , id : uuid .UUID ) -> Any :
46- """
47- Get document by ID.
48- """
49- document = session .get (Document , id )
50- if not document :
51- raise HTTPException (status_code = 404 , detail = "Document not found" )
52- if not current_user .is_superuser and (document .owner_id != current_user .id ):
53- raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
54- return document
55-
56-
8+
579@router .post ("/" , response_model = DocumentPublic )
5810def create_document (
59- * , session : SessionDep , current_user : CurrentUser , document_in : DocumentCreate
60- ) -> Any :
61- """
62- Create new document.
63- """
11+ * , session : SessionDep , current_user : CurrentUser ,
12+ background_tasks : BackgroundTasks ,
13+ file : UploadFile = File (...),
14+ ):
15+ key = None
16+ try :
17+ user_id = current_user .id
18+ key = upload_file_to_s3 (file , current_user .id )
19+ except Exception as e :
20+ raise HTTPException (500 , f"Failed to upload file: { key } . Error: { str (e )} " )
21+
22+ try :
23+ url = generate_s3_url (key )
24+ except Exception as e :
25+ raise HTTPException (500 , f"Could not generate URL for file key: { key } " )
26+
27+ document_in = DocumentCreate (
28+ filename = file .filename ,
29+ content_type = file .content_type ,
30+ size = file .size ,
31+ s3_url = url ,
32+ )
33+
6434 document = Document .model_validate (document_in , update = {"owner_id" : current_user .id })
65- session .add (document )
66- session .commit ()
67- session .refresh (document )
68- return document
6935
7036
71- @router .put ("/{id}" , response_model = DocumentPublic )
72- def update_document (
73- * ,
74- session : SessionDep ,
75- current_user : CurrentUser ,
76- id : uuid .UUID ,
77- document_in : DocumentUpdate ,
78- ) -> Any :
79- """
80- Update an document.
81- """
82- document = session .get (Document , id )
83- if not document :
84- raise HTTPException (status_code = 404 , detail = "Document not found" )
85- if not current_user .is_superuser and (document .owner_id != current_user .id ):
86- raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
87- update_dict = document_in .model_dump (exclude_unset = True )
88- document .sqlmodel_update (update_dict )
8937 session .add (document )
9038 session .commit ()
9139 session .refresh (document )
92- return document
9340
41+ # 3. Kick off background job
42+ print ("Document created, starting background task..." )
43+ # background_tasks.add_task(generate_questions, document.id)
9444
95- @router .delete ("/{id}" )
96- def delete_document (
97- session : SessionDep , current_user : CurrentUser , id : uuid .UUID
98- ) -> Message :
99- """
100- Delete an document.
101- """
102- document = session .get (Document , id )
103- if not document :
104- raise HTTPException (status_code = 404 , detail = "Document not found" )
105- if not current_user .is_superuser and (document .owner_id != current_user .id ):
106- raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
107- session .delete (document )
108- session .commit ()
109- return Message (message = "Document deleted successfully" )
45+ return document
0 commit comments