33from typing import List , Optional
44from pathlib import Path
55
6- from fastapi import APIRouter , File , UploadFile , Query , Form , BackgroundTasks
6+ from fastapi import APIRouter , File , UploadFile , Query , Form , BackgroundTasks , HTTPException
77from fastapi import Path as FastPath
88from fastapi .responses import JSONResponse
99from fastapi import HTTPException
1010
11- from app .crud import DocumentCrud , CollectionCrud
12- from app .models import Document
11+ from app .crud import DocumentCrud , CollectionCrud , get_project_by_id
12+ from app .models import Document , DocumentPublic , Message
1313from app .utils import APIResponse , load_description , get_openai_client
1414from app .api .deps import CurrentUser , SessionDep , CurrentUserOrgProject
1515from app .core .cloud import AmazonCloudStorage
2929@router .get (
3030 "/list" ,
3131 description = load_description ("documents/list.md" ),
32- response_model = APIResponse [List [Document ]],
32+ response_model = APIResponse [List [DocumentPublic ]],
3333)
3434def list_docs (
3535 session : SessionDep ,
36- current_user : CurrentUser ,
36+ current_user : CurrentUserOrgProject ,
3737 skip : int = Query (0 , ge = 0 ),
3838 limit : int = Query (100 , gt = 0 , le = 100 ),
3939):
40- crud = DocumentCrud (session , current_user .id )
40+ crud = DocumentCrud (session , current_user .project_id )
4141 data = crud .read_many (skip , limit )
4242 return APIResponse .success_response (data )
4343
4444
4545@router .post (
4646 "/upload" ,
4747 description = load_description ("documents/upload.md" ),
48- response_model = APIResponse [Document ],
48+ response_model = APIResponse [DocumentPublic ],
4949)
5050async def upload_doc (
5151 session : SessionDep ,
52- current_user : CurrentUser ,
52+ current_user : CurrentUserOrgProject ,
5353 src : UploadFile = File (...),
5454 background_tasks : BackgroundTasks = None ,
5555 target_format : Optional [str ] = Form (None ),
@@ -62,10 +62,16 @@ async def upload_doc(
6262 raise HTTPException (status_code = 400 , detail = str (e ))
6363
6464 # Upload the original document first
65- storage = AmazonCloudStorage (current_user )
65+ storage = AmazonCloudStorage (current_user . project_id )
6666 document_id = uuid4 ()
67- object_store_url = storage .put (src , Path (str (document_id )))
68- crud = DocumentCrud (session , current_user .id )
67+
68+ project = get_project_by_id (session = session , project_id = current_user .project_id )
69+ if project is None :
70+ raise HTTPException (404 , "Project not found" )
71+
72+ key = Path (str (project .storage_path ), str (document_id ))
73+ object_store_url = storage .put (src , key )
74+ crud = DocumentCrud (session , current_user .project_id )
6975 document = Document (
7076 id = document_id ,
7177 fname = src .filename ,
@@ -123,10 +129,10 @@ async def upload_doc(
123129 )
124130
125131
126- @router .get (
132+ @router .delete (
127133 "/remove/{doc_id}" ,
128134 description = load_description ("documents/delete.md" ),
129- response_model = APIResponse [Document ],
135+ response_model = APIResponse [Message ],
130136)
131137def remove_doc (
132138 session : SessionDep ,
@@ -138,18 +144,21 @@ def remove_doc(
138144 )
139145
140146 a_crud = OpenAIAssistantCrud (client )
141- d_crud = DocumentCrud (session , current_user .id )
147+ d_crud = DocumentCrud (session , current_user .project_id )
142148 c_crud = CollectionCrud (session , current_user .id )
143149
144150 document = d_crud .delete (doc_id )
145151 data = c_crud .delete (document , a_crud )
146- return APIResponse .success_response (data )
152+
153+ return APIResponse .success_response (
154+ Message (message = "Document Deleted Successfully" )
155+ )
147156
148157
149158@router .delete (
150159 "/remove/{doc_id}/permanent" ,
151160 description = load_description ("documents/permanent_delete.md" ),
152- response_model = APIResponse [Document ],
161+ response_model = APIResponse [Message ],
153162)
154163def permanent_delete_doc (
155164 session : SessionDep ,
@@ -161,9 +170,9 @@ def permanent_delete_doc(
161170 )
162171
163172 a_crud = OpenAIAssistantCrud (client )
164- d_crud = DocumentCrud (session , current_user .id )
173+ d_crud = DocumentCrud (session , current_user .project_id )
165174 c_crud = CollectionCrud (session , current_user .id )
166- storage = AmazonCloudStorage (current_user )
175+ storage = AmazonCloudStorage (current_user . project_id )
167176
168177 document = d_crud .read_one (doc_id )
169178
@@ -172,19 +181,31 @@ def permanent_delete_doc(
172181 storage .delete (document .object_store_url )
173182 d_crud .delete (doc_id )
174183
175- return APIResponse .success_response (document )
184+ return APIResponse .success_response (
185+ Message (message = "Document Permanently Deleted Successfully" )
186+ )
176187
177188
178189@router .get (
179190 "/info/{doc_id}" ,
180191 description = load_description ("documents/info.md" ),
181- response_model = APIResponse [Document ],
192+ response_model = APIResponse [DocumentPublic ],
182193)
183194def doc_info (
184195 session : SessionDep ,
185- current_user : CurrentUser ,
196+ current_user : CurrentUserOrgProject ,
186197 doc_id : UUID = FastPath (description = "Document to retrieve" ),
198+ include_url : bool = Query (
199+ False , description = "Include a signed URL to access the document"
200+ ),
187201):
188- crud = DocumentCrud (session , current_user .id )
189- data = crud .read_one (doc_id )
190- return APIResponse .success_response (data )
202+ crud = DocumentCrud (session , current_user .project_id )
203+ document = crud .read_one (doc_id )
204+
205+ doc_schema = DocumentPublic .model_validate (document , from_attributes = True )
206+
207+ if include_url :
208+ storage = AmazonCloudStorage (current_user .project_id )
209+ doc_schema .signed_url = storage .get_signed_url (document .object_store_url )
210+
211+ return APIResponse .success_response (doc_schema )
0 commit comments