feat(api): enhance workspace module query to include member IDs (#9541)

Added an annotation to the WorkspaceModulesEndpoint to aggregate member IDs into an array, ensuring that only active members are included. This change improves the data structure returned by the API, allowing for better handling of member information in the frontend. Updated the corresponding utility function to handle potential null values for member IDs.
This commit is contained in:
Atul Tameshwari
2026-08-04 19:50:08 +05:30
committed by GitHub
parent 194266581c
commit a18177ce5e
2 changed files with 20 additions and 4 deletions

View File

@@ -3,7 +3,10 @@
# See the LICENSE file for details.
# Django imports
from django.db.models import Prefetch, Q, Count
from django.contrib.postgres.aggregates import ArrayAgg
from django.contrib.postgres.fields import ArrayField
from django.db.models import Prefetch, Q, Count, UUIDField, Value
from django.db.models.functions import Coalesce
# Third party modules
from rest_framework import status
@@ -109,6 +112,19 @@ class WorkspaceModulesEndpoint(BaseAPIView):
distinct=True,
)
)
.annotate(
member_ids=Coalesce(
ArrayAgg(
"members__id",
distinct=True,
filter=Q(
members__id__isnull=False,
modulemember__deleted_at__isnull=True,
),
),
Value([], output_field=ArrayField(UUIDField())),
)
)
.order_by(self.kwargs.get("order_by", "-created_at"))
)

View File

@@ -30,8 +30,8 @@ export const orderModules = (modules: IModule[], orderByKey: TModuleOrderByOptio
let orderedModules: IModule[] = [];
if (modules.length === 0 || !orderByKey) return [];
if (orderByKey === "name") orderedModules = [...modules].sort((a, b) => naturalSort(a.name, b.name));
if (orderByKey === "-name") orderedModules = [...modules].sort((a, b) => naturalSort(b.name, a.name));
if (orderByKey === "name") orderedModules = [...modules].toSorted((a, b) => naturalSort(a.name, b.name));
if (orderByKey === "-name") orderedModules = [...modules].toSorted((a, b) => naturalSort(b.name, a.name));
if (["progress", "-progress"].includes(orderByKey))
orderedModules = sortBy(modules, [
(m) => {
@@ -71,7 +71,7 @@ export const shouldFilterModule = (
if (filterKey === "lead" && filters.lead && filters.lead.length > 0)
fallsInFilters = fallsInFilters && filters.lead.includes(`${module.lead_id}`);
if (filterKey === "members" && filters.members && filters.members.length > 0) {
const memberIds = module.member_ids;
const memberIds = module.member_ids ?? [];
fallsInFilters = fallsInFilters && filters.members.some((memberId) => memberIds.includes(memberId));
}
if (filterKey === "start_date" && filters.start_date && filters.start_date.length > 0) {