Skip to content

Commit bfbad29

Browse files
committed
feat(frameworks): include controls in task retrieval across various components
- Added an `include` clause to task retrieval functions to fetch associated controls, enhancing the data structure for tasks. - Updated multiple components to accommodate the new task structure, ensuring they handle tasks with associated controls correctly. - Adjusted type definitions to reflect the inclusion of controls in task data, improving type safety and consistency.
1 parent b53b704 commit bfbad29

File tree

19 files changed

+96
-193
lines changed

19 files changed

+96
-193
lines changed

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/components/FrameworkOverview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import { Progress } from "@comp/ui/progress";
66
import { getFrameworkDetails } from "../../lib/getFrameworkDetails";
77
import { getControlStatus } from "../../lib/utils";
88
import { FrameworkInstanceWithControls } from "../../types";
9-
import { Task } from "@comp/db/types";
9+
import { Control, Task } from "@comp/db/types";
1010

1111
interface FrameworkOverviewProps {
1212
frameworkInstanceWithControls: FrameworkInstanceWithControls;
13-
tasks: Task[];
13+
tasks: (Task & { controls: Control[] })[];
1414
}
1515

1616
export function FrameworkOverview({

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/page.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ export default async function FrameworkPage({ params }: PageProps) {
5454
},
5555
},
5656
},
57+
include: {
58+
controls: true,
59+
},
5760
});
5861

5962
return (

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/RequirementControls.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import { FrameworkId } from "@comp/db/types";
66
import { Card, CardContent, CardHeader, CardTitle } from "@comp/ui/card";
77
import { FrameworkInstanceWithControls } from "../../../../types";
88
import { RequirementControlsTable } from "./table/RequirementControlsTable";
9-
import type { Task } from "@comp/db/types";
9+
import type { Control, Task } from "@comp/db/types";
1010

1111
interface RequirementControlsProps {
1212
requirement: Requirement;
1313
requirementKey: string;
1414
frameworkInstanceWithControls: FrameworkInstanceWithControls;
15-
tasks: Task[];
15+
tasks: (Task & { controls: Control[] })[];
1616
}
1717

1818
export function RequirementControls({

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ interface RequirementControlsTableProps {
2727
policy: Policy | null;
2828
})[];
2929
})[];
30-
tasks: Task[];
30+
tasks: (Task & { controls: Control[] })[];
3131
}
3232

3333
export function RequirementControlsTable({

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/components/table/RequirementControlsTableColumns.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type OrganizationControlType = Control & {
2626
export function RequirementControlsTableColumns({
2727
tasks,
2828
}: {
29-
tasks: Task[];
29+
tasks: (Task & { controls: Control[] })[];
3030
}): ColumnDef<OrganizationControlType>[] {
3131
const t = useI18n();
3232
const { orgId } = useParams<{ orgId: string }>();

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/[frameworkInstanceId]/requirements/[requirementKey]/page.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ export default async function RequirementPage({ params }: PageProps) {
7575
},
7676
},
7777
},
78+
include: {
79+
controls: true,
80+
},
7881
})) || [];
7982

8083
return (

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/components/FrameworkCard.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use client";
22

33
import { useI18n } from "@/locales/client";
4-
import { Task } from "@comp/db/types";
4+
import { Task, Control } from "@comp/db/types";
55
import { Badge } from "@comp/ui/badge";
66
import {
77
Card,
@@ -21,7 +21,7 @@ import { FrameworkInstanceWithControls } from "../types";
2121
interface FrameworkCardProps {
2222
frameworkInstance: FrameworkInstanceWithControls;
2323
complianceScore: number;
24-
tasks: Task[];
24+
tasks: (Task & { controls: Control[] })[];
2525
}
2626

2727
export function FrameworkCard({
@@ -75,8 +75,8 @@ export function FrameworkCard({
7575
const notStartedControlsCount =
7676
frameworkInstance.controls?.filter((control) => {
7777
// If a control has no artifacts and no tasks, it's not started.
78-
const controlTasks = tasks.filter(
79-
(task) => task.entityId === control.id,
78+
const controlTasks = tasks.filter((task) =>
79+
task.controls.some((c) => c.id === control.id),
8080
);
8181

8282
if (

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/components/FrameworkList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import { Task } from "@comp/db/types";
3+
import { Control, Task } from "@comp/db/types";
44
import { FrameworkCard } from "./FrameworkCard";
55
import type { FrameworkInstanceWithComplianceScore } from "./types";
66

@@ -9,7 +9,7 @@ export function FrameworkList({
99
tasks,
1010
}: {
1111
frameworksWithControlsAndComplianceScores: FrameworkInstanceWithComplianceScore[];
12-
tasks: Task[];
12+
tasks: (Task & { controls: Control[] })[];
1313
}) {
1414
if (!frameworksWithControlsAndComplianceScores.length) return null;
1515

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/components/FrameworksOverview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { Task } from "@comp/db/types";
1+
import { Control, Task } from "@comp/db/types";
22
import { getFrameworkWithComplianceScores } from "../data/getFrameworkWithComplianceScores";
33
import type { FrameworkInstanceWithControls } from "../types";
44
import { FrameworkList } from "./FrameworkList";
55

66
export interface FrameworksOverviewProps {
77
frameworksWithControls: FrameworkInstanceWithControls[];
8-
tasks: Task[];
8+
tasks: (Task & { controls: Control[] })[];
99
}
1010

1111
export async function FrameworksOverview({

apps/app/src/app/[locale]/(app)/(dashboard)/[orgId]/frameworks/data/getFrameworkWithComplianceScores.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
"use server";
22

33
import {
4+
Control,
45
type Artifact,
5-
type Task,
66
type Policy,
7-
TaskEntityType,
7+
type Task,
88
} from "@comp/db/types";
99
import { FrameworkInstanceWithComplianceScore } from "../components/types";
1010
import { FrameworkInstanceWithControls } from "../types";
11-
import { db } from "@comp/db";
12-
import { headers } from "next/headers";
13-
import { auth } from "@/utils/auth";
1411

1512
/**
1613
* Checks if a control is compliant based on its artifacts and tasks
@@ -62,7 +59,7 @@ export async function getFrameworkWithComplianceScores({
6259
tasks,
6360
}: {
6461
frameworksWithControls: FrameworkInstanceWithControls[];
65-
tasks: Task[];
62+
tasks: (Task & { controls: Control[] })[];
6663
}): Promise<FrameworkInstanceWithComplianceScore[]> {
6764
// Calculate compliance for each framework
6865
const frameworksWithComplianceScores = frameworksWithControls.map(
@@ -73,8 +70,8 @@ export async function getFrameworkWithComplianceScores({
7370
// Calculate compliance percentage
7471
const totalControls = controls.length;
7572
const compliantControls = controls.filter((control) => {
76-
const controlTasks = tasks.filter(
77-
(task) => task.entityId === control.id,
73+
const controlTasks = tasks.filter((task) =>
74+
task.controls.some((c) => c.id === control.id),
7875
);
7976
return isControlCompliant(control.artifacts, controlTasks);
8077
}).length;

0 commit comments

Comments
 (0)