chatbotAPI / src /controllers /chat /chats_controller.py
dhruv4023's picture
Synced repo using 'sync_with_huggingface' Github Action
a3386d3 verified
from fastapi import APIRouter, Depends, Request, UploadFile
from src.config.databaseConfig import DATABASE
from src.config.appConfig import ENV_VAR
from src.helpers.pagination import *
from src.helpers.response import ResponseHandler
from src.helpers.upload_file_cloudinary import upload_file
from src.middleware.verifyToken import verify_token
router = APIRouter()
# Your route definitions
from typing import Dict, List
def convert_form_data_to_dict(form_data) -> Dict[str, List[str]]:
data_dict = {}
for key, value in form_data.items():
if isinstance(value, str):
if key in data_dict:
if isinstance(data_dict[key], list):
data_dict[key].append(value)
else:
data_dict[key] = [data_dict[key], value]
else:
data_dict[key] = value
elif isinstance(value, UploadFile):
# Handle UploadFile separately if needed
pass
else:
# Handle other types of values if needed
pass
# Convert keys with multiple values to lists
for key in data_dict:
if isinstance(data_dict[key], list) and len(data_dict[key]) > 1:
continue # Skip if it's already a list with multiple values
elif key in form_data.getlist():
data_dict[key] = form_data.getlist(key)
return data_dict
@router.post("/create")
async def create_chat(
req: Request, icon: UploadFile = None, tokenData=Depends(verify_token)
):
try:
username = tokenData["username"]
form_data = await req.form()
# payload = {key: form_data[key] for key in form_data if key != "picPath"}
# dt = {}
# print(convert_form_data_to_dict(form_data))
if icon is None:
return ResponseHandler.error(3007, None, 400)
file_data = await upload_file(
icon, form_data["collectionName"] + "_icon", "ChatIcons/"
)
icon_public_id = file_data["public_id"]
# print(icon_public_id)
# print(form_data["title"])
# print(form_data["templateContext"])
# print(form_data["collectionName"])
# print(form_data["sampleQuetions"])
# print(form_data)
# print(ENV_VAR.MONGO_DB_NAME_CHATS)
chat = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS]["chats"].insert_one(
{
"username": username,
"title": form_data["title"],
"templateContext": form_data["templateContext"],
"collectionName": form_data["collectionName"],
"sampleQuetions": (
(form_data["sampleQuetions"])
if form_data["sampleQuetions"] is not None
else []
),
"buttonIcon": icon_public_id,
}
)
return ResponseHandler.success(3000, chat.acknowledged)
except Exception as error:
print(error)
return ResponseHandler.error(9999, error, 500)
@router.get("/get")
async def get_paginated_chats(req: Request):
try:
page = int(req.query_params.get("page", 1))
limit = int(req.query_params.get("limit", 10))
total_count = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS][
"chats"
].estimated_document_count()
chats = (
DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS]["chats"]
.find()
.skip((page - 1) * limit)
.limit(limit)
)
paginated_response = get_paginated_response(
list(chats), page, limit, total_count
)
# print(paginated_response)
return ResponseHandler.success(3001, paginated_response)
except Exception as error:
return ResponseHandler.error(9000, 500, error)
@router.get("/get/{collection_name}")
async def get_chat_by_collection_name(req: Request, collection_name: str):
try:
chat = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS]["chats"].find_one(
{"collectionName": collection_name}
)
if not chat:
return ResponseHandler.error(3003, 404)
return ResponseHandler.success(3002, chat)
except Exception as error:
return ResponseHandler.error(9000, 500, error)
@router.put("/edit/{collection_name}")
async def update_chat(
req: Request,
collection_name: str,
icon: UploadFile = None,
tokenData=Depends(verify_token),
):
try:
username = tokenData["username"]
form_data = await req.form()
chat = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS]["chats"].find_one(
{"collectionName": collection_name, "username": username}
)
if not chat:
return ResponseHandler.error(3003, 404)
icon_public_id = None
if icon is not None:
file_data = await upload_file(
icon, form_data["collectionName"] + "_icon", "ChatIcons/"
)
icon_public_id = file_data["public_id"]
updated_chat = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS][
"chats"
].find_one_and_update(
{"collectionName": collection_name},
{
"$set": {
"title": form_data["title"],
"templateContext": form_data["templateContext"],
"buttonIcon": icon_public_id or chat.get("buttonIcon"),
}
},
)
if not updated_chat:
return ResponseHandler.error(3003, 404)
return ResponseHandler.success(3004)
except Exception as error:
return ResponseHandler.error(9000, 500, error)
@router.delete("/delete/{collection_name}")
async def delete_chat(collection_name: str, tokenData=Depends(verify_token)):
try:
username = tokenData["username"]
deleted_chat = DATABASE.client[ENV_VAR.MONGO_DB_NAME_CHATS][
"chats"
].find_one_and_delete({"collectionName": collection_name, "username": username})
if not deleted_chat:
return ResponseHandler.error(3003, 404)
return ResponseHandler.success(3005)
except Exception as error:
return ResponseHandler.error(9000, 500, error)