Skip to content

Commit 2163071

Browse files
authored
Merge pull request #2393 from trycompai/main
[comp] Production Deploy
2 parents bde0cef + 17378d9 commit 2163071

6 files changed

Lines changed: 54 additions & 45 deletions

File tree

‎apps/api/src/assistant-chat/assistant-chat.controller.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ Important:
194194
}
195195

196196
@Put('history')
197+
@SkipAuditLog()
197198
@ApiOperation({
198199
summary: 'Save assistant chat history',
199200
description:
@@ -214,6 +215,7 @@ Important:
214215
}
215216

216217
@Delete('history')
218+
@SkipAuditLog()
217219
@ApiOperation({
218220
summary: 'Clear assistant chat history',
219221
description: 'Deletes the current user-scoped assistant chat history.',

‎apps/api/src/people/people.service.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,9 @@ export class PeopleService {
350350
data: { deactivated: true, isActive: false },
351351
});
352352

353+
// Direct DB session deletion is correct here — the API server IS the auth server,
354+
// and better-auth's own revokeUserSessions internally calls the same deleteSessions operation.
355+
// The admin endpoint wrapper requires an authenticated admin session context we don't have.
353356
await db.session.deleteMany({ where: { userId: member.userId } });
354357

355358
if (member.fleetDmLabelId) {

‎apps/api/src/tasks/tasks.controller.ts‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ export class TasksController {
129129
});
130130
}
131131

132+
@Get('templates')
133+
@UseGuards(PermissionGuard)
134+
@RequirePermission('task', 'read')
135+
@ApiOperation({
136+
summary: 'Get task templates',
137+
description: 'Retrieve all available task templates, optionally filtered by framework.',
138+
})
139+
@ApiQuery({ name: 'frameworkId', required: false, description: 'Filter templates by framework ID' })
140+
async getTaskTemplates(
141+
@Query('frameworkId') frameworkId?: string,
142+
) {
143+
return await this.tasksService.getTaskTemplates(frameworkId);
144+
}
145+
132146
@Post()
133147
@UseGuards(PermissionGuard)
134148
@RequirePermission('task', 'create')

‎apps/api/src/tasks/tasks.service.ts‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,21 @@ export class TasksService {
129129
}
130130
}
131131

132+
async getTaskTemplates(frameworkId?: string) {
133+
const templates = await db.frameworkEditorTaskTemplate.findMany({
134+
orderBy: { name: 'asc' },
135+
where: frameworkId
136+
? {
137+
controlTemplates: {
138+
some: { requirements: { some: { frameworkId } } },
139+
},
140+
}
141+
: undefined,
142+
});
143+
144+
return templates;
145+
}
146+
132147
/**
133148
* Get a single task by ID
134149
*/

‎apps/app/src/actions/organization/remove-employee.ts‎

Lines changed: 19 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use server';
22

3+
import { serverApi } from '@/lib/api-server';
34
import { db } from '@db';
45
import { revalidatePath, revalidateTag } from 'next/cache';
56
import { z } from 'zod';
@@ -14,7 +15,7 @@ export const removeEmployeeRoleOrMember = authActionClient
1415
.metadata({
1516
name: 'remove-employee-role-or-member',
1617
track: {
17-
event: 'remove_employee', // Changed event name
18+
event: 'remove_employee',
1819
channel: 'organization',
1920
},
2021
})
@@ -37,22 +38,7 @@ export const removeEmployeeRoleOrMember = authActionClient
3738
const { memberId } = parsedInput;
3839

3940
try {
40-
// 1. Permission Check: Ensure current user is admin or owner
41-
const currentUserMember = await db.member.findFirst({
42-
where: {
43-
organizationId: organizationId,
44-
userId: currentUserId,
45-
},
46-
});
47-
48-
if (!currentUserMember || !['admin', 'owner'].includes(currentUserMember.role)) {
49-
return {
50-
success: false,
51-
error: 'Permission denied: Only admins or owners can remove employees.',
52-
};
53-
}
54-
55-
// 2. Fetch Target Member
41+
// Fetch target member to determine action
5642
const targetMember = await db.member.findFirst({
5743
where: {
5844
id: memberId,
@@ -67,56 +53,45 @@ export const removeEmployeeRoleOrMember = authActionClient
6753
};
6854
}
6955

70-
// 3. Check if target has 'employee' or 'contractor' role
71-
const roles = targetMember.role.split(',').filter(Boolean); // Handle empty strings/commas
56+
const roles = targetMember.role.split(',').filter(Boolean);
7257
if (!roles.includes('employee') && !roles.includes('contractor')) {
7358
return {
7459
success: false,
7560
error: 'Target member does not have the employee or contractor role.',
7661
};
7762
}
7863

79-
// 4. Logic: Remove role or delete member
8064
if (roles.length === 1 && (roles[0] === 'employee' || roles[0] === 'contractor')) {
81-
// Only has employee or contractor role - delete member fully
65+
// Only has employee/contractor role — deactivate via API
66+
// The API handles session cleanup, assignment clearing, and notifications
67+
const result = await serverApi.delete(`/v1/people/${memberId}`);
8268

83-
// Cannot remove owner (shouldn't happen if only role is employee, but safety check)
84-
if (targetMember.role === 'owner') {
69+
if (result.error) {
8570
return {
8671
success: false,
87-
error: 'Cannot remove the organization owner.',
72+
error: result.error,
8873
};
8974
}
90-
// Cannot remove self
91-
if (targetMember.userId === currentUserId) {
92-
return {
93-
success: false,
94-
error: 'You cannot remove yourself.',
95-
};
96-
}
97-
98-
await db.$transaction([
99-
db.member.delete({ where: { id: memberId } }),
100-
db.session.deleteMany({
101-
where: { userId: targetMember.userId },
102-
}),
103-
]);
10475

105-
// Revalidate
10676
revalidatePath(`/${organizationId}/people/all`);
10777
revalidateTag(`user_${currentUserId}`, 'max');
10878

10979
return { success: true, data: { removed: true } };
11080
} else {
111-
// Has other roles - just remove 'employee' role
81+
// Has other roles — just remove the employee role via API
11282
const updatedRoles = roles.filter((role) => role !== 'employee').join(',');
11383

114-
await db.member.update({
115-
where: { id: memberId },
116-
data: { role: updatedRoles },
84+
const result = await serverApi.patch(`/v1/people/${memberId}`, {
85+
role: updatedRoles,
11786
});
11887

119-
// Revalidate
88+
if (result.error) {
89+
return {
90+
success: false,
91+
error: result.error,
92+
};
93+
}
94+
12095
revalidatePath(`/${organizationId}/people/all`);
12196
revalidateTag(`user_${currentUserId}`, 'max');
12297

‎apps/app/src/hooks/use-task-template-api.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ export interface TaskTemplate {
1313
}
1414

1515
export function useTaskTemplates(options: UseApiSWROptions<TaskTemplate[]> = {}) {
16-
return useApiSWR<TaskTemplate[]>('/v1/framework-editor/task-template', options);
16+
return useApiSWR<TaskTemplate[]>('/v1/tasks/templates', options);
1717
}

0 commit comments

Comments
 (0)