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 {
|
||||
"members",
|
||||
"user_perms",
|
||||
"ui_context",
|
||||
"list",
|
||||
"retrieve",
|
||||
"my_departments",
|
||||
@ -359,47 +358,6 @@ class DepartmentViewSet(viewsets.ModelViewSet):
|
||||
}
|
||||
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")
|
||||
def add_member(self, request, pk: int | None = None):
|
||||
"""Добавляет сотрудника в отдел."""
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user