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; 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', }; } }