You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.8 KiB
Python

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)