webadmin端增加商铺日志
This commit is contained in:
@@ -150,6 +150,23 @@ export class AuthService {
|
||||
});
|
||||
}
|
||||
|
||||
private trackStoreEvent(
|
||||
storeAccountId: bigint | undefined,
|
||||
storeId: bigint,
|
||||
clientApp: ClientApp | string,
|
||||
eventName: string,
|
||||
extraJson?: Record<string, unknown>,
|
||||
ref?: { refType?: string; refId?: bigint },
|
||||
) {
|
||||
this.analyticsService.trackStoreOneSafe(storeAccountId, clientApp, {
|
||||
storeId,
|
||||
eventName,
|
||||
refType: ref?.refType,
|
||||
refId: ref?.refId,
|
||||
extraJson,
|
||||
});
|
||||
}
|
||||
|
||||
private async assertSmsSendAllowed(phone: string, scene: SmsScene) {
|
||||
if (scene === SmsScene.STORE_LOGIN) {
|
||||
const account = await this.prisma.storeAccount.findUnique({ where: { phone } });
|
||||
@@ -222,6 +239,19 @@ export class AuthService {
|
||||
if (!result.ok) {
|
||||
throw new BadRequestException(result.errorMessage ?? '短信发送失败');
|
||||
}
|
||||
if (scene === SmsScene.STORE_LOGIN && actorRef?.refType === 'STORE') {
|
||||
const storeAccount = await this.prisma.storeAccount.findUnique({
|
||||
where: { id: actorRef.refId },
|
||||
select: { id: true, storeId: true },
|
||||
});
|
||||
if (storeAccount) {
|
||||
this.trackStoreEvent(storeAccount.id, storeAccount.storeId, clientApp, 'store_sms_send', {
|
||||
scene,
|
||||
phone: this.maskPhone(normalizedPhone),
|
||||
status: 'success',
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
if (err instanceof BadRequestException) throw err;
|
||||
const message = err instanceof Error ? err.message : '短信发送失败';
|
||||
@@ -435,7 +465,18 @@ export class AuthService {
|
||||
|
||||
async loginStore(phone: string, code: string, clientApp: ClientApp) {
|
||||
const normalizedPhone = this.assertMobilePhone(phone);
|
||||
await this.smsProvider.verify(normalizedPhone, code, SmsScene.STORE_LOGIN);
|
||||
try {
|
||||
await this.smsProvider.verify(normalizedPhone, code, SmsScene.STORE_LOGIN);
|
||||
} catch (err) {
|
||||
const account = await this.prisma.storeAccount.findUnique({ where: { phone: normalizedPhone } });
|
||||
if (account) {
|
||||
this.trackStoreEvent(account.id, account.storeId, clientApp, 'store_sms_verify_fail', {
|
||||
phone: this.maskPhone(normalizedPhone),
|
||||
reason: err instanceof BadRequestException ? err.message : '验证码错误',
|
||||
});
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
const account = await this.prisma.storeAccount.findUnique({
|
||||
where: { phone: normalizedPhone },
|
||||
include: { store: true },
|
||||
@@ -446,6 +487,12 @@ export class AuthService {
|
||||
where: { id: account.id },
|
||||
data: { lastLoginAt: new Date() },
|
||||
});
|
||||
this.trackStoreEvent(account.id, account.storeId, clientApp, 'store_sms_login', {
|
||||
phone: this.maskPhone(normalizedPhone),
|
||||
});
|
||||
this.trackStoreEvent(account.id, account.storeId, clientApp, 'store_login_success', {
|
||||
method: 'sms',
|
||||
});
|
||||
return this.issueToken('STORE', account.id, clientApp, false, undefined, {
|
||||
id: account.id.toString(),
|
||||
storeId: account.storeId.toString(),
|
||||
@@ -828,6 +875,12 @@ export class AuthService {
|
||||
include: { store: true },
|
||||
});
|
||||
|
||||
this.trackStoreEvent(account.id, account.storeId, clientApp, 'store_wechat_login', { platform });
|
||||
this.trackStoreEvent(account.id, account.storeId, clientApp, 'store_login_success', {
|
||||
method: 'wechat',
|
||||
platform,
|
||||
});
|
||||
|
||||
return this.issueToken('STORE', account.id, clientApp, false, undefined, {
|
||||
id: account.id.toString(),
|
||||
storeId: account.storeId.toString(),
|
||||
@@ -872,6 +925,8 @@ export class AuthService {
|
||||
include: { store: true },
|
||||
});
|
||||
|
||||
this.trackStoreEvent(updated.id, updated.storeId, clientApp, 'store_wechat_bind', { platform });
|
||||
|
||||
return this.issueToken('STORE', updated.id, clientApp, false, undefined, {
|
||||
id: updated.id.toString(),
|
||||
storeId: updated.storeId.toString(),
|
||||
|
||||
Reference in New Issue
Block a user