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
70 lines
2.0 KiB
TypeScript
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();
|