a2abbb6169
Store list/detail package flow, configurable WeChat mini brand assets and customer service, shop H5 home refresh. Co-authored-by: Cursor <cursoragent@cursor.com>
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import { Injectable, Logger } from '@nestjs/common';
|
|
import { resolveMockSmsFixedCode } from '@dukang/shared-types';
|
|
import { PrismaService } from '../../common/prisma/prisma.module';
|
|
import { MockSmsCodeService } from '../../common/mock-sms-code/mock-sms-code.service';
|
|
import type { ISmsProvider, SmsActorRef, SmsSendResult } from './sms.interface';
|
|
import { SmsCodeStore } from './sms-code.store';
|
|
|
|
function maskPhone(phone: string) {
|
|
return `${phone.slice(0, 3)}****${phone.slice(-4)}`;
|
|
}
|
|
|
|
@Injectable()
|
|
export class SmsMockProvider implements ISmsProvider {
|
|
private readonly logger = new Logger(SmsMockProvider.name);
|
|
|
|
constructor(
|
|
private readonly smsCodeStore: SmsCodeStore,
|
|
private readonly prisma: PrismaService,
|
|
private readonly mockSmsCodeService: MockSmsCodeService,
|
|
) {}
|
|
|
|
async send(phone: string, scene: string, actorRef?: SmsActorRef): Promise<SmsSendResult> {
|
|
const fixedCode = resolveMockSmsFixedCode(process.env);
|
|
const code = await this.smsCodeStore.storeCode(phone, scene, fixedCode);
|
|
await this.mockSmsCodeService.record(phone, scene, code);
|
|
const masked = maskPhone(phone);
|
|
this.logger.log(`Mock SMS → ${masked} scene=${scene} code=${code}`);
|
|
|
|
const log = await this.prisma.logThirdParty.create({
|
|
data: {
|
|
provider: 'SMS',
|
|
scene,
|
|
refType: actorRef?.refType,
|
|
refId: actorRef?.refId,
|
|
requestBody: { phone: masked, mode: 'MOCK', scene },
|
|
responseBody: { mock: true, hint: 'see HQ system settings mock SMS list' },
|
|
status: 'SUCCESS',
|
|
},
|
|
});
|
|
return { logId: log.id, ok: true };
|
|
}
|
|
|
|
async verify(phone: string, code: string, scene: string): Promise<void> {
|
|
await this.smsCodeStore.verifyAndConsume(phone, scene, code);
|
|
}
|
|
}
|