diff --git a/packages/common/src/rule-engine/operators/enums.ts b/packages/common/src/rule-engine/operators/enums.ts index da2bb3b47f..81661ffd95 100644 --- a/packages/common/src/rule-engine/operators/enums.ts +++ b/packages/common/src/rule-engine/operators/enums.ts @@ -9,6 +9,7 @@ export const OPERATION = { LAST_YEAR: 'LAST_YEAR', EXISTS: 'EXISTS', IN: 'IN', + IN_CASE_INSENSITIVE: 'IN_CASE_INSENSITIVE', NOT_IN: 'NOT_IN', AML_CHECK: 'AML_CHECK', } as const; @@ -24,6 +25,7 @@ export const OPERATIONS = [ OPERATION.LAST_YEAR, OPERATION.EXISTS, OPERATION.IN, + OPERATION.IN_CASE_INSENSITIVE, OPERATION.NOT_IN, OPERATION.AML_CHECK, ]; diff --git a/packages/common/src/rule-engine/rules/schemas.ts b/packages/common/src/rule-engine/rules/schemas.ts index 9d7400d94a..29f1c1aa9c 100644 --- a/packages/common/src/rule-engine/rules/schemas.ts +++ b/packages/common/src/rule-engine/rules/schemas.ts @@ -1,19 +1,20 @@ import { z } from 'zod'; -import { OPERATION, OPERATOR } from '../operators/enums'; import { RuleSet } from './types'; import { + OPERATION, + OPERATOR, AmlCheckSchema, BetweenSchema, ExistsSchema, LastYearsSchema, PrimitiveArraySchema, PrimitiveSchema, -} from '../operators/schemas'; +} from '@/rule-engine'; -export function getValues>(obj: T) { +export const getValues = >(obj: T) => { return Object.values(obj) as [(typeof obj)[keyof T]]; -} +}; export const RuleSchema = z.discriminatedUnion('operator', [ z.object({ @@ -79,6 +80,11 @@ export const RuleSchema = z.discriminatedUnion('operator', [ operator: z.literal(OPERATION.IN), value: PrimitiveArraySchema, }), + z.object({ + key: z.string(), + operator: z.literal(OPERATION.IN_CASE_INSENSITIVE), + value: PrimitiveArraySchema, + }), z.object({ key: z.string(), operator: z.literal(OPERATION.NOT_IN), diff --git a/packages/workflow-core/src/lib/plugins/common-plugin/types.ts b/packages/workflow-core/src/lib/plugins/common-plugin/types.ts index a9a83ce6ac..a8ef64f463 100644 --- a/packages/workflow-core/src/lib/plugins/common-plugin/types.ts +++ b/packages/workflow-core/src/lib/plugins/common-plugin/types.ts @@ -75,7 +75,7 @@ export interface RiskRulesPluginParams { id: string; domain: string; indicator: string; - riskLevel: 'critical' | 'moderate' | 'positive'; + riskLevel: 'critical' | 'high' | 'moderate' | 'positive'; baseRiskScore: number; additionalRiskScore: number; result: RuleResultSet; diff --git a/services/workflows-service/prisma/data-migrations b/services/workflows-service/prisma/data-migrations index d6f92b8106..68cc6c6fcf 160000 --- a/services/workflows-service/prisma/data-migrations +++ b/services/workflows-service/prisma/data-migrations @@ -1 +1 @@ -Subproject commit d6f92b8106b5bce47488d2d38bf0aca36647ece7 +Subproject commit 68cc6c6fcfacca4650a878413230b17d35ab4637 diff --git a/services/workflows-service/src/rule-engine/core/test/rule-engine.unit.test.ts b/services/workflows-service/src/rule-engine/core/test/rule-engine.unit.test.ts index a0b591f84f..f802169029 100644 --- a/services/workflows-service/src/rule-engine/core/test/rule-engine.unit.test.ts +++ b/services/workflows-service/src/rule-engine/core/test/rule-engine.unit.test.ts @@ -119,12 +119,13 @@ describe('Rule Engine', () => { "LTE", "EXISTS", "IN", + "IN_CASE_INSENSITIVE", "NOT_IN" ], "path": [ "operator" ], - "message": "Invalid discriminator value. Expected 'LAST_YEAR' | 'AML_CHECK' | 'EQUALS' | 'NOT_EQUALS' | 'BETWEEN' | 'GT' | 'LT' | 'GTE' | 'LTE' | 'EXISTS' | 'IN' | 'NOT_IN'" + "message": "Invalid discriminator value. Expected 'LAST_YEAR' | 'AML_CHECK' | 'EQUALS' | 'NOT_EQUALS' | 'BETWEEN' | 'GT' | 'LT' | 'GTE' | 'LTE' | 'EXISTS' | 'IN' | 'IN_CASE_INSENSITIVE' | 'NOT_IN'" } ], "name": "ZodError" diff --git a/services/workflows-service/src/rule-engine/risk-rule.service.intg.test.ts b/services/workflows-service/src/rule-engine/risk-rule.service.intg.test.ts index 09abed522f..036d27a688 100644 --- a/services/workflows-service/src/rule-engine/risk-rule.service.intg.test.ts +++ b/services/workflows-service/src/rule-engine/risk-rule.service.intg.test.ts @@ -1,5 +1,5 @@ import { fetchServiceFromModule } from '@/test/helpers/nest-app-helper'; -import { NotionService } from './../notion/notion.service'; +import { NotionService } from '../notion/notion.service'; import { RiskRuleService } from './risk-rule.service'; // We should inject notion api key in order to run it during CI pipeline diff --git a/services/workflows-service/src/rule-engine/risk-rule.service.ts b/services/workflows-service/src/rule-engine/risk-rule.service.ts index 83e6bfc1b0..4e11804134 100644 --- a/services/workflows-service/src/rule-engine/risk-rule.service.ts +++ b/services/workflows-service/src/rule-engine/risk-rule.service.ts @@ -25,7 +25,7 @@ const NotionRiskRuleRecordSchema = z .pipe(RuleSetSchema), Domain: z.string().min(1), Indicator: z.string().min(1), - 'Risk level': z.enum(['positive', 'moderate', 'critical']), + 'Risk level': z.enum(['positive', 'moderate', 'high', 'critical']), 'Base risk score': z.number().min(0).max(100), 'Additional risk score': z.number().min(0).max(100), 'Min risk score': z.number().min(0).max(100), diff --git a/services/workflows-service/src/workflow/cron/ongoing-monitoring.cron.ts b/services/workflows-service/src/workflow/cron/ongoing-monitoring.cron.ts index 207314497e..1bf23d9758 100644 --- a/services/workflows-service/src/workflow/cron/ongoing-monitoring.cron.ts +++ b/services/workflows-service/src/workflow/cron/ongoing-monitoring.cron.ts @@ -30,7 +30,7 @@ export class OngoingMonitoringCron { protected readonly businessReportService: BusinessReportService, ) {} - @Cron(CronExpression.EVERY_MINUTE) + @Cron(CronExpression.EVERY_HOUR) async handleCron() { this.logger.log('Ongoing monitoring cron started');