dcb-service-core-api/src/modules/notifications/services/sms.service.ts
Mamadou Khoussa [028918 DSI/DAC/DIF/DS] c479637d04 first commit
2025-10-21 23:47:31 +00:00

95 lines
2.5 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { OperatorsService } from '../../operators/operators.service';
import { PrismaService } from '../../../shared/services/prisma.service';
@Injectable()
export class SmsService {
constructor(
private readonly operatorsService: OperatorsService,
private readonly prisma: PrismaService,
private readonly configService: ConfigService,
) {}
async send(params: {
to: string;
message: string;
userToken?: string;
userAlias?: string;
from?: string;
}) {
// Si on a un userToken, utiliser l'opérateur de l'utilisateur
if (params.userToken) {
const user = await this.prisma.user.findUnique({
where: { userToken: params.userToken },
include: { operator: true },
});
if (user) {
const adapter = this.operatorsService.getAdapter(
user.operator.code,
user.country,
);
return await adapter.sendSms({
to: params.to,
message: params.message,
userToken: params.userToken,
userAlias: params.userAlias,
from: params.from,
country: user.country,
});
}
}
// Sinon, détecter l'opérateur par le numéro
const operator = this.detectOperatorByNumber(params.to);
const adapter = this.operatorsService.getAdapter(operator.code, operator.country);
return await adapter.sendSms({
to: params.to,
message: params.message,
from: params.from,
country: operator.country,
});
}
async sendOtp(msisdn: string, code: string, template?: string) {
const message = template
? template.replace('{code}', code)
: `Your verification code is: ${code}`;
return this.send({
to: msisdn,
message: message,
});
}
async sendTransactional(params: {
to: string;
template: string;
variables: Record<string, any>;
userToken?: string;
}) {
// Remplacer les variables dans le template
let message = params.template;
for (const [key, value] of Object.entries(params.variables)) {
message = message.replace(new RegExp(`{${key}}`, 'g'), value);
}
return this.send({
to: params.to,
message: message,
userToken: params.userToken,
});
}
private detectOperatorByNumber(msisdn: string) {
// Logique de détection basée sur le préfixe
// Pour simplifier, on retourne Orange CI par défaut
return {
code: 'ORANGE',
country: 'CI',
};
}
}