feat: add carrier-aware signature retirement alerts
This commit is contained in:
@@ -598,9 +598,29 @@ export function normalizeChannelCarrier(carrier?: string | null) {
|
||||
return value;
|
||||
}
|
||||
|
||||
export function isChannelCarrierCompatible(channelCarrier: string | null | undefined, groupCarrier: string) {
|
||||
const normalized = normalizeChannelCarrier(channelCarrier);
|
||||
return normalized === 'all' || normalized === groupCarrier;
|
||||
export const SUPPORTED_CHANNEL_CARRIERS = ['mobile', 'unicom', 'telecom'] as const;
|
||||
|
||||
export function normalizeChannelCarriers(carriers?: string[] | null, legacyCarrier?: string | null): string[] {
|
||||
const source = carriers?.length
|
||||
? carriers
|
||||
: normalizeChannelCarrier(legacyCarrier ?? 'mobile') === 'all'
|
||||
? [...SUPPORTED_CHANNEL_CARRIERS]
|
||||
: [normalizeChannelCarrier(legacyCarrier ?? 'mobile')];
|
||||
const normalized = [...new Set(source.map((carrier) => normalizeBusinessCarrier(carrier)))];
|
||||
if (normalized.length === 0) throw new BadRequestException('至少选择一个运营商');
|
||||
return SUPPORTED_CHANNEL_CARRIERS.filter((carrier) => normalized.includes(carrier));
|
||||
}
|
||||
|
||||
export function legacyCarrierFromCapabilities(carriers: string[]) {
|
||||
if (carriers.length === 1) return carriers[0];
|
||||
if (carriers.length === SUPPORTED_CHANNEL_CARRIERS.length) return 'all';
|
||||
// Old readers must fail closed for a two-carrier channel instead of treating
|
||||
// it as three-network capable and accidentally routing unsupported traffic.
|
||||
return 'multi';
|
||||
}
|
||||
|
||||
export function isChannelCarrierCompatible(channelCarrier: string | null | undefined, groupCarrier: string, carriers?: string[] | null) {
|
||||
return normalizeChannelCarriers(carriers, channelCarrier).includes(normalizeBusinessCarrier(groupCarrier));
|
||||
}
|
||||
|
||||
export function normalizeRegion(region?: string | null) {
|
||||
@@ -614,7 +634,7 @@ export function isRegionCompatible(channelRegion: string | null | undefined, ite
|
||||
export function validateGroupItems(
|
||||
groupCarrier: string,
|
||||
items: Array<Omit<CreateChannelGroupItemDto, 'groupId'>>,
|
||||
channels: Map<string, { id: string; carrier?: string | null; sendRegion?: string | null }>,
|
||||
channels: Map<string, { id: string; carrier?: string | null; carriers?: string[] | null; sendRegion?: string | null }>,
|
||||
) {
|
||||
const channelIds = new Set<string>();
|
||||
const provinces = new Set<string>();
|
||||
@@ -632,7 +652,7 @@ export function validateGroupItems(
|
||||
throw new BadRequestException('通道组内不能重复配置同一通道');
|
||||
}
|
||||
channelIds.add(item.channelId);
|
||||
if (!isChannelCarrierCompatible(channel.carrier, groupCarrier)) {
|
||||
if (!isChannelCarrierCompatible(channel.carrier, groupCarrier, channel.carriers)) {
|
||||
throw new BadRequestException('Channel carrier is not compatible with the channel group carrier');
|
||||
}
|
||||
if (item.province) {
|
||||
|
||||
Reference in New Issue
Block a user