from fastapi import FastAPI ,File, UploadFile,Form from pydantic import BaseModel from typing import List,Optional from components.mongoconnection import provideClient from components.checkaccountexists import checkAccount from components.filechecker import checkFile from components.getproblems import GetProblems from components.getdeep import GetDeepDive from components.getbreakdown import GetBreakdown from components.legal_points_agent import LegalKeyPoints from components.legal_deepdive_agent import LegalDeepDive from components.legal_breakdown_agent import LegalBreakdown from components.medical_points_agent import MedicalKeyPoints from components.medical_deepdive_agent import MedicalDeepDive from components.medical_breakdown_agent import MedicalBreakdown from components.research_deepdive_agent import ResearchDeepDive from components.research_points_agent import ResearchKeyPoints from components.research_breakdown_agent import ResearchBreakdown from fastapi.middleware.cors import CORSMiddleware from PyPDF2 import PdfReader import io import time origins=[ "http://localhost:3000", "https://askmydocs-three.vercel.app" ] app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) mclient=provideClient() db=mclient["askmydoc_db"] coll=db["askmydoc_col"] class Item(BaseModel): owner:str class Item2(BaseModel): owner: str filetype:str class QAI(BaseModel): owner:str files:List[str] question:str msg_type:str class QA2(BaseModel): owner:str files:List[str] class QA3(BaseModel): owner:str msg_type:str class QA4(BaseModel): owner:str msg_type:str files:List[str] @app.get("/") def read_root(): return {"Hello": "World"} @app.post("/setupaccount") def create_item(data: Item): print(data.owner) payload={ "owner":data.owner, "app_id":"askmydoc_v1", "files":[], "keypoints":[], "deepdive":[], "breakdown":[] } inserted=coll.insert_one(payload) if inserted.inserted_id: return {"status":True} else: return {"status":False} @app.post("/checkaccount") def checkaccount(data:Item): status=checkAccount(data.owner) print(data) if status==True: return {'status':True} else: return {"status":False} @app.post("/checkfile") def checkfileexistence(data:Item2): filechecksresponse=checkFile(data.owner,data.filetype) return filechecksresponse @app.post("/checkproblems") def checkProblems(data:QA4): problems=GetProblems(data.owner,data.msg_type,data.files) return problems @app.post("/checkdive") def checkProblems(data:QA4): DIVE=GetDeepDive(data.owner,data.msg_type,data.files) return DIVE @app.post("/checkbreakdown") def checkProblems(data:QA4): DIVE=GetBreakdown(data.owner,data.msg_type,files=data.files) return DIVE @app.post("/upload-files") async def upload_files( files: List[UploadFile] = File(...), owner: Optional[str] = Form(None), filetype:Optional[str]=Form(None) ): MAX_FILE_SIZE = 5 * 1024 * 1024 results = [] if len(files) > 2: return {"error":"maximum 2 files allowed"} try: for file in files: contents = await file.read() if len(contents) > MAX_FILE_SIZE: return { "error": f"File '{file.filename}' exceeds 5MB limit", "max_size": "5MB" } file_info = { "filename": file.filename, "content_type": file.content_type, "size": len(contents), "filetype":filetype } if file.content_type == "text/plain": # Decode text files - now we can safely return full content text_content = contents.decode("utf-8") file_info["content"] = text_content # Full content since we have size limit elif file.content_type == "application/pdf": # Extract text from PDF try: pdf_file = io.BytesIO(contents) pdf_reader = PdfReader(pdf_file) text_content = "" for page in pdf_reader.pages: text_content += page.extract_text() + "\n" file_info["content"] = text_content file_info["pages"] = len(pdf_reader.pages) except Exception as e: file_info["error"] = f"Failed to read PDF: {str(e)}" results.append(file_info) coll.update_one( {"owner": owner}, {"$push": {"files": {"$each": results}}} ) return {"status":True} except Exception as e: return {"status":False} @app.post("/legalproblems") def LegalProblems(data:QA2): documents=coll.find_one({"owner":data.owner}) print(data) content=[] if documents: checkifalreadypresent=GetProblems(data.owner,"legal",data.files) if len(checkifalreadypresent["problems"]) !=0: return checkifalreadypresent["problems"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) problems=LegalKeyPoints(content=content) payload={"type":"legal","problems":problems,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"keypoints": payload}} ) return {"problems":problems} else: return {"problems":None} @app.post("/legaldeepdive") def LegalDDive(data:QA2): documents=coll.find_one({"owner":data.owner}) content=[] if documents: checkifalreadypresent=GetDeepDive(data.owner,"legal",data.files) if len(checkifalreadypresent["dive"]) !=0: return checkifalreadypresent["dive"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) dive=LegalDeepDive(content=content) payload={"type":"legal","dive":dive,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"deepdive": payload}} ) return {"deepdive":dive} else: return {"deepdive":None} @app.post("/legalbreakdown") def LegalB(data:QA2): documents=coll.find_one({"owner":data.owner}) print(data) content=[] if documents: checkifalreadypresent=GetBreakdown(data.owner,"legal",data.files) if len(checkifalreadypresent["breakdown"])!=0: return checkifalreadypresent["breakdown"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) breakdown=LegalBreakdown(content=content) payload={"type":"legal","breakdown":breakdown,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"breakdown": payload}} ) return {"problems":breakdown} else: return {"problems":None} @app.post("/medicalproblems") def MedicalProblems(data:QA2): documents=coll.find_one({"owner":data.owner}) content=[] if documents: checkifalreadypresent=GetProblems(data.owner,"medical",data.files) if len(checkifalreadypresent["problems"]) !=0: return checkifalreadypresent["problems"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) problems=MedicalKeyPoints(content=content) payload={"type":"medical","problems":problems,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"keypoints": payload}} ) return {"problems":problems} else: return {"problems":None} @app.post("/medicaldeepdive") def MedicalDDive(data:QA2): documents=coll.find_one({"owner":data.owner}) content=[] if documents: checkifalreadypresent=GetDeepDive(data.owner,"medical",data.files) if len(checkifalreadypresent["dive"]) !=0: return checkifalreadypresent["dive"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) dive=MedicalDeepDive(content=content) payload={"type":"medical","dive":dive,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"deepdive": payload}} ) return {"deepdive":dive} else: return {"deepdive":None} @app.post("/medicalbreakdown") def MedicalB(data:QA2): documents=coll.find_one({"owner":data.owner}) print(data) content=[] if documents: checkifalreadypresent=GetBreakdown(data.owner,"medical",data.files) if len(checkifalreadypresent["breakdown"]) !=0: return checkifalreadypresent["breakdown"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) breakdown=MedicalBreakdown(content=content) payload={"type":"medical","breakdown":breakdown,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"breakdown": payload}} ) return {"problems":breakdown} else: return {"problems":None} @app.post("/researchproblems") def ResearchProblems(data:QA2): documents=coll.find_one({"owner":data.owner}) content=[] if documents: checkifalreadypresent=GetProblems(data.owner,"research",data.files) if len(checkifalreadypresent["problems"])!=0: return checkifalreadypresent["problems"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) problems=ResearchKeyPoints(content=content) payload={"type":"research","problems":problems,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"keypoints": payload}} ) return {"problems":problems} else: return {"problems":None} @app.post("/researchbreakdown") def ResearchB(data:QA2): documents=coll.find_one({"owner":data.owner}) print(data) content=[] if documents: checkifalreadypresent=GetBreakdown(data.owner,"research",data.files) if len(checkifalreadypresent["breakdown"]) !=0: return checkifalreadypresent["breakdown"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) breakdown=ResearchBreakdown(content=content) payload={"type":"research","breakdown":breakdown,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"breakdown": payload}} ) return {"problems":breakdown} else: return {"problems":None} @app.post("/researchdeepdive") def ResearchDDive(data:QA2): documents=coll.find_one({"owner":data.owner}) content=[] if documents: checkifalreadypresent=GetDeepDive(data.owner,"research",data.files) if len(checkifalreadypresent["dive"]) !=0: return checkifalreadypresent["dive"] for file in documents["files"]: if file["filename"] in data.files: content_payload=f""" FILENAME :{file["filename"]} CONTENT : {file["content"]} """ content.append(content_payload) dive=ResearchDeepDive(content=content) payload={"type":"research","dive":dive,"files":data.files} coll.update_one( {"owner": data.owner}, {"$push": {"deepdive": payload}} ) return {"deepdive":dive} else: return {"deepdive":None}