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
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)
|