lakshmivairamani's picture
Update app.py
82b2db4 verified
import os
import logging
from fastapi import FastAPI, File, UploadFile, HTTPException, APIRouter, Form, Request
from pydantic import BaseModel
from services.file_upload_service import FileHandler
from services.chat_service import ChatAgentService
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
import mysql.connector
# Create the FastAPI app
app = FastAPI(title="RedmindGen", description="Chat with your Data", version="1.0.0")
# Load environment variables from .env file
load_dotenv()
# Get the path to the vector database
vector_db_path_documents = os.getenv('VECTOR_DB_PATH_DOCUMENTS')
# Mount static files
app.mount("/static", StaticFiles(directory="static"), name="static")
# Jinja2 templates
templates = Jinja2Templates(directory="templates")
#log handling
LOG_PATH = os.getenv('LOG_PATH')
LOG_FILENAME = "redmindgen.log"
full_log_path = os.path.join(LOG_PATH, LOG_FILENAME)
# Configure logging
logging.basicConfig(filename="test.log", level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info("File upload start")
# Configure CORS
origins = [
"http://localhost:8000", # Adjust this to the origins you want to allow
"http://127.0.0.1:8000", # Example: Frontend running on a different port
"http://167.71.75.10:8003/"
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # Allows specified origins (use ["*"] for all origins)
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
@app.get("/")
async def read_root(request: Request):
"""
Root endpoint that returns the index.html template.
"""
return templates.TemplateResponse("index.html", {"request": request})
def verify_user(username: str, password: str):
"""
Function to verify user credentials by checking the username and password in the database.
Returns "success" if the user is logged in, otherwise returns "failure".
"""
# Connect to MySQL database
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123',
host='217.21.88.10',
database='u852023448_redmindgpt')
# Create a cursor object
cursor = cnx.cursor()
# Execute the query
query = "SELECT * FROM user_detail WHERE username = %s AND password = %s"
values = (username, password) # Replace with actual values from the front end
cursor.execute(query, values)
# Fetch the result
result = cursor.fetchone()
# Check if the result is not None
if result is not None:
# User is logged in
return "success"
else:
# User is not logged in
return "failure"
# Close the cursor and connection
cursor.close()
cnx.close()
@app.post("/validate-user")
async def validate_user(request: Request, username: str = Form(...), password: str = Form(...)):
"""
Endpoint to validate user credentials.
If the credentials are valid, it returns the dashboard.html template.
Otherwise, it returns the index.html template.
"""
status = verify_user(username, password)
if status == 'success':
return templates.TemplateResponse("dashboard.html", {"request": request, "username": username})
else:
return templates.TemplateResponse("index.html", {"request": request})
@app.get("/knowledgebase")
async def knowledgebase(request: Request):
"""
Endpoint for the knowledgebase page.
Returns the knowledgebase.html template.
"""
return templates.TemplateResponse("knowledgebase.html", {"request": request})
@app.get("/chatbot")
async def chatbot(request: Request):
"""
Endpoint for the knowledgebase page.
Returns the knowledgebase.html template.
"""
return templates.TemplateResponse("chatpage.html", {"request": request})
@app.get("/company_profile")
async def company_profile(request: Request):
"""
Endpoint for the company profile page.
Returns the company_profile.html template.
"""
return templates.TemplateResponse("company_profile.html", {"request": request})
@app.get("/data_connectors")
async def data_connectors(request: Request):
"""
Endpoint for the company profile page.
Returns the company_profile.html template.
"""
return templates.TemplateResponse("data_connectors.html", {"request": request})
@app.get("/API_connectors")
async def API_connectors(request: Request):
"""
Endpoint for the company profile page.
Returns the company_profile.html template.
"""
return templates.TemplateResponse("API_connectors.html", {"request": request})
@app.post("/upload_file/")
async def upload_file(
file: UploadFile = File(..., description="Upload a file"),
document_name: str = Form(..., description="The name of the document."),
document_description: str = Form(..., description="A brief description of the document."),
department: str = Form(..., description="The department associated with the document."),
version: str = Form(..., description="The version of the document."),
last_updated: str = Form(..., description="The date when the document was last updated.")
):
"""
Endpoint to handle file uploads.
It validates the file type and calls the FileHandler to handle the file upload.
Returns the result of the file upload."""
print("upload_file called")
allowed_extensions = {'txt', 'pdf', 'docx', 'csv', 'xlsx'}
if file.filename.split('.')[-1].lower() not in allowed_extensions:
raise HTTPException(status_code=400,
detail="Unsupported file type. Supported types: TXT, PDF, DOCX, CSV, XLSX.")
try:
file_handler = FileHandler(vector_db_path=vector_db_path_documents)
print(vector_db_path_documents)
result = await file_handler.handle_file_upload(file, document_name, document_description, department, version,
last_updated)
print("result")
return result
except Exception as e:
logging.error(f"Error handling file uploads: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
@app.post("/chat_with_agent")
async def chat_with_agent(request: Request, user_question: str = Form(...)):
"""
Endpoint to chat with the chat agent.
It calls the ChatAgentService to get the answer to the user's question.
Returns the answer.
"""
print(user_question)
chat_service = ChatAgentService()
try:
print("chat_with_agent called")
answer = chat_service.answer_question(user_question)
print("answer returned")
return answer
except Exception as e:
logging.error(f"Error in chat api: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))