fix: accept scheme-less drainage URLs

This commit is contained in:
hectorzhao
2026-08-28 17:58:45 +08:00
parent c68ac7a3db
commit 5328bb09bf
11 changed files with 50 additions and 13 deletions
+3 -6
View File
@@ -10,14 +10,11 @@ import { APPLICATION_DISABLE_GRACE_MS, DEFAULT_APPLICATION_DISABLE_SCAN_INTERVAL
import { SmsReportValidationService } from './report-validation.service';
import { SmsAuditService } from './audit.service';
import { shanghaiDateRange } from '../common/shanghai-date-range';
const DRAINAGE_TARGET_PATTERN = /^(?:https?:\/\/\S+|(?:\+?86[\s-]?)?1(?:[\s-]?\d){10}|(?:\+?86[\s-]?)?(?:\(?0\d{2,3}\)?[\s-]?)?\d{7,8}(?:[\s-]?(?:转|ext\.?)?[\s-]?\d{1,6})?)$/i;
import { DRAINAGE_TARGET_ERROR, normalizeDrainageTarget as readDrainageTarget } from '../common/drainage-target';
function normalizeDrainageTarget(value?: string) {
const target = value?.trim() ?? '';
if (!target || !DRAINAGE_TARGET_PATTERN.test(target)) {
throw new BadRequestException('引流信息必须是 http/https URL、手机号码或固定电话号码');
}
const target = readDrainageTarget(value);
if (!target) throw new BadRequestException(DRAINAGE_TARGET_ERROR);
return target;
}
@@ -1024,6 +1024,20 @@ describe('SmsConfigService', () => {
expect(prisma.channelSignatureReportTask.create).not.toHaveBeenCalled();
});
it('accepts a scheme-less drainage URL and synchronizes the compatibility name', async () => {
const prisma = createPrismaMock();
prisma.smsSignature.findUnique.mockResolvedValue({ id: 'sig-1', tenantId: 'tenant-1', applicationId: 'app-1', auditStatus: 'approved' });
prisma.channelRouteRule.findMany.mockResolvedValue([]);
const service = new SmsConfigService(prisma as never);
await expect(service.createDrainageInfo('sig-1', { url: 'example.com/path', reportValues: {} }, {}, 'tenant-1'))
.resolves.toEqual(expect.objectContaining({ id: 'drainage-1', auditStatus: 'pending' }));
expect(prisma.smsDrainageInfo.create).toHaveBeenCalledWith(expect.objectContaining({
data: expect.objectContaining({ siteName: 'example.com/path', url: 'example.com/path' }),
}));
});
it('resets an approved signature to pending when key content is changed', async () => {
const prisma = createPrismaMock();
prisma.smsSignature.findUnique.mockResolvedValue({