from typing import Annotated, Optional, List from fastapi import APIRouter, HTTPException, status, Query, Depends from sqlalchemy import Select from .schema import QueryParams from .model import MasterData from .schema import ( MasterDataPagination, MasterDataRead, MasterDataCreate, MasterDataUpdate, BulkMasterDataUpdate, ) from .service import get, get_all, create, update, bulk_update, delete from src.database.service import CommonParameters, search_filter_sort_paginate from src.database.core import DbSession from src.auth.service import CurrentUser from src.models import StandardResponse router = APIRouter() @router.get("", response_model=StandardResponse[MasterDataPagination]) async def get_masterdatas( db_session: DbSession, common: CommonParameters, params: Annotated[QueryParams, Depends()], ): """Get all documents.""" # return master_datas = await get_all( db_session=db_session, items_per_page=params.items_per_page, search=params.search, common=common, ) return StandardResponse( data=master_datas, message="Data retrieved successfully", ) @router.get("/export-all", response_model=StandardResponse[MasterDataPagination]) async def get_masterdatas_export_all( db_session: DbSession, common: CommonParameters, ): """Get all documents for export.""" common["all"] = True master_datas = await get_all( db_session=db_session, items_per_page=-1, common=common, ) return StandardResponse( data=master_datas, message="All Master Data retrieved successfully", ) @router.get("/{masterdata_id}", response_model=StandardResponse[MasterDataRead]) async def get_masterdata(db_session: DbSession, masterdata_id: str): masterdata = await get(db_session=db_session, masterdata_id=masterdata_id) if not masterdata: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="A data with this id does not exist.", ) return StandardResponse(data=masterdata, message="Data retrieved successfully") @router.post("", response_model=StandardResponse[MasterDataRead]) async def create_masterdata( db_session: DbSession, masterdata_in: MasterDataCreate, current_user: CurrentUser ): masterdata_in.created_by = current_user.name masterdata = await create(db_session=db_session, masterdata_in=masterdata_in) return StandardResponse(data=masterdata, message="Data created successfully") @router.post("/update/bulk", response_model=StandardResponse[List[MasterDataRead]]) async def update_masterdata( db_session: DbSession, data: BulkMasterDataUpdate, current_user: CurrentUser, ): # Extract IDs and updates updates = [] ids = [] for item in data.updates: masterdata_id = item.pop("id") # remove id from update data # Create MasterDataUpdate object with remaining data update = MasterDataUpdate(**item, updated_by=current_user.name) updates.append(update) ids.append(masterdata_id) # Verify all records exist query = Select(MasterData).where(MasterData.id.in_(ids)) result = await db_session.execute(query) existing_records = result.scalars().all() if len(existing_records) != len(ids): raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Some records do not exist", ) return StandardResponse( data=await bulk_update(db_session=db_session, updates=updates, ids=ids), message="Data updated successfully", ) @router.post("/update/{masterdata_id}", response_model=StandardResponse[MasterDataRead]) async def update_masterdata( db_session: DbSession, masterdata_id: str, masterdata_in: MasterDataUpdate, current_user: CurrentUser, ): masterdata = await get(db_session=db_session, masterdata_id=masterdata_id) if not masterdata: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="A data with this id does not exist.", ) masterdata_in.updated_by = current_user.name return StandardResponse( data=await update( db_session=db_session, masterdata=masterdata, masterdata_in=masterdata_in ), message="Data updated successfully", ) @router.post("/delete/{masterdata_id}", response_model=StandardResponse[MasterDataRead]) async def delete_masterdata(db_session: DbSession, masterdata_id: str): masterdata = await get(db_session=db_session, masterdata_id=masterdata_id) if not masterdata: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=[{"msg": "A data with this id does not exist."}], ) await delete(db_session=db_session, masterdata_id=masterdata_id) return StandardResponse(message="Data deleted successfully", data=masterdata)