from api.router.user import user_dependency from fastapi.responses import JSONResponse from fastapi import APIRouter, HTTPException, Depends, Query from db.models import Category from db.database import get_db from service.dto import CategoryCreate from script.vector_db import IndexManager from sqlalchemy.orm import Session from sqlalchemy.exc import SQLAlchemyError, IntegrityError from typing import Annotated router = APIRouter(tags=["Category"]) index_manager = IndexManager() db_dependency = Annotated[Session, Depends(get_db)] @router.get("/category") async def get_all_categories(user: user_dependency, db: db_dependency): if user is None or user.get("role_id") != 1: return JSONResponse(status_code=401, content="Authentication Failed") try: # Logic to retrieve all categories categories = db.query(Category).all() if not categories: return JSONResponse(status_code=404, content="No categories found") return { "message": "Categories retrieved successfully", "categories": [ {"id": cat.id, "category": cat.category} for cat in categories ], } except SQLAlchemyError as e: return JSONResponse( status_code=500, content="Database error occurred: " + str(e) ) @router.get("/category/{category_id}") async def get_categories_by_ids( user: user_dependency, db: db_dependency, category_id: int, ): if user is None or user.get("role_id") != 1: return JSONResponse(status_code=401, content="Authentication Failed") try: # Fetch categories based on the list of provided category_ids category = db.query(Category).filter(Category.id == category_id).first() if category is None: return JSONResponse(status_code=404, content="No categories found for the given IDs") return { "message": "Categories retrieved successfully", "category": {"id": category.id, "category": category.category}, } except SQLAlchemyError as e: return JSONResponse( status_code=500, content="Database error occurred: " + str(e) ) @router.post("/category") async def create_category(user: user_dependency, db: db_dependency, category: CategoryCreate): if user is None or user.get("role_id") != 1: return JSONResponse(status_code=401, content="Authentication Failed") try: # Check if category already exists existing_category = ( db.query(Category).filter(Category.category == category.category_name).first() ) if existing_category: return JSONResponse(status_code=400, content="Category already exists") # Logic to create a new category new_category = Category(category=category) # Assuming Category is your model db.add(new_category) db.commit() db.refresh(new_category) return { "message": "Category created successfully", "category_id": new_category.id, } except IntegrityError: db.rollback() return JSONResponse( status_code=400, content="Database integrity error: possibly a duplicate entry.", ) except SQLAlchemyError as e: db.rollback() return JSONResponse( status_code=500, content="Database error occurred: " + str(e) ) @router.put("/category/{category_id}") async def update_category( user: user_dependency, db: db_dependency, category_id: int, category: CategoryCreate ): if user is None or user.get("role_id") != 1: return JSONResponse(status_code=401, content="Authentication Failed") try: # Logic to update an existing category existing_category = ( db.query(Category).filter(Category.id == category_id).first() ) if not existing_category: return JSONResponse(status_code=404, content="Category not found") existing_category.category = category.category_name db.commit() return {"message": "Category updated successfully"} except SQLAlchemyError as e: db.rollback() return JSONResponse( status_code=500, content="Database error occurred: " + str(e) ) @router.delete("/category/{category_id}") async def delete_category(user: user_dependency, db: db_dependency, category_id: int): if user is None or user.get("role_id") != 1: return JSONResponse(status_code=401, content="Authentication Failed") try: # Logic to delete an existing category existing_category = ( db.query(Category).filter(Category.id == category_id).first() ) if not existing_category: return JSONResponse(status_code=404, content="Category not found") db.delete(existing_category) db.commit() return {"message": "Category deleted successfully"} except SQLAlchemyError as e: db.rollback() return JSONResponse( status_code=500, content="Database error occurred: " + str(e) )