194 lines
7.7 KiB
Python
194 lines
7.7 KiB
Python
from fastapi import APIRouter, Depends
|
|
from db.handlers.categories import CategoryHandler
|
|
from db.handlers.stock import PlacementHandler, StockHandler
|
|
from db.handlers.toolbox import ToolboxHandler
|
|
from db.handlers.toolkit import ToolkitHandler
|
|
from utils import requestDict, logger
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def handleResult(result: dict, response: dict) -> dict:
|
|
if "errorMessage" in result.keys():
|
|
response["message"] = result["errorMessage"]
|
|
else:
|
|
response["status"] = "ok"
|
|
return response
|
|
|
|
|
|
@router.get("/", summary="Получение инструмента")
|
|
async def get_toolkit(reqData: dict = Depends(requestDict)):
|
|
logger.info(f"Получение инструмента")
|
|
response = {"status": "error"}
|
|
toolkitId = reqData.get("query").get("toolkitId")
|
|
if toolkitId:
|
|
toolkit = await ToolkitHandler.get(int(toolkitId))
|
|
if toolkit:
|
|
response["status"] = "ok"
|
|
response["data"] = toolkit
|
|
return response
|
|
|
|
|
|
@router.post("/", summary="Запрос остатка инструмента")
|
|
async def toolkit_request(
|
|
reqData: dict = Depends(requestDict),
|
|
):
|
|
response = {"status": "error", "data": {}}
|
|
toolkitId = reqData.get("body").get("toolkitId")
|
|
logger.info(f"Получение запроса остатка инструмента #{toolkitId}")
|
|
stocks = await StockHandler.getByToolkitId(toolkitId)
|
|
if not stocks:
|
|
return response
|
|
userId = reqData.get("body").get("userId")
|
|
allToolboxes = reqData.get("body").get("allToolboxes")
|
|
toolboxes = (
|
|
await ToolboxHandler.getByOwner(userId)
|
|
if not allToolboxes
|
|
else await ToolboxHandler.getAll()
|
|
)
|
|
if not toolboxes:
|
|
return response
|
|
toolboxesTitles = {toolbox["id"]: toolbox["title"] for toolbox in toolboxes}
|
|
toolboxesOwners = {toolbox["id"]: toolbox["owner_id"] for toolbox in toolboxes}
|
|
stocksData = {"count": 0, "toolboxes": {}}
|
|
for stock in stocks:
|
|
toolboxTitle = toolboxesTitles.get(stock["toolbox_id"], None)
|
|
if not toolboxTitle:
|
|
continue
|
|
stocksData["count"] += stock["quantity"]
|
|
if toolboxTitle not in stocksData["toolboxes"]:
|
|
stocksData["toolboxes"][toolboxTitle] = {
|
|
"count": stock["quantity"],
|
|
"placement": stock["placement"],
|
|
}
|
|
if not toolboxesOwners.get(stock["toolbox_id"]):
|
|
stocksData["toolboxes"][toolboxTitle]["id"] = stock["toolbox_id"]
|
|
stocksData["toolboxes"][toolboxTitle]["totalCost"] = (
|
|
stock["price"] * stock["quantity"]
|
|
)
|
|
else:
|
|
stocksData["toolboxes"][toolboxTitle]["count"] += stock["quantity"]
|
|
if not toolboxesOwners.get(stock["toolbox_id"]):
|
|
stocksData["toolboxes"][toolboxTitle]["totalCost"] += (
|
|
stock["price"] * stock["quantity"]
|
|
)
|
|
response["status"] = "ok"
|
|
response["data"] = stocksData
|
|
return response
|
|
|
|
|
|
@router.post("/fill_prepare", summary="Подготовка заполнения ящика")
|
|
async def fill_toolbox():
|
|
logger.info(f"Подготовка заполнения ящика")
|
|
response = {"status": "error"}
|
|
toolkits = await ToolkitHandler.getAll()
|
|
categories = await CategoryHandler.getAll()
|
|
placements = await PlacementHandler.getAll()
|
|
if toolkits and categories:
|
|
response["status"] = "ok"
|
|
response["data"] = {
|
|
"toolkits": sorted(toolkits, key=lambda toolkit: toolkit["title"]),
|
|
"categories": sorted(categories, key=lambda category: category["title"]),
|
|
"placements": [placement.toDict() for placement in placements],
|
|
}
|
|
return response
|
|
|
|
|
|
@router.post("/categories_batch", summary="Управление категориями")
|
|
async def categories_batch(reqData: dict = Depends(requestDict)):
|
|
logger.info(f"Управление категориями")
|
|
response = {"status": "error"}
|
|
userId = reqData.get("body").get("userId")
|
|
changesData = reqData.get("body").get("changes")
|
|
success = True
|
|
for newCategoryData in changesData.get("create", []):
|
|
logger.info(f"Добавление категории: {newCategoryData.get('title')}")
|
|
result = await CategoryHandler.add(newCategoryData, userId)
|
|
if not result:
|
|
success = False
|
|
for updateCategoryData in changesData.get("update", []):
|
|
logger.info(f"Обновление категории: {updateCategoryData.get('title')}")
|
|
result = await CategoryHandler.edit(updateCategoryData, userId)
|
|
if not result:
|
|
success = False
|
|
for deleteCategoryId in changesData.get("delete", []):
|
|
logger.info(f"Удаление категории: {deleteCategoryId}")
|
|
result = await CategoryHandler.delete(deleteCategoryId, userId)
|
|
if not result:
|
|
success = False
|
|
if success:
|
|
response["status"] = "ok"
|
|
return response
|
|
|
|
|
|
@router.get("/categories", summary="Получение категорий")
|
|
async def get_categories():
|
|
logger.info(f"Получение категорий")
|
|
response = {"status": "error"}
|
|
categories = await CategoryHandler.getAll()
|
|
if categories:
|
|
categoriesDict = {
|
|
category["id"]: {
|
|
"id": category["id"],
|
|
"title": category["title"],
|
|
"description": category["description"],
|
|
}
|
|
for category in categories
|
|
}
|
|
response["status"] = "ok"
|
|
response["data"] = categoriesDict
|
|
return response
|
|
|
|
|
|
@router.post("/hide", summary="Скрытие инструмента")
|
|
async def hide_toolkit(reqData: dict = Depends(requestDict)):
|
|
|
|
logger.info(f"Скрытие/отображение инструмента")
|
|
response = {"status": "error"}
|
|
toolkitId = int(reqData.get("body").get("toolkitId"))
|
|
userId = reqData.get("body").get("userId")
|
|
hidden = reqData.get("body").get("hidden")
|
|
result = await ToolkitHandler.hideToolkit(userId, toolkitId, hidden)
|
|
response = handleResult(result, response)
|
|
return response
|
|
|
|
|
|
@router.post("/manage", summary="Управление инструментами")
|
|
async def manage_toolkit(reqData: dict = Depends(requestDict)):
|
|
|
|
logger.info(f"Управление инструментами")
|
|
response = {"status": "error"}
|
|
action = reqData.get("body").get("action")
|
|
userId = reqData.get("body").get("userId")
|
|
toolkitData = reqData.get("body").get("formData")
|
|
if "category_id" in toolkitData:
|
|
toolkitData["category_id"] = int(toolkitData.get("category_id"))
|
|
if "image" in toolkitData:
|
|
if (
|
|
not toolkitData.get("image").get("main")
|
|
or toolkitData.get("image").get("main") == ""
|
|
):
|
|
if len(toolkitData.get("image").get("additional")) == 0:
|
|
toolkitData.pop("image")
|
|
match action:
|
|
case "create":
|
|
toolkit = await ToolkitHandler.add(toolkitData, userId)
|
|
response = handleResult(toolkit, response)
|
|
case "copy":
|
|
toolkitData.pop("id")
|
|
toolkit = await ToolkitHandler.add(toolkitData, userId)
|
|
response = handleResult(toolkit, response)
|
|
case "update":
|
|
toolkit = await ToolkitHandler.edit(userId, **toolkitData)
|
|
response = handleResult(toolkit, response)
|
|
case "delete":
|
|
toolkit = await ToolkitHandler.delete(toolkitData.get("id"), userId)
|
|
response = handleResult(toolkit, response)
|
|
case _:
|
|
pass
|
|
logger.info(
|
|
f"Управление инструментами ({action}) прошло {'успешно' if response.get('status') == 'ok' else 'неуспешно'}"
|
|
)
|
|
return response
|