Files
Kordant/services/removebrokers/src/BrokerAlertPipeline.ts
Michael Freno 7410813f4e Fix review findings for info broker removal service FRE-5402
P0 fixes:
- Add CANCELLED status to RemovalStatus enum (types + Prisma schema)
- Use CANCELLED instead of REJECTED for user-initiated cancellations
- Add null guard for req.broker?.name in GET /request/:id
- Remove unsafe 'as any' casts in RemoveBrokersService.ts
- Add type-safe toPersonalInfo() validator for JSON deserialization
- Type RemovalRequestWithBroker properly in getRemovalStatus()
- Fix alert: any to NormalizedAlertInput in BrokerAlertPipeline

P1 fixes:
- Fix admin role check: remove non-existent 'admin', only check 'support'
- Fix BrokerDefinition.category type from string to BrokerCategory
- Add complete OpenAPI spec for all removebrokers routes and schemas
2026-05-17 02:30:00 -04:00

70 lines
2.0 KiB
TypeScript

import { AlertSource, AlertCategory, Severity, EntityType, NormalizedAlertInput } from "@shieldai/types";
export interface BrokerAlertInput {
userId: string;
brokerName: string;
brokerId: string;
category: AlertCategory;
severity: Severity;
title: string;
description: string;
entities: Array<{ type: EntityType; value: string }>;
metadata?: Record<string, unknown>;
}
export class BrokerAlertPipeline {
async sendListingFoundAlert(input: BrokerAlertInput) {
const alert = {
source: AlertSource.INFO_BROKER,
category: AlertCategory.INFO_BROKER_LISTING,
severity: input.severity,
userId: input.userId,
title: input.title,
description: input.description,
entities: input.entities,
sourceAlertId: `broker_listing_${input.brokerId}_${Date.now()}`,
payload: {
brokerId: input.brokerId,
brokerName: input.brokerName,
...input.metadata,
},
timestamp: new Date(),
};
return this.normalizeAndSend(alert);
}
async sendRemovalStatusAlert(input: BrokerAlertInput) {
const alert = {
source: AlertSource.INFO_BROKER,
category: AlertCategory.INFO_BROKER_REMOVAL,
severity: input.severity,
userId: input.userId,
title: input.title,
description: input.description,
entities: input.entities,
sourceAlertId: `broker_removal_${input.brokerId}_${Date.now()}`,
payload: {
brokerId: input.brokerId,
brokerName: input.brokerName,
...input.metadata,
},
timestamp: new Date(),
};
return this.normalizeAndSend(alert);
}
private async normalizeAndSend(alert: NormalizedAlertInput) {
try {
const { correlationPipeline } = await import("@shieldai/correlation");
return correlationPipeline.normalizeAlert(alert);
} catch {
console.error("[BrokerAlert] Failed to send alert:", alert.sourceAlertId);
return alert;
}
}
}
export const brokerAlertPipeline = new BrokerAlertPipeline();