2502cbbda2
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 8m44s
Payment Gateway: - Add PYMSPaymentService: IPaymentGatewayService via gRPC to PYMS microservice - Add ZarinPalPaymentService: direct ZarinPal integration (backup) - Register 'pyms' payment provider in DI ConfigureServices - Add PYMS proto files (pyms_transaction.proto, pyms_public_messages.proto) - Fix VerifyDiscountWalletCharge: pass 'OK' as status instead of Authority - Update appsettings: PaymentProvider=pyms, sandbox mode, merchant ID Blog System: - Add BlogCategory, BlogPost, BlogPostImage entities and CQRS - Add proto files and gRPC services for blog management - Add Mapster profiles for blog responses Content Management: - Add SitePage entity and CQRS for static pages - Add proto and gRPC service for site pages Image/File Management: - Add LocalFileManager with disk storage + base64 serving + FMS fallback - Add ImagePathResolverInterceptor for gRPC responses - Add ImageResolverService for explicit image resolution - Add UploadsController for public file serving with FMS fallback - Add PaymentCallbackController for discount order payment callbacks Database: - Add blog and content entity migrations - Remove ImagePath MaxLength constraints - Remove old FileManagementService (replaced by LocalFileManager)
49 lines
1.9 KiB
C#
49 lines
1.9 KiB
C#
using CMSMicroservice.Application.Common.Interfaces;
|
|
using CMSMicroservice.Domain.Events;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace CMSMicroservice.Application.OtpTokenCQ.EventHandlers;
|
|
|
|
public class CreateNewOtpTokenEventHandler : INotificationHandler<CreateNewOtpTokenEvent>
|
|
{
|
|
private readonly ILogger<CreateNewOtpTokenEventHandler> _logger;
|
|
private readonly IKavenegarService _kavenegarService;
|
|
|
|
public CreateNewOtpTokenEventHandler(
|
|
ILogger<CreateNewOtpTokenEventHandler> logger,
|
|
IKavenegarService kavenegarService)
|
|
{
|
|
_logger = logger;
|
|
_kavenegarService = kavenegarService;
|
|
}
|
|
|
|
public async Task Handle(CreateNewOtpTokenEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
_logger.LogInformation("Domain Event: {DomainEvent} for mobile {Mobile}",
|
|
notification.GetType().Name, notification.Item.Mobile);
|
|
|
|
try
|
|
{
|
|
var purpose = notification.Item.Purpose?.ToLowerInvariant();
|
|
|
|
// برای امضای قرارداد، پیامک ساده با GUID ارسال شود
|
|
if ((purpose == "signcontract" || purpose == "signclubcontract")
|
|
&& !string.IsNullOrEmpty(notification.SignGuid))
|
|
{
|
|
var message = $"کد تایید امضای قرارداد: {notification.PlainCode}\nشناسه قرارداد: {notification.SignGuid}";
|
|
await _kavenegarService.SendAsync(notification.Item.Mobile, message);
|
|
}
|
|
else
|
|
{
|
|
await _kavenegarService.VerifyLookupAsync(notification.Item.Mobile, notification.PlainCode);
|
|
}
|
|
|
|
_logger.LogInformation("OTP SMS sent successfully to {Mobile}", notification.Item.Mobile);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Failed to send OTP SMS to {Mobile}", notification.Item.Mobile);
|
|
}
|
|
}
|
|
}
|