Mirror of https://github.com/roostorg/coop
github.com/roostorg/coop
1import _ from 'lodash';
2import { type ReadonlyDeep } from 'type-fest';
3
4import { type Dependencies } from '../../iocContainer/index.js';
5import { inject } from '../../iocContainer/utils.js';
6import { type ConditionSetWithResult } from '../../models/rules/RuleModel.js';
7import { type RuleEnvironment } from '../../rule_engine/RuleEngine.js';
8import { type ItemSubmission } from '../../services/itemProcessingService/index.js';
9import { type ReportingRuleExecutionCorrelationId } from '../../services/reportingService/index.js';
10import { fromCorrelationId } from '../../utils/correlationIds.js';
11import { jsonStringify } from '../../utils/encoding.js';
12import { getUtcDateOnlyString } from '../../utils/time.js';
13import { pickConditionPropsToLog } from './ruleExecutionLoggingUtils.js';
14
15type ReportingRuleExecutionData = {
16 orgId: string;
17 reportingRule: ReadonlyDeep<{
18 id: string;
19 name: string;
20 version: string;
21 environment: RuleEnvironment;
22 }>;
23 ruleInput: ItemSubmission;
24 result: ReadonlyDeep<ConditionSetWithResult>;
25 passed: boolean;
26 correlationId: ReportingRuleExecutionCorrelationId;
27 policyNames: readonly string[];
28 policyIds: readonly string[];
29};
30
31class ReportingRuleExecutionLogger {
32 constructor(
33 private readonly analytics: Dependencies['DataWarehouseAnalytics'],
34 ) {}
35 async logReportingRuleExecutions(
36 executions: readonly ReportingRuleExecutionData[],
37 ) {
38 const now = new Date();
39 await this.analytics.bulkWrite(
40 'REPORTING_SERVICE.REPORTING_RULE_EXECUTIONS' as any,
41 executions.map((data) => ({
42 ds: getUtcDateOnlyString(now),
43 ts: now.valueOf(),
44 org_id: data.orgId,
45 item_id: data.ruleInput.itemId,
46 item_type_id: data.ruleInput.itemType.id,
47 item_type_kind: data.ruleInput.itemType.kind,
48 item_submission_id: data.ruleInput.submissionId,
49 item_data: jsonStringify(data.ruleInput.data),
50 item_type_name: data.ruleInput.itemType.name,
51 item_creator_id: data.ruleInput.creator?.id,
52 item_creator_type_id: data.ruleInput.creator?.typeId,
53 item_type_schema: jsonStringify(data.ruleInput.itemType.schema),
54 item_type_schema_field_roles: data.ruleInput.itemType.schemaFieldRoles,
55 item_type_schema_variant: data.ruleInput.itemType.schemaVariant,
56 item_type_version: data.ruleInput.itemType.version,
57 policy_names: data.policyNames,
58 policy_ids: data.policyIds,
59 rule_name: data.reportingRule.name,
60 rule_id: data.reportingRule.id,
61 rule_version: data.reportingRule.version,
62 rule_environment: data.reportingRule.environment,
63 correlation_id: fromCorrelationId(data.correlationId),
64 result: pickConditionPropsToLog(data.result),
65 passed: data.passed,
66 })),
67 );
68 }
69}
70
71export default inject(['DataWarehouseAnalytics'], ReportingRuleExecutionLogger);
72export { type ReportingRuleExecutionLogger };