44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { prisma } from "../db/prisma.js";
|
|
import type { FeatureGroupDto, FocusAreaPurpose } from "../types/api.js";
|
|
|
|
const toPublicId = (value: { slug: string | null; readableId: string | null; id: string }) =>
|
|
value.slug ?? value.readableId ?? value.id;
|
|
|
|
const findProjectRecordBySlugOrId = (projectIdOrSlug: string) =>
|
|
prisma.project.findFirst({
|
|
where: {
|
|
deletedAt: null,
|
|
OR: [{ id: projectIdOrSlug }, { slug: projectIdOrSlug }],
|
|
},
|
|
});
|
|
|
|
export const listFeatureGroupsForProject = async (
|
|
projectIdOrSlug: string,
|
|
): Promise<FeatureGroupDto[] | undefined> => {
|
|
const project = await findProjectRecordBySlugOrId(projectIdOrSlug);
|
|
if (!project) return undefined;
|
|
|
|
const groups = await prisma.featureGroup.findMany({
|
|
where: {
|
|
projectId: project.id,
|
|
deletedAt: null,
|
|
},
|
|
orderBy: [{ name: "asc" }],
|
|
include: {
|
|
features: {
|
|
where: { deletedAt: null },
|
|
orderBy: { name: "asc" },
|
|
},
|
|
},
|
|
});
|
|
|
|
return groups.map((group) => ({
|
|
id: toPublicId(group),
|
|
projectId: project.slug,
|
|
name: group.name,
|
|
description: group.description ?? undefined,
|
|
focusArea: group.focusArea as FocusAreaPurpose | undefined,
|
|
featureIds: group.features.map(toPublicId),
|
|
}));
|
|
};
|