chore: add new method for sms service and notification service
This commit is contained in:
+1
-3
@@ -7,13 +7,11 @@ import { ConfigModule } from "@nestjs/config";
|
|||||||
import { ThrottlerModule } from "@nestjs/throttler";
|
import { ThrottlerModule } from "@nestjs/throttler";
|
||||||
import { TypeOrmModule } from "@nestjs/typeorm";
|
import { TypeOrmModule } from "@nestjs/typeorm";
|
||||||
import { MailerModule } from "@nestjs-modules/mailer";
|
import { MailerModule } from "@nestjs-modules/mailer";
|
||||||
import { TelegrafModule } from "nestjs-telegraf";
|
|
||||||
|
|
||||||
import { bullMqConfig } from "./configs/bullmq.config";
|
import { bullMqConfig } from "./configs/bullmq.config";
|
||||||
import { cacheConfig } from "./configs/cache.config";
|
import { cacheConfig } from "./configs/cache.config";
|
||||||
import { mailerConfig } from "./configs/mailer.config";
|
import { mailerConfig } from "./configs/mailer.config";
|
||||||
import { rateLimitConfig } from "./configs/rateLimit.config";
|
import { rateLimitConfig } from "./configs/rateLimit.config";
|
||||||
import { telegrafConfig } from "./configs/telegraf.config";
|
|
||||||
import { databaseConfigs } from "./configs/typeorm.config";
|
import { databaseConfigs } from "./configs/typeorm.config";
|
||||||
import { HTTPLogger } from "./core/middlewares/logger.middleware";
|
import { HTTPLogger } from "./core/middlewares/logger.middleware";
|
||||||
import { AddressModule } from "./modules/address/address.module";
|
import { AddressModule } from "./modules/address/address.module";
|
||||||
@@ -43,7 +41,7 @@ import { MonitoringModule } from "./monitoring/monitoring.module";
|
|||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
TelegrafModule.forRootAsync(telegrafConfig()),
|
// TelegrafModule.forRootAsync(telegrafConfig()),
|
||||||
MailerModule.forRootAsync(mailerConfig()),
|
MailerModule.forRootAsync(mailerConfig()),
|
||||||
BullModule.forRootAsync(bullMqConfig()),
|
BullModule.forRootAsync(bullMqConfig()),
|
||||||
ThrottlerModule.forRootAsync(rateLimitConfig()),
|
ThrottlerModule.forRootAsync(rateLimitConfig()),
|
||||||
|
|||||||
@@ -414,6 +414,19 @@ export const enum NotificationMessage {
|
|||||||
PAYMENT_REMINDER_MESSAGE = "لطفا مبلغ [amount] تومان را پرداخت کنید",
|
PAYMENT_REMINDER_MESSAGE = "لطفا مبلغ [amount] تومان را پرداخت کنید",
|
||||||
PAYMENT_CANCELLATION = "لغو پرداخت",
|
PAYMENT_CANCELLATION = "لغو پرداخت",
|
||||||
PAYMENT_CANCELLATION_MESSAGE = "پرداخت مبلغ [amount] تومان لغو شد",
|
PAYMENT_CANCELLATION_MESSAGE = "پرداخت مبلغ [amount] تومان لغو شد",
|
||||||
|
// Admin notification messages
|
||||||
|
NEW_BLOG_COMMENT = "نظر جدید در بلاگ",
|
||||||
|
NEW_BLOG_COMMENT_MESSAGE = "یک نظر جدید در بلاگ [blogTitle] ثبت شده است",
|
||||||
|
NEW_SERVICE_REVIEW = "نقد و بررسی جدید سرویس",
|
||||||
|
NEW_SERVICE_REVIEW_MESSAGE = "یک نقد و بررسی جدید برای سرویس [serviceName] ثبت شده است",
|
||||||
|
NEW_CUSTOMER = "مشتری جدید",
|
||||||
|
NEW_CUSTOMER_MESSAGE = "یک مشتری جدید با نام [customerName] ثبت نام کرده است",
|
||||||
|
NEW_SUBSCRIPTION = "اشتراک جدید",
|
||||||
|
NEW_SUBSCRIPTION_MESSAGE = "یک اشتراک جدید برای پلن [serviceName] برای [fullName] ثبت شد",
|
||||||
|
NEW_TICKET = "تیکت جدید",
|
||||||
|
NEW_TICKET_MESSAGE = "یک تیکت جدید با موضوع [ticketSubject] ثبت شده است",
|
||||||
|
NEW_CRITICISM = "انتقاد جدید",
|
||||||
|
NEW_CRITICISM_MESSAGE = "یک انتقاد جدید با موضوع [title] ثبت شده است",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum SubscriptionMessage {
|
export const enum SubscriptionMessage {
|
||||||
|
|||||||
@@ -25,6 +25,13 @@ export function smsConfigs() {
|
|||||||
SMS_PATTERN_INVOICE_OVERDUE: configService.getOrThrow<string>("SMS_PATTERN_INVOICE_OVERDUE"),
|
SMS_PATTERN_INVOICE_OVERDUE: configService.getOrThrow<string>("SMS_PATTERN_INVOICE_OVERDUE"),
|
||||||
SMS_PATTERN_PAYMENT_REMINDER: configService.getOrThrow<string>("SMS_PATTERN_PAYMENT_REMINDER"),
|
SMS_PATTERN_PAYMENT_REMINDER: configService.getOrThrow<string>("SMS_PATTERN_PAYMENT_REMINDER"),
|
||||||
SMS_PATTERN_PAYMENT_CANCELLATION: configService.getOrThrow<string>("SMS_PATTERN_PAYMENT_CANCELLATION"),
|
SMS_PATTERN_PAYMENT_CANCELLATION: configService.getOrThrow<string>("SMS_PATTERN_PAYMENT_CANCELLATION"),
|
||||||
|
//
|
||||||
|
SMS_PATTERN_BLOG_NEW_COMMENT: configService.getOrThrow<string>("SMS_PATTERN_BLOG_NEW_COMMENT"),
|
||||||
|
SMS_PATTERN_NEW_SERVICE_REVIEW: configService.getOrThrow<string>("SMS_PATTERN_NEW_SERVICE_REVIEW"),
|
||||||
|
SMS_PATTERN_NEW_CUSTOMER: configService.getOrThrow<string>("SMS_PATTERN_NEW_CUSTOMER"),
|
||||||
|
SMS_PATTERN_NEW_SUBSCRIPTION: configService.getOrThrow<string>("SMS_PATTERN_NEW_SUBSCRIPTION"),
|
||||||
|
SMS_PATTERN_NEW_TICKET_GLOBAL: configService.getOrThrow<string>("SMS_PATTERN_NEW_TICKET_GLOBAL"),
|
||||||
|
SMS_PATTERN_NEW_CRITICISM: configService.getOrThrow<string>("SMS_PATTERN_NEW_CRITICISM"),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -51,4 +58,11 @@ export interface ISmsConfigs {
|
|||||||
SMS_PATTERN_INVOICE_OVERDUE: string;
|
SMS_PATTERN_INVOICE_OVERDUE: string;
|
||||||
SMS_PATTERN_PAYMENT_REMINDER: string;
|
SMS_PATTERN_PAYMENT_REMINDER: string;
|
||||||
SMS_PATTERN_PAYMENT_CANCELLATION: string;
|
SMS_PATTERN_PAYMENT_CANCELLATION: string;
|
||||||
|
//
|
||||||
|
SMS_PATTERN_BLOG_NEW_COMMENT: string;
|
||||||
|
SMS_PATTERN_NEW_SERVICE_REVIEW: string;
|
||||||
|
SMS_PATTERN_NEW_CUSTOMER: string;
|
||||||
|
SMS_PATTERN_NEW_SUBSCRIPTION: string;
|
||||||
|
SMS_PATTERN_NEW_TICKET_GLOBAL: string;
|
||||||
|
SMS_PATTERN_NEW_CRITICISM: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,3 +50,35 @@ export interface IPaymentNotificationData extends IBaseNotificationData {
|
|||||||
amount: number;
|
amount: number;
|
||||||
paymentId: string;
|
paymentId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IBlogCommentNotificationData extends IBaseNotificationData {
|
||||||
|
blogTitle: string;
|
||||||
|
fullName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IServiceReviewNotificationData extends IBaseNotificationData {
|
||||||
|
serviceName: string;
|
||||||
|
fullName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INewCustomerNotificationData extends IBaseNotificationData {
|
||||||
|
fullName: string;
|
||||||
|
mobile: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INewSubscriptionNotificationData extends IBaseNotificationData {
|
||||||
|
serviceName: string;
|
||||||
|
fullName: string;
|
||||||
|
date: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INewTicketNotificationData extends IBaseNotificationData {
|
||||||
|
ticketId: string;
|
||||||
|
ticketSubject: string;
|
||||||
|
fullName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INewCriticismNotificationData extends IBaseNotificationData {
|
||||||
|
title: string;
|
||||||
|
fullName: string;
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,8 +13,14 @@ import { Notification } from "../entities/notification.entity";
|
|||||||
import {
|
import {
|
||||||
IAnnouncementNotificationData,
|
IAnnouncementNotificationData,
|
||||||
IBaseNotificationData,
|
IBaseNotificationData,
|
||||||
|
IBlogCommentNotificationData,
|
||||||
IInvoiceNotificationData,
|
IInvoiceNotificationData,
|
||||||
|
INewCriticismNotificationData,
|
||||||
|
INewCustomerNotificationData,
|
||||||
|
INewSubscriptionNotificationData,
|
||||||
|
INewTicketNotificationData,
|
||||||
IPaymentNotificationData,
|
IPaymentNotificationData,
|
||||||
|
IServiceReviewNotificationData,
|
||||||
ISubscriptionNotificationData,
|
ISubscriptionNotificationData,
|
||||||
ITicketNotificationData,
|
ITicketNotificationData,
|
||||||
IWalletNotificationData,
|
IWalletNotificationData,
|
||||||
@@ -441,4 +447,116 @@ export class NotificationsService {
|
|||||||
queryRunner,
|
queryRunner,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------
|
||||||
|
|
||||||
|
// Admin notification methods
|
||||||
|
|
||||||
|
//--------------------------------------
|
||||||
|
async createNewBlogCommentNotification(recipientId: string, data: IBlogCommentNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_BLOG_COMMENT_MESSAGE.replace("[blogTitle]", data.blogTitle);
|
||||||
|
|
||||||
|
await this.smsService.sendBlogNewCommentSms(data.userPhone, data.blogTitle, data.fullName);
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_BLOG_COMMENT,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_BLOG_COMMENT, type: NotifType.NEW_BLOG_COMMENT, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
async createNewServiceReviewNotification(recipientId: string, data: IServiceReviewNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_SERVICE_REVIEW_MESSAGE.replace("[serviceName]", data.serviceName);
|
||||||
|
|
||||||
|
await this.smsService.sendNewServiceReviewSms(data.userPhone, data.serviceName, data.fullName);
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_SERVICE_REVIEW,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_SERVICE_REVIEW, type: NotifType.NEW_SERVICE_REVIEW, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async createNewCustomerNotification(recipientId: string, data: INewCustomerNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_CUSTOMER_MESSAGE.replace("[fullName]", data.fullName);
|
||||||
|
|
||||||
|
await this.smsService.sendNewCustomerSms(data.userPhone, data.fullName);
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_CUSTOMER,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_CUSTOMER, type: NotifType.NEW_CUSTOMER, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async createNewSubscriptionNotification(recipientId: string, data: INewSubscriptionNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_SUBSCRIPTION_MESSAGE.replace("[serviceName]", data.serviceName);
|
||||||
|
|
||||||
|
await this.smsService.sendNewSubscriptionSms(data.userPhone, data.serviceName, data.fullName, dateFormat(data.date));
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_SUBSCRIPTION,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_SUBSCRIPTION, type: NotifType.NEW_SUBSCRIPTION, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async createNewTicketNotification(recipientId: string, data: INewTicketNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_TICKET_MESSAGE.replace("[ticketSubject]", data.ticketSubject);
|
||||||
|
|
||||||
|
await this.smsService.sendGlobalNewTicketSms(data.userPhone, data.ticketId, data.ticketSubject, data.fullName);
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_TICKET,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_TICKET, type: NotifType.NEW_TICKET, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async createNewCriticismNotification(recipientId: string, data: INewCriticismNotificationData, queryRunner: QueryRunner) {
|
||||||
|
const message = NotificationMessage.NEW_CRITICISM_MESSAGE.replace("[title]", data.title);
|
||||||
|
|
||||||
|
await this.smsService.sendNewCriticismSms(data.userPhone, data.title, data.fullName);
|
||||||
|
if (data.userEmail) {
|
||||||
|
await this.emailService.sendAdminNotificationEmail({
|
||||||
|
userEmail: data.userEmail,
|
||||||
|
title: NotificationMessage.NEW_CRITICISM,
|
||||||
|
message,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.createNotification(
|
||||||
|
{ title: NotificationMessage.NEW_CRITICISM, type: NotifType.NEW_CRITICISM, message, recipientId },
|
||||||
|
queryRunner,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ export enum NotifCategory {
|
|||||||
INVOICE = "INVOICE",
|
INVOICE = "INVOICE",
|
||||||
ACCOUNT = "ACCOUNT",
|
ACCOUNT = "ACCOUNT",
|
||||||
FINANCE = "FINANCE", //WALLET AND ...
|
FINANCE = "FINANCE", //WALLET AND ...
|
||||||
// ANNOUNCEMENT = "ANNOUNCEMENT",
|
ADMIN = "ADMIN", // New category for admin notifications
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum NotifType {
|
export enum NotifType {
|
||||||
@@ -36,6 +36,14 @@ export enum NotifType {
|
|||||||
RECURRING_INVOICE = "RECURRING_INVOICE",
|
RECURRING_INVOICE = "RECURRING_INVOICE",
|
||||||
PAYMENT_REMINDER = "PAYMENT_REMINDER",
|
PAYMENT_REMINDER = "PAYMENT_REMINDER",
|
||||||
PAYMENT_CANCELLATION = "PAYMENT_CANCELLATION",
|
PAYMENT_CANCELLATION = "PAYMENT_CANCELLATION",
|
||||||
|
|
||||||
|
// // Admin category
|
||||||
|
NEW_BLOG_COMMENT = "NEW_BLOG_COMMENT",
|
||||||
|
NEW_SERVICE_REVIEW = "NEW_SERVICE_REVIEW",
|
||||||
|
NEW_CUSTOMER = "NEW_CUSTOMER",
|
||||||
|
NEW_SUBSCRIPTION = "NEW_SUBSCRIPTION",
|
||||||
|
NEW_TICKET = "NEW_TICKET",
|
||||||
|
NEW_CRITICISM = "NEW_CRITICISM",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NotifDescriptions: Record<NotifType, { fa: string; category: NotifCategory }> = {
|
export const NotifDescriptions: Record<NotifType, { fa: string; category: NotifCategory }> = {
|
||||||
@@ -65,6 +73,14 @@ export const NotifDescriptions: Record<NotifType, { fa: string; category: NotifC
|
|||||||
// Support category
|
// Support category
|
||||||
[NotifType.ANSWER_TICKET]: { fa: "پاسخ تیکت", category: NotifCategory.SUPPORT },
|
[NotifType.ANSWER_TICKET]: { fa: "پاسخ تیکت", category: NotifCategory.SUPPORT },
|
||||||
[NotifType.CREATE_TICKET]: { fa: "ثبت تیکت جدید", category: NotifCategory.SUPPORT },
|
[NotifType.CREATE_TICKET]: { fa: "ثبت تیکت جدید", category: NotifCategory.SUPPORT },
|
||||||
//TODO: FIX THIS this is for admin
|
|
||||||
[NotifType.ASSIGN_TICKET]: { fa: "ارجاع تیکت", category: NotifCategory.SUPPORT },
|
[NotifType.ASSIGN_TICKET]: { fa: "ارجاع تیکت", category: NotifCategory.SUPPORT },
|
||||||
|
|
||||||
|
// // Admin category
|
||||||
|
//this are not inserted in the database
|
||||||
|
[NotifType.NEW_BLOG_COMMENT]: { fa: "نظر جدید در بلاگ", category: NotifCategory.ADMIN },
|
||||||
|
[NotifType.NEW_SERVICE_REVIEW]: { fa: "نقد و بررسی جدید سرویس", category: NotifCategory.ADMIN },
|
||||||
|
[NotifType.NEW_CUSTOMER]: { fa: "مشتری جدید", category: NotifCategory.ADMIN },
|
||||||
|
[NotifType.NEW_SUBSCRIPTION]: { fa: "اشتراک جدید", category: NotifCategory.ADMIN },
|
||||||
|
[NotifType.NEW_TICKET]: { fa: "تیکت جدید", category: NotifCategory.ADMIN },
|
||||||
|
[NotifType.NEW_CRITICISM]: { fa: "انتقاد جدید", category: NotifCategory.ADMIN },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,4 +45,7 @@ export type TemplateParams =
|
|||||||
| "user"
|
| "user"
|
||||||
| "subject"
|
| "subject"
|
||||||
| "planName"
|
| "planName"
|
||||||
| "message";
|
| "message"
|
||||||
|
| "blogTitle"
|
||||||
|
| "fullName"
|
||||||
|
| "mobile";
|
||||||
|
|||||||
@@ -153,4 +153,23 @@ export class EmailService {
|
|||||||
this.logger.error("error in sending payment cancellation email", error);
|
this.logger.error("error in sending payment cancellation email", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async sendAdminNotificationEmail(data: { userEmail: string; title: string; message: string }) {
|
||||||
|
const emailData = {
|
||||||
|
to: data.userEmail,
|
||||||
|
subject: data.title,
|
||||||
|
template: "admin-notification",
|
||||||
|
context: {
|
||||||
|
title: data.title,
|
||||||
|
message: data.message,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.mailerService.sendMail(emailData);
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending admin notification email", error);
|
||||||
|
throw new InternalServerErrorException("error in sending admin notification email");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -490,7 +490,7 @@ export class SmsService {
|
|||||||
return data;
|
return data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.error("error in sending sms", error);
|
this.logger.error("error in sending sms", error);
|
||||||
throw new InternalServerErrorException("error in sending sms");
|
// throw new InternalServerErrorException("error in sending sms");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,7 +522,7 @@ export class SmsService {
|
|||||||
return data;
|
return data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.error("error in sending sms", error);
|
this.logger.error("error in sending sms", error);
|
||||||
throw new InternalServerErrorException("error in sending sms");
|
// throw new InternalServerErrorException("error in sending sms");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,4 +604,188 @@ export class SmsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//************************************************* */
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendBlogNewCommentSms(mobile: string, blogTitle: string, fullName: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "blogTitle", value: blogTitle },
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_BLOG_NEW_COMMENT,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending blog new comment sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending blog new comment sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
// throw new InternalServerErrorException("error in sending sms");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendNewServiceReviewSms(mobile: string, serviceName: string, fullName: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "serviceName", value: serviceName },
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_NEW_SERVICE_REVIEW,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending new service review sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending new service review sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendNewCustomerSms(mobile: string, fullName: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
{ name: "mobile", value: mobile },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_NEW_CUSTOMER,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending new customer sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending new customer sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendNewSubscriptionSms(mobile: string, serviceName: string, fullName: string, date: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "serviceName", value: serviceName },
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
{ name: "date", value: date },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_NEW_SUBSCRIPTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending new subscription sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending new subscription sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendGlobalNewTicketSms(mobile: string, ticketId: string, subject: string, fullName: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "ticketId", value: ticketId },
|
||||||
|
{ name: "subject", value: subject },
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_NEW_TICKET_GLOBAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending global new ticket sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending global new ticket sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//************************************************* */
|
||||||
|
|
||||||
|
async sendNewCriticismSms(mobile: string, title: string, fullName: string) {
|
||||||
|
const smsData: ISmsVerifyBody = {
|
||||||
|
Parameters: [
|
||||||
|
{ name: "title", value: title },
|
||||||
|
{ name: "fullName", value: fullName },
|
||||||
|
],
|
||||||
|
Mobile: mobile,
|
||||||
|
TemplateId: this.smsConfigs.SMS_PATTERN_NEW_CRITICISM,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { data } = await firstValueFrom(
|
||||||
|
this.httpService
|
||||||
|
.post<ISmsVerifyResponse>(`${this.smsConfigs.API_URL}/send/verify`, smsData, {
|
||||||
|
headers: { "X-API-KEY": this.smsConfigs.API_KEY },
|
||||||
|
})
|
||||||
|
.pipe(
|
||||||
|
catchError((err: AxiosError) => {
|
||||||
|
this.logger.error("error in sending new criticism sms", err);
|
||||||
|
throw new InternalServerErrorException("error in sending new criticism sms");
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error("error in sending sms", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//************************************************* */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>{{title}}</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #333;
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.header {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
background-color: #ffffff;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #6c757d;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<h2>{{title}}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<p>{{message}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<p>This is an automated message from DanakCo. Please do not reply to this email.</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user