95 lines
2.5 KiB
TypeScript
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',
|
|
};
|
|
}
|
|
} |