Skip to content

Commit 26f86ee

Browse files
[dev] [tofikwest] tofik/update-risk-assesstment-part (#1961)
* feat(vendor): implement vendor risk assessment features and UI components * feat(vendor): enhance vendor risk assessment logic and domain extraction * refactor(vendor): remove distinct constraint for website in risk assessment * refactor(vendor): replace ShieldCheck icon with Shield icon in assessment view * refactor(vendor): remove backfill vendor risk assessment tasks and enhance task handling --------- Co-authored-by: Tofik Hasanov <[email protected]>
1 parent 67a37d5 commit 26f86ee

File tree

40 files changed

+2170
-989
lines changed

40 files changed

+2170
-989
lines changed

apps/api/src/task-management/task-management.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ export class TaskManagementService {
298298
`Created task item: ${taskItem.id} for organization ${organizationId} by ${member.id}`,
299299
);
300300

301-
// Log task creation in audit log
302-
void this.auditService.logTaskItemCreated({
301+
// Log task creation in audit log first (await to ensure it's created before assignment log)
302+
await this.auditService.logTaskItemCreated({
303303
taskItemId: taskItem.id,
304304
organizationId,
305305
userId: authContext.userId,
@@ -325,9 +325,9 @@ export class TaskManagementService {
325325
assignedByUserId: authContext.userId,
326326
});
327327

328-
// Log initial assignment in audit log
328+
// Log initial assignment in audit log (after creation log to ensure correct order)
329329
if (taskItem.assignee) {
330-
void this.auditService.logTaskItemAssigned({
330+
await this.auditService.logTaskItemAssigned({
331331
taskItemId: taskItem.id,
332332
organizationId,
333333
userId: authContext.userId,

apps/api/src/trigger/vendor/backfill-vendor-risk-assessment-tasks.ts

Lines changed: 0 additions & 113 deletions
This file was deleted.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import { db } from '@db';
2+
import { logger, schedules } from '@trigger.dev/sdk';
3+
import { vendorRiskAssessmentTask } from './vendor-risk-assessment-task';
4+
5+
/**
6+
* Monthly scheduled task that refreshes risk assessments for all vendors.
7+
* Runs on the 1st of each month at 2:00 AM UTC.
8+
*/
9+
export const vendorRiskAssessmentMonthlySchedule = schedules.task({
10+
id: 'vendor-risk-assessment-monthly-schedule',
11+
cron: '0 2 1 * *', // 1st of each month at 2:00 AM UTC
12+
maxDuration: 1000 * 60 * 60, // 1 hour (for batch processing)
13+
run: async (payload) => {
14+
logger.info('Monthly vendor risk assessment refresh started', {
15+
scheduledAt: payload.timestamp,
16+
lastRun: payload.lastTimestamp,
17+
});
18+
19+
// Find all vendors across all organizations that have websites
20+
const vendors = await db.vendor.findMany({
21+
where: {
22+
website: {
23+
not: null,
24+
},
25+
},
26+
select: {
27+
id: true,
28+
name: true,
29+
website: true,
30+
organizationId: true,
31+
},
32+
});
33+
34+
logger.info(`Found ${vendors.length} unique vendors with websites`);
35+
36+
if (vendors.length === 0) {
37+
return {
38+
success: true,
39+
totalVendors: 0,
40+
triggered: 0,
41+
message: 'No vendors with websites found',
42+
};
43+
}
44+
45+
// Process ALL vendors - monthly refresh for everyone
46+
// This ensures all vendors get updated risk assessments monthly
47+
logger.info(`Processing all ${vendors.length} vendors for monthly refresh`);
48+
49+
// Batch trigger risk assessment tasks with research enabled for ALL vendors
50+
// This will:
51+
// - Create new assessments for vendors without data (v1)
52+
// - Refresh existing assessments and increment version (v1 -> v2, v2 -> v3, etc.)
53+
const batch = vendors.map((vendor) => ({
54+
payload: {
55+
vendorId: vendor.id,
56+
vendorName: vendor.name,
57+
vendorWebsite: vendor.website!,
58+
organizationId: vendor.organizationId,
59+
createdByUserId: null, // System-initiated
60+
withResearch: true, // Always do research for monthly refresh
61+
},
62+
}));
63+
64+
try {
65+
await vendorRiskAssessmentTask.batchTrigger(batch);
66+
logger.info(`Triggered ${batch.length} vendor risk assessment tasks`, {
67+
totalVendors: vendors.length,
68+
triggered: batch.length,
69+
});
70+
71+
return {
72+
success: true,
73+
totalVendors: vendors.length,
74+
triggered: batch.length,
75+
message: `Triggered monthly refresh for ${batch.length} vendors`,
76+
};
77+
} catch (error) {
78+
logger.error('Failed to trigger batch risk assessment tasks', {
79+
error: error instanceof Error ? error.message : String(error),
80+
batchSize: batch.length,
81+
});
82+
83+
return {
84+
success: false,
85+
totalVendors: vendors.length,
86+
triggered: 0,
87+
error: error instanceof Error ? error.message : String(error),
88+
};
89+
}
90+
},
91+
});
92+

0 commit comments

Comments
 (0)