refactor(departments): удалить BFF агрегатор ui_context
- Удален метод ui_context (42 строки)
- Все его данные доступны через отдельные endpoints:
- dept → GET /departments/{id}/
- roles → можно добавить /departments/{id}/roles/
- links → GET /departments/{id}/members/
- user_perms → GET /departments/{id}/user-perms/
- choices → UI логика (фронтенд)
Преимущества:
- Кешируемые отдельные endpoints
- Фронт запрашивает только нужное
- Проще тестировать
- Более RESTful
-42 строки (480 → 438)
This commit is contained in:
parent
6e970741d8
commit
bda5e841cb
@ -80,7 +80,6 @@ class DepartmentViewSet(viewsets.ModelViewSet):
|
|||||||
if self.action in {
|
if self.action in {
|
||||||
"members",
|
"members",
|
||||||
"user_perms",
|
"user_perms",
|
||||||
"ui_context",
|
|
||||||
"list",
|
"list",
|
||||||
"retrieve",
|
"retrieve",
|
||||||
"my_departments",
|
"my_departments",
|
||||||
@ -359,47 +358,6 @@ class DepartmentViewSet(viewsets.ModelViewSet):
|
|||||||
}
|
}
|
||||||
return Response(data, status=200)
|
return Response(data, status=200)
|
||||||
|
|
||||||
@action(detail=True, methods=["get"], url_path="ui-context")
|
|
||||||
def ui_context(self, request, pk=None):
|
|
||||||
"""GET /api/v1/departments/{id}/ui-context/ — BFF-агрегатор для страницы отдела."""
|
|
||||||
dept = self.get_object()
|
|
||||||
dept_data = self.get_serializer(dept).data
|
|
||||||
|
|
||||||
roles_qs = (
|
|
||||||
DepartmentRole.objects.filter(department_id=dept.id)
|
|
||||||
.prefetch_related("scoped_permissions")
|
|
||||||
.order_by("name", "id")
|
|
||||||
)
|
|
||||||
roles_data = DepartmentRoleSerializer(roles_qs, many=True).data
|
|
||||||
|
|
||||||
links = _build_links_for_dept(dept, EmployeeBriefSerializer)
|
|
||||||
perm_choices = _perm_choices_synced()
|
|
||||||
head_choices = _head_choices_for_dept(dept, EmployeeBriefSerializer)
|
|
||||||
user_perms = {
|
|
||||||
"is_head": (
|
|
||||||
request.user.id == dept.head_id
|
|
||||||
if getattr(request.user, "id", None)
|
|
||||||
else False
|
|
||||||
),
|
|
||||||
"can_manage": has_dept_perm(request.user, dept.id, DeptPerm.MANAGE),
|
|
||||||
"can_change_head": has_dept_perm(
|
|
||||||
request.user, dept.id, DeptPerm.CHANGE_HEAD
|
|
||||||
),
|
|
||||||
"can_assign_roles": has_dept_perm(
|
|
||||||
request.user, dept.id, DeptPerm.ASSIGN_ROLE
|
|
||||||
),
|
|
||||||
}
|
|
||||||
|
|
||||||
payload = {
|
|
||||||
"dept": dept_data,
|
|
||||||
"roles": roles_data,
|
|
||||||
"links": links,
|
|
||||||
"head_choices": head_choices,
|
|
||||||
"dept_perm_choices": perm_choices,
|
|
||||||
"user_perms": user_perms,
|
|
||||||
}
|
|
||||||
return Response(payload, status=200)
|
|
||||||
|
|
||||||
@action(detail=True, methods=["post"], url_path="add_member")
|
@action(detail=True, methods=["post"], url_path="add_member")
|
||||||
def add_member(self, request, pk: int | None = None):
|
def add_member(self, request, pk: int | None = None):
|
||||||
"""Добавляет сотрудника в отдел."""
|
"""Добавляет сотрудника в отдел."""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user