forked from Yara724/api
Added SMS for Link flow of FIELD-EXPERT: YARA-802
This commit is contained in:
@@ -3741,10 +3741,11 @@ export class RequestManagementService {
|
||||
async sendLinkV2(
|
||||
expert: any,
|
||||
requestId: string,
|
||||
dto: { frontendRoute: string },
|
||||
): Promise<{
|
||||
sent: boolean;
|
||||
linkUrl: string;
|
||||
sentTo: { role: string; phoneNumber: string }[];
|
||||
sentTo: { role: string; phoneNumber: string; smsSent: boolean }[];
|
||||
}> {
|
||||
const req = await this.blameRequestDbService.findById(requestId);
|
||||
if (!req) throw new NotFoundException("Request not found");
|
||||
@@ -3755,29 +3756,55 @@ export class RequestManagementService {
|
||||
}
|
||||
this.verifyExpertAccessForBlameV2(req, expert);
|
||||
|
||||
const baseUrl =
|
||||
process.env.FRONTEND_BASE_URL || process.env.APP_URL || "";
|
||||
const linkUrl = baseUrl
|
||||
? `${baseUrl.replace(/\/$/, "")}/blame/${requestId}`
|
||||
: "";
|
||||
if (!dto?.frontendRoute) {
|
||||
throw new BadRequestException("frontendRoute is required");
|
||||
}
|
||||
if (!process.env.URL) {
|
||||
throw new InternalServerErrorException(
|
||||
"URL environment variable is not configured",
|
||||
);
|
||||
}
|
||||
const linkUrl = `${process.env.URL}/${dto.frontendRoute}?token=${requestId}`;
|
||||
const typeToken =
|
||||
req.type === BlameRequestType.CAR_BODY ? "بدنه" : "ثالث";
|
||||
const expertName =
|
||||
`${expert?.lastName || ""}`.trim() || "کارشناس";
|
||||
|
||||
const sentTo: { role: string; phoneNumber: string; smsSent: boolean }[] = [];
|
||||
const template = "yara-field-expert-link";
|
||||
const sendSms = async (phone: string, role: PartyRole): Promise<boolean> => {
|
||||
try {
|
||||
await this.smsManagerService.verifyLookUp({
|
||||
template,
|
||||
receptor: phone,
|
||||
token: typeToken,
|
||||
token2: expertName,
|
||||
token3: linkUrl,
|
||||
});
|
||||
this.logger.log(
|
||||
`[SMS] Field-expert link sent role=${role} receptor=${phone} template=${template}`,
|
||||
);
|
||||
return true;
|
||||
} catch (er) {
|
||||
this.logger.error(
|
||||
`[SMS] Field-expert link failed role=${role} receptor=${phone}: ${describeSmsError(er)}`,
|
||||
);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const sentTo: { role: string; phoneNumber: string }[] = [];
|
||||
const firstIdx = this.getPartyIndex(req, PartyRole.FIRST);
|
||||
if (firstIdx !== -1 && req.parties[firstIdx]?.person?.phoneNumber) {
|
||||
const phone = req.parties[firstIdx].person.phoneNumber;
|
||||
this.logger.log(
|
||||
`[MOCK SMS] Would send link to first party ${phone}: ${linkUrl}`,
|
||||
);
|
||||
sentTo.push({ role: PartyRole.FIRST, phoneNumber: phone });
|
||||
const smsSent = await sendSms(phone, PartyRole.FIRST);
|
||||
sentTo.push({ role: PartyRole.FIRST, phoneNumber: phone, smsSent });
|
||||
}
|
||||
if (req.type === BlameRequestType.THIRD_PARTY) {
|
||||
const secondIdx = this.getPartyIndex(req, PartyRole.SECOND);
|
||||
if (secondIdx !== -1 && req.parties[secondIdx]?.person?.phoneNumber) {
|
||||
const phone = req.parties[secondIdx].person.phoneNumber;
|
||||
this.logger.log(
|
||||
`[MOCK SMS] Would send link to second party ${phone}: ${linkUrl}`,
|
||||
);
|
||||
sentTo.push({ role: PartyRole.SECOND, phoneNumber: phone });
|
||||
const smsSent = await sendSms(phone, PartyRole.SECOND);
|
||||
sentTo.push({ role: PartyRole.SECOND, phoneNumber: phone, smsSent });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3789,11 +3816,15 @@ export class RequestManagementService {
|
||||
actorName: `${expert.firstName || ""} ${expert.lastName || ""}`.trim(),
|
||||
actorType: "field_expert",
|
||||
},
|
||||
metadata: { linkUrl, sentTo },
|
||||
metadata: { linkUrl, sentTo, template, typeToken, frontendRoute: dto.frontendRoute },
|
||||
});
|
||||
await (req as any).save();
|
||||
|
||||
return { sent: true, linkUrl, sentTo };
|
||||
return {
|
||||
sent: sentTo.length > 0 && sentTo.every((x) => x.smsSent),
|
||||
linkUrl,
|
||||
sentTo,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user