Spaces:
Sleeping
Sleeping
import asyncio | |
from fastapi.responses import PlainTextResponse | |
from fastapi_router_controller import Controller | |
from fastapi import APIRouter, File, UploadFile, HTTPException | |
from utils.BagOfWords import bag_of_words_model | |
from utils.cnn import extract_features_from_image, get_similar_products_cnn | |
from utils.logger import Logger | |
from utils.tfidf import tfidf_model | |
import shutil | |
import os | |
logger = Logger.get_logger(__name__) | |
router = APIRouter(prefix='/v1') | |
controller = Controller(router, openapi_tag={ | |
'name': 'Recommendation System', | |
}) | |
class RecommendationController(): | |
def __init__(self): | |
pass | |
async def recommend(self, input: str): | |
try: | |
if not input: | |
logger.error('Input is required.') | |
raise HTTPException( | |
status_code=500, detail='Input is required.') | |
results = bag_of_words_model(input, 5) | |
return {"results": results} | |
except asyncio.CancelledError: | |
logger.error( | |
'Canceling network request due to disconnect in client.') | |
except Exception as error: | |
logger.error('Error {}'.format(error)) | |
async def recommend(self, input: str): | |
try: | |
if not input: | |
logger.error('Input is required.') | |
raise HTTPException( | |
status_code=500, detail='Input is required.') | |
results = tfidf_model(input, 5) | |
return {"results": results} | |
except asyncio.CancelledError: | |
logger.error( | |
'Canceling network request due to disconnect in client.') | |
except Exception as error: | |
logger.error('Error {}'.format(error)) | |
async def recommend(self, file: UploadFile = File(...)): | |
try: | |
UPLOAD_FOLDER = 'uploads/' | |
# Save the uploaded file | |
file_path = os.path.join(UPLOAD_FOLDER, file.filename) | |
with open(file_path, "wb") as buffer: | |
shutil.copyfileobj(file.file, buffer) | |
# Process the uploaded image | |
with open(file_path, "rb") as img_file: | |
image_bytes = img_file.read() | |
# Log image size for debugging | |
if len(image_bytes) == 0: | |
raise HTTPException(status_code=400, detail="Uploaded image is empty.") | |
else: | |
print(f"Image size: {len(image_bytes)} bytes") | |
# Extract features from the image | |
image_features = extract_features_from_image(image_bytes) | |
results = get_similar_products_cnn(image_features, 5) | |
return {"results": results} | |
except asyncio.CancelledError: | |
logger.error( | |
'Canceling network request due to disconnect in client.') | |
except Exception as error: | |
logger.error('Error {}'.format(error)) | |
async def recommend(self, password: str): | |
try: | |
if not password: | |
logger.error('Password is required.') | |
raise HTTPException( | |
status_code=500, detail='Password is required.') | |
if password != "1328": | |
return {"results": "Unauthorized: Incorrect password"} | |
UPLOAD_FOLDER = 'uploads/' | |
# Check if the uploads folder exists | |
if not os.path.exists(UPLOAD_FOLDER): | |
raise HTTPException(status_code=404, detail="Uploads folder does not exist") | |
# List all files in the uploads folder | |
files = os.listdir(UPLOAD_FOLDER) | |
if not files: | |
return {"results": "No files to delete"} | |
# Delete all files in the uploads folder | |
for file in files: | |
file_path = os.path.join(UPLOAD_FOLDER, file) | |
try: | |
# Check if it is a file before trying to delete it | |
if os.path.isfile(file_path): | |
os.remove(file_path) | |
print(f"Deleted: {file_path}") | |
else: | |
print(f"Skipping directory: {file_path}") | |
except Exception as e: | |
print(f"Error deleting file {file_path}: {str(e)}") | |
return {"results": "All files have been deleted successfully."} | |
except asyncio.CancelledError: | |
logger.error( | |
'Canceling network request due to disconnect in client.') | |
except Exception as error: | |
logger.error('Error {}'.format(error)) | |
async def readLogs(self): | |
try: | |
# Check if the log file exists | |
LOG_FILE_PATH = 'logs.log' | |
if not os.path.exists(LOG_FILE_PATH): | |
raise HTTPException(status_code=404, detail="Log file not found") | |
# Read the log file content | |
try: | |
with open(LOG_FILE_PATH, 'r') as log_file: | |
logs_content = log_file.read() | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=f"Error reading log file: {str(e)}") | |
# Return the log content as plain text | |
return PlainTextResponse(content=logs_content) | |
except asyncio.CancelledError: | |
logger.error( | |
'Canceling network request due to disconnect in client.') | |
except Exception as error: | |
logger.error('Error {}'.format(error)) | |