Files
CRM-OLD-API/app/api/v1/department.py
2025-07-24 20:13:47 +03:00

199 lines
6.1 KiB
Python

from time import time
from fastapi import APIRouter
from app import mongo
from app.utils.response_util import response
router = APIRouter()
@router.get("/", tags=[""])
async def get_departments():
start_time = time()
departments = await mongo.departments_collection.find(
{}, {"_id": False}
).sort("id", mongo.asc).to_list(length=None)
async def build_section_tree(parent_section):
users = []
for user in parent_section.get("users", []):
user_data = await mongo.users_collection.find_one({"id": user["userId"]}, {"_id": False})
if user_data:
user["user"] = user_data
users.append(user)
parent_section["users"] = users
children = await mongo.department_sections_collection.find(
{"parentDepartmentSectionId": parent_section["id"]},
{"_id": False}
).sort("id", mongo.asc).to_list(length=None)
parent_section["sections"] = []
for child in children:
await build_section_tree(child)
parent_section["sections"].append(child)
for department in departments:
top_sections = await mongo.department_sections_collection.find(
{
"departmentId": department["id"],
"$or": [{"parentDepartmentSectionId": None}, {"parentDepartmentSectionId": {"$exists": False}}]
},
{"_id": False}
).sort("id", mongo.asc).to_list(length=None)
department["sections"] = []
for section in top_sections:
await build_section_tree(section)
department["sections"].append(section)
return response({
"departments": departments
}, start_time=start_time)
@router.post("/", tags=[""])
async def create_department(params: dict):
start_time = time()
data = params["department"]
data["id"] = await mongo.get_next_id(mongo.departments_collection)
await mongo.departments_collection.insert_one(data)
return response({"message": "Департамент создан", "ok": True}, start_time=start_time)
@router.patch("/", tags=[""])
async def update_department(params: dict):
start_time = time()
data = params["department"]
await mongo.departments_collection.update_one({"id": data["id"]}, {"$set": data})
return response({"message": "Департамент обновлён", "ok": True}, start_time=start_time)
@router.delete("/{department_id}", tags=[""])
async def delete_department(department_id: int):
start_time = time()
sections = await mongo.department_sections_collection.find(
{"departmentId": department_id}, {"_id": False}
).to_list(length=None)
for section in sections:
await delete_section_recursive(section["id"])
await mongo.departments_collection.delete_one({"id": department_id})
return response({"message": "Департамент удалён", "ok": True}, start_time=start_time)
@router.get("/section", tags=[""])
async def get_sections():
start_time = time()
department_sections = await mongo.department_sections_collection.find(
{}, {"_id": False}
).sort("id", mongo.asc).to_list(length=None)
return response({
"departmentSections": department_sections
}, start_time=start_time)
@router.post("/section", tags=[""])
async def create_section(params: dict):
start_time = time()
data = params["section"]
if "departmentId" not in data:
return response({
"message": "Необходимо выбрать департамент",
"ok": False
}, start_time=start_time)
data["id"] = await mongo.get_next_id(mongo.department_sections_collection)
await mongo.department_sections_collection.insert_one(data)
return response({
"message": "Отдел создан",
"ok": True
}, start_time=start_time)
@router.patch("/section", tags=[""])
async def update_section(params: dict):
start_time = time()
data = params["section"]
await mongo.department_sections_collection.update_one({"id": data["id"]}, {"$set": data})
return response({"message": "Отдел обновлен", "ok": True}, start_time=start_time)
@router.delete("/section/{section_id}", tags=[""])
async def delete_section(section_id: int):
start_time = time()
await delete_section_recursive(section_id)
return response({"message": "Отдел удален", "ok": True}, start_time=start_time)
@router.get("/users/{section_id}", tags=[""])
async def get_available_users(section_id: int):
start_time = time()
users = await mongo.users_collection.find(
{"isDeleted": False}, {"_id": False}
).to_list(length=None)
return response({
"users": users
}, start_time=start_time)
@router.post("/users", tags=[""])
async def add_user_to_section(params: dict):
start_time = time()
section_id = params["sectionId"]
user_id = params["userId"]
is_chief = params.get("isChief", False)
await mongo.department_sections_collection.update_one(
{"id": section_id},
{"$addToSet": {"users": {"userId": user_id, "isChief": is_chief}}}
)
return response({
"message": "Пользователь добавлен в секцию",
"ok": True
}, start_time=start_time)
@router.post("/users/delete", tags=[""])
async def delete_user_from_section(params: dict):
start_time = time()
section_id = params["sectionId"]
user_id = params["userId"]
await mongo.department_sections_collection.update_one(
{"id": section_id},
{"$pull": {"users": {"userId": user_id}}}
)
return response({
"message": "Пользователь удалён из секции",
"ok": True
}, start_time=start_time)
async def delete_section_recursive(section_id: int):
children = await mongo.department_sections_collection.find(
{"parentDepartmentSectionId": section_id}, {"_id": False}
).to_list(length=None)
for child in children:
await delete_section_recursive(child["id"])
await mongo.department_sections_collection.delete_one({"id": section_id})