feat: add SMS notification for Daya loan approval - Implemented SMS sending functionality and created SmsTemplates for message formatting
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 4m11s

This commit is contained in:
masoodafar-web
2025-12-26 09:20:15 +03:30
parent 9448f3fff0
commit 3d42c91d21
2 changed files with 110 additions and 1 deletions
@@ -1,15 +1,25 @@
using CMSMicroservice.Domain.Events; using CMSMicroservice.Domain.Events;
using CMSMicroservice.Domain.Enums; using CMSMicroservice.Domain.Enums;
using CMSMicroservice.Domain.Common;
using CMSMicroservice.Application.Common.Interfaces;
using Microsoft.Extensions.Logging;
namespace CMSMicroservice.Application.DayaLoanCQ.Commands.ProcessDayaLoanApproval; namespace CMSMicroservice.Application.DayaLoanCQ.Commands.ProcessDayaLoanApproval;
public class ProcessDayaLoanApprovalCommandHandler : IRequestHandler<ProcessDayaLoanApprovalCommand, ProcessDayaLoanApprovalResponseDto> public class ProcessDayaLoanApprovalCommandHandler : IRequestHandler<ProcessDayaLoanApprovalCommand, ProcessDayaLoanApprovalResponseDto>
{ {
private readonly IApplicationDbContext _context; private readonly IApplicationDbContext _context;
private readonly IKavenegarService _smsService;
private readonly ILogger<ProcessDayaLoanApprovalCommandHandler> _logger;
public ProcessDayaLoanApprovalCommandHandler(IApplicationDbContext context) public ProcessDayaLoanApprovalCommandHandler(
IApplicationDbContext context,
IKavenegarService smsService,
ILogger<ProcessDayaLoanApprovalCommandHandler> logger)
{ {
_context = context; _context = context;
_smsService = smsService;
_logger = logger;
} }
public async Task<ProcessDayaLoanApprovalResponseDto> Handle(ProcessDayaLoanApprovalCommand request, CancellationToken cancellationToken) public async Task<ProcessDayaLoanApprovalResponseDto> Handle(ProcessDayaLoanApprovalCommand request, CancellationToken cancellationToken)
@@ -140,6 +150,9 @@ public class ProcessDayaLoanApprovalCommandHandler : IRequestHandler<ProcessDaya
await _context.SaveChangesAsync(cancellationToken); await _context.SaveChangesAsync(cancellationToken);
// ارسال SMS به کاربر
await SendDayaLoanSmsAsync(user);
return new ProcessDayaLoanApprovalResponseDto return new ProcessDayaLoanApprovalResponseDto
{ {
UserId = user.Id, UserId = user.Id,
@@ -151,4 +164,29 @@ public class ProcessDayaLoanApprovalCommandHandler : IRequestHandler<ProcessDaya
Message = "اعتبار دایا با موفقیت دریافت شد" Message = "اعتبار دایا با موفقیت دریافت شد"
}; };
} }
/// <summary>
/// ارسال SMS اطلاع‌رسانی دریافت اعتبار دایا
/// </summary>
private async Task SendDayaLoanSmsAsync(User user)
{
try
{
var userName = SmsTemplates.GetUserName(user.FirstName);
var message = SmsTemplates.DayaLoanReceived(userName);
await _smsService.SendAsync(user.Mobile, message);
_logger.LogInformation(
"Daya loan SMS sent to User {UserId}, Mobile: {Mobile}",
user.Id, user.Mobile);
}
catch (Exception ex)
{
// خطای SMS نباید فرایند اصلی رو متوقف کنه
_logger.LogError(ex,
"Failed to send Daya loan SMS to User {UserId}, Mobile: {Mobile}",
user.Id, user.Mobile);
}
}
} }
@@ -0,0 +1,71 @@
namespace CMSMicroservice.Domain.Common;
/// <summary>
/// قالب‌های پیامک - همه پیام‌های SMS در یک جا
/// </summary>
public static class SmsTemplates
{
/// <summary>
/// پیام دریافت اعتبار دایا
/// </summary>
public static string DayaLoanReceived(string userName) =>
$"{userName} گرامی، اعتبار شما واریز گردید. شما می‌توانید با مراجعه به سامانه کارابازار فرایند فعال‌سازی خود را ادامه دهید. با تشکر از حسن انتخاب شما";
/// <summary>
/// پیام فعال‌سازی باشگاه مشتریان
/// </summary>
public static string ClubActivated(string userName) =>
$"{userName} گرامی، عضویت شما در باشگاه مشتریان کارابازار با موفقیت فعال شد. با تشکر از حسن انتخاب شما";
/// <summary>
/// پیام خرید پکیج
/// </summary>
public static string PackagePurchased(string userName, string packageName) =>
$"{userName} گرامی، خرید {packageName} با موفقیت انجام شد. با تشکر از حسن انتخاب شما";
/// <summary>
/// پیام واریز کمیسیون
/// </summary>
public static string CommissionDeposited(string userName, long amount) =>
$"{userName} گرامی، مبلغ {amount:N0} ریال بابت کمیسیون به کیف پول شما واریز شد.";
/// <summary>
/// پیام برداشت موفق
/// </summary>
public static string WithdrawalSuccess(string userName, long amount) =>
$"{userName} گرامی، درخواست برداشت شما به مبلغ {amount:N0} ریال با موفقیت ثبت شد.";
/// <summary>
/// پیام ورود به شبکه
/// </summary>
public static string NetworkJoined(string userName, string referrerName) =>
$"{userName} گرامی، شما با موفقیت در شبکه {referrerName} ثبت شدید. با تشکر از حسن انتخاب شما";
/// <summary>
/// پیام زیرمجموعه جدید
/// </summary>
public static string NewDownline(string userName, string downlineName) =>
$"{userName} گرامی، {downlineName} به عنوان زیرمجموعه شما ثبت شد.";
/// <summary>
/// پیام OTP
/// </summary>
public static string OtpCode(string code) =>
$"کد تایید شما: {code}\nکارابازار";
/// <summary>
/// پیام خوش‌آمدگویی
/// </summary>
public static string Welcome(string userName) =>
$"{userName} گرامی، به کارابازار خوش آمدید.";
#region Helper
/// <summary>
/// دریافت نام کاربر یا مقدار پیش‌فرض
/// </summary>
public static string GetUserName(string? firstName) =>
!string.IsNullOrWhiteSpace(firstName) ? firstName : "کاربر";
#endregion
}