Phase 7c: Delete deprecated handlers + clean service/mapping refs
- Delete 4 deprecated CQRS handler folders (12 files): - PurchaseGoldenPackage/ (Command, Handler, Validator) - VerifyGoldenPackagePurchase/ (Command, Handler, Validator) - InitiateBasePackagePayment/ (Command, Handler, Validator) - VerifyBasePackagePayment/ (Command, Handler, Validator) - PackageService.cs: Remove 4 gRPC override methods that dispatched to deleted handlers (proto RPCs now auto-throw Unimplemented) - PackageProfile.cs: Remove all Mapster mappings for deleted types (6 mapping blocks + 4 using directives removed) - Customer* RPCs remain fully functional - Build: 0 errors
This commit is contained in:
-43
@@ -1,43 +0,0 @@
|
||||
using MediatR;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.InitiateBasePackagePayment;
|
||||
|
||||
/// <summary>
|
||||
/// ثبت اولیه تراکنش و سفارش پکیج پایه (56 میلیون تومان)
|
||||
/// این Command توسط BFF فراخوانی میشود قبل از ارسال کاربر به درگاه
|
||||
/// </summary>
|
||||
public record InitiateBasePackagePaymentCommand : IRequest<InitiateBasePackagePaymentResponseDto>
|
||||
{
|
||||
/// <summary>
|
||||
/// شناسه کاربر
|
||||
/// </summary>
|
||||
public long UserId { get; init; }
|
||||
}
|
||||
|
||||
public class InitiateBasePackagePaymentResponseDto
|
||||
{
|
||||
/// <summary>
|
||||
/// موفقیت عملیات
|
||||
/// </summary>
|
||||
public bool Success { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// پیام
|
||||
/// </summary>
|
||||
public string Message { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// شناسه سفارش
|
||||
/// </summary>
|
||||
public long OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// شناسه تراکنش CMS
|
||||
/// </summary>
|
||||
public long TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// مبلغ پکیج
|
||||
/// </summary>
|
||||
public long Amount { get; set; }
|
||||
}
|
||||
-171
@@ -1,171 +0,0 @@
|
||||
using CMSMicroservice.Application.Common.Exceptions;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Domain.Enums;
|
||||
using CMSMicroservice.Domain.Common;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using ValidationException = FluentValidation.ValidationException;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.InitiateBasePackagePayment;
|
||||
|
||||
/// <summary>
|
||||
/// Handler برای ثبت اولیه تراکنش و سفارش پکیج پایه
|
||||
/// این Handler فقط Transaction و Order را با وضعیت Pending ایجاد میکند
|
||||
/// BFF سپس کاربر را به درگاه PYMS هدایت میکند
|
||||
/// </summary>
|
||||
public class InitiateBasePackagePaymentCommandHandler : IRequestHandler<InitiateBasePackagePaymentCommand, InitiateBasePackagePaymentResponseDto>
|
||||
{
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly ILogger<InitiateBasePackagePaymentCommandHandler> _logger;
|
||||
|
||||
// شناسه پکیج پایه از دیتابیس خوانده میشود (Package.IsBasePackage)
|
||||
|
||||
public InitiateBasePackagePaymentCommandHandler(
|
||||
IApplicationDbContext context,
|
||||
ILogger<InitiateBasePackagePaymentCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<InitiateBasePackagePaymentResponseDto> Handle(
|
||||
InitiateBasePackagePaymentCommand request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Initiating base package payment for UserId: {UserId}",
|
||||
request.UserId);
|
||||
|
||||
// 1. پیدا کردن کاربر
|
||||
var user = await _context.Users
|
||||
.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
_logger.LogWarning("User not found. UserId: {UserId}", request.UserId);
|
||||
throw new NotFoundException(nameof(User), request.UserId);
|
||||
}
|
||||
|
||||
// 2. بررسی عدم خرید قبلی پکیج پایه
|
||||
if (user.PackagePurchaseMethod != PackagePurchaseMethod.None)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"User {UserId} has already purchased base package via {Method}",
|
||||
request.UserId,
|
||||
user.PackagePurchaseMethod);
|
||||
|
||||
return new InitiateBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = false,
|
||||
Message = "شما قبلاً پکیج پایه را خریداری کردهاید."
|
||||
};
|
||||
}
|
||||
|
||||
// 2.5. بارگذاری پکیج پایه
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken)
|
||||
?? throw new NotFoundException("پکیج پایه یافت نشد");
|
||||
|
||||
// 3. بررسی عدم وجود سفارش Pending
|
||||
var pendingOrder = await _context.UserOrders
|
||||
.FirstOrDefaultAsync(o =>
|
||||
o.UserId == request.UserId &&
|
||||
o.PaymentStatus == PaymentStatus.Pending &&
|
||||
o.PackageId == package.Id,
|
||||
cancellationToken);
|
||||
|
||||
if (pendingOrder != null)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"User {UserId} has pending order {OrderId}",
|
||||
request.UserId,
|
||||
pendingOrder.Id);
|
||||
|
||||
// برگرداندن سفارش موجود برای ادامه پرداخت
|
||||
var existingTransaction = await _context.Transactions
|
||||
.FirstOrDefaultAsync(t => t.Id == pendingOrder.TransactionId, cancellationToken);
|
||||
|
||||
return new InitiateBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "سفارش قبلی در انتظار پرداخت یافت شد.",
|
||||
OrderId = pendingOrder.Id,
|
||||
TransactionId = existingTransaction?.Id ?? 0,
|
||||
Amount = package.Price
|
||||
};
|
||||
}
|
||||
|
||||
// 4. پیدا کردن آدرس پیشفرض کاربر
|
||||
var defaultAddress = await _context.UserAddresses
|
||||
.Where(a => a.UserId == request.UserId)
|
||||
.OrderByDescending(a => a.Created)
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
if (defaultAddress == null)
|
||||
{
|
||||
_logger.LogWarning("No address found for user {UserId}", request.UserId);
|
||||
throw new ValidationException("لطفاً ابتدا یک آدرس برای خود ثبت کنید.");
|
||||
}
|
||||
|
||||
// 5. ایجاد Transaction با وضعیت Pending
|
||||
var transaction = new Transaction
|
||||
{
|
||||
Amount = package.Price,
|
||||
Description = $"خرید پکیج {package.Title} - کاربر #{user.Id}",
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
Type = TransactionType.DepositIpg
|
||||
};
|
||||
|
||||
_context.Transactions.Add(transaction);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Created Transaction {TransactionId} with Pending status for UserId {UserId}",
|
||||
transaction.Id,
|
||||
request.UserId);
|
||||
|
||||
// 6. ایجاد UserOrder با وضعیت Pending
|
||||
var order = new UserOrder
|
||||
{
|
||||
UserId = user.Id,
|
||||
PackageId = package.Id,
|
||||
Amount = package.Price,
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
DeliveryStatus = DeliveryStatus.None,
|
||||
UserAddressId = defaultAddress.Id,
|
||||
PaymentMethod = PaymentMethod.IPG,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
|
||||
_context.UserOrders.Add(order);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Created UserOrder {OrderId} for UserId {UserId}, TransactionId: {TransactionId}",
|
||||
order.Id,
|
||||
request.UserId,
|
||||
transaction.Id);
|
||||
|
||||
return new InitiateBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "تراکنش و سفارش با موفقیت ثبت شد.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id,
|
||||
Amount = package.Price
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(
|
||||
ex,
|
||||
"Error in InitiateBasePackagePaymentCommand for UserId: {UserId}",
|
||||
request.UserId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.InitiateBasePackagePayment;
|
||||
|
||||
public class InitiateBasePackagePaymentCommandValidator : AbstractValidator<InitiateBasePackagePaymentCommand>
|
||||
{
|
||||
public InitiateBasePackagePaymentCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.UserId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه کاربر معتبر نیست.");
|
||||
}
|
||||
}
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
using MediatR;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.PurchaseGoldenPackage;
|
||||
|
||||
/// <summary>
|
||||
/// خرید پکیج طلایی (شروع فرآیند پرداخت)
|
||||
/// </summary>
|
||||
public record PurchaseGoldenPackageCommand : IRequest<PurchaseGoldenPackageResponseDto>
|
||||
{
|
||||
public long UserId { get; init; }
|
||||
public long PackageId { get; init; }
|
||||
public string ReturnUrl { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
public class PurchaseGoldenPackageResponseDto
|
||||
{
|
||||
public bool Success { get; set; }
|
||||
public string Message { get; set; } = string.Empty;
|
||||
public long OrderId { get; set; }
|
||||
public string PaymentGatewayUrl { get; set; } = string.Empty;
|
||||
public string TrackingCode { get; set; } = string.Empty;
|
||||
}
|
||||
-166
@@ -1,166 +0,0 @@
|
||||
using CMSMicroservice.Application.Common.Exceptions;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Domain.Enums;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using ValidationException = FluentValidation.ValidationException;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.PurchaseGoldenPackage;
|
||||
|
||||
public class PurchaseGoldenPackageCommandHandler : IRequestHandler<PurchaseGoldenPackageCommand, PurchaseGoldenPackageResponseDto>
|
||||
{
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly IPaymentGatewayService _paymentGateway;
|
||||
private readonly ILogger<PurchaseGoldenPackageCommandHandler> _logger;
|
||||
|
||||
public PurchaseGoldenPackageCommandHandler(
|
||||
IApplicationDbContext context,
|
||||
IPaymentGatewayService paymentGateway,
|
||||
ILogger<PurchaseGoldenPackageCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_paymentGateway = paymentGateway;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<PurchaseGoldenPackageResponseDto> Handle(PurchaseGoldenPackageCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Starting golden package purchase for UserId: {UserId}, PackageId: {PackageId}",
|
||||
request.UserId,
|
||||
request.PackageId);
|
||||
|
||||
// 1. پیدا کردن کاربر
|
||||
var user = await _context.Users
|
||||
.FirstOrDefaultAsync(u => u.Id == request.UserId, cancellationToken);
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
_logger.LogWarning("User not found for golden package purchase. UserId: {UserId}", request.UserId);
|
||||
throw new NotFoundException(nameof(User), request.UserId);
|
||||
}
|
||||
|
||||
// 2. جلوگیری از خرید مجدد پکیج طلایی
|
||||
if (user.PackagePurchaseMethod != PackagePurchaseMethod.None)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"User {UserId} has already purchased golden package via {Method}",
|
||||
request.UserId,
|
||||
user.PackagePurchaseMethod);
|
||||
|
||||
throw new ValidationException("شما قبلاً پکیج طلایی را خریداری کردهاید.");
|
||||
}
|
||||
|
||||
// 3. پیدا کردن پکیج
|
||||
var package = await _context.Packages
|
||||
.FirstOrDefaultAsync(p => p.Id == request.PackageId, cancellationToken);
|
||||
|
||||
if (package == null)
|
||||
{
|
||||
_logger.LogWarning("Golden package not found. PackageId: {PackageId}", request.PackageId);
|
||||
throw new NotFoundException(nameof(Package), request.PackageId);
|
||||
}
|
||||
|
||||
// اطمینان از فعال بودن و قابل خرید بودن پکیج
|
||||
if (package.IsDeleted || !package.IsActive)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"PackageId {PackageId} is not available. IsDeleted: {IsDeleted}, IsActive: {IsActive}",
|
||||
request.PackageId,
|
||||
package.IsDeleted,
|
||||
package.IsActive);
|
||||
|
||||
throw new ValidationException("این پکیج در حال حاضر قابل خرید نیست.");
|
||||
}
|
||||
|
||||
if (!package.SupportsDirectPurchase)
|
||||
{
|
||||
throw new ValidationException("این پکیج فقط از طریق وام دایا قابل خرید است.");
|
||||
}
|
||||
|
||||
// 4. پیدا کردن آدرس پیشفرض کاربر (الزامی برای UserOrder)
|
||||
var defaultAddress = await _context.UserAddresses
|
||||
.Where(a => a.UserId == request.UserId)
|
||||
.OrderByDescending(a => a.Created)
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
if (defaultAddress == null)
|
||||
{
|
||||
_logger.LogWarning("No address found for user {UserId} in golden package purchase", request.UserId);
|
||||
throw new ValidationException("لطفاً ابتدا یک آدرس برای خود ثبت کنید.");
|
||||
}
|
||||
|
||||
// 5. ایجاد سفارش
|
||||
var order = new UserOrder
|
||||
{
|
||||
UserId = user.Id,
|
||||
PackageId = package.Id,
|
||||
Amount = package.Price,
|
||||
PaymentStatus = PaymentStatus.Pending,
|
||||
DeliveryStatus = DeliveryStatus.None,
|
||||
UserAddressId = defaultAddress.Id,
|
||||
PaymentMethod = PaymentMethod.IPG
|
||||
};
|
||||
|
||||
_context.UserOrders.Add(order);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Created golden package UserOrder {OrderId} for UserId {UserId}, Amount: {Amount}",
|
||||
order.Id,
|
||||
request.UserId,
|
||||
order.Amount);
|
||||
|
||||
// 6. شروع پرداخت با درگاه
|
||||
var paymentRequest = new PaymentRequest
|
||||
{
|
||||
Amount = order.Amount,
|
||||
UserId = user.Id,
|
||||
Mobile = user.Mobile ?? string.Empty,
|
||||
CallbackUrl = request.ReturnUrl,
|
||||
Description = $"خرید پکیج طلایی - سفارش #{order.Id}"
|
||||
};
|
||||
|
||||
var paymentResult = await _paymentGateway.InitiatePaymentAsync(paymentRequest, cancellationToken);
|
||||
|
||||
if (!paymentResult.IsSuccess)
|
||||
{
|
||||
_logger.LogError(
|
||||
"Payment gateway initiation failed for golden package. OrderId {OrderId}: {ErrorMessage}",
|
||||
order.Id,
|
||||
paymentResult.ErrorMessage);
|
||||
|
||||
order.PaymentStatus = PaymentStatus.Reject;
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
throw new Exception($"خطا در ارتباط با درگاه پرداخت: {paymentResult.ErrorMessage}");
|
||||
}
|
||||
|
||||
_logger.LogInformation(
|
||||
"Golden package payment initiated successfully. OrderId: {OrderId}, RefId: {RefId}",
|
||||
order.Id,
|
||||
paymentResult.RefId);
|
||||
|
||||
return new PurchaseGoldenPackageResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "لطفاً به درگاه پرداخت منتقل شوید.",
|
||||
OrderId = order.Id,
|
||||
PaymentGatewayUrl = paymentResult.GatewayUrl ?? string.Empty,
|
||||
TrackingCode = paymentResult.RefId ?? string.Empty
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(
|
||||
ex,
|
||||
"Error in PurchaseGoldenPackageCommand for UserId: {UserId}",
|
||||
request.UserId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.PurchaseGoldenPackage;
|
||||
|
||||
public class PurchaseGoldenPackageCommandValidator : AbstractValidator<PurchaseGoldenPackageCommand>
|
||||
{
|
||||
public PurchaseGoldenPackageCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.UserId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه کاربر باید بزرگتر از 0 باشد");
|
||||
|
||||
RuleFor(x => x.PackageId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه پکیج باید بزرگتر از 0 باشد");
|
||||
|
||||
RuleFor(x => x.ReturnUrl)
|
||||
.NotEmpty()
|
||||
.WithMessage("آدرس بازگشت الزامی است")
|
||||
.Must(url => Uri.TryCreate(url, UriKind.Absolute, out _))
|
||||
.WithMessage("آدرس بازگشت معتبر نیست");
|
||||
}
|
||||
}
|
||||
-72
@@ -1,72 +0,0 @@
|
||||
using MediatR;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
||||
|
||||
/// <summary>
|
||||
/// تکمیل یا رد پرداخت پکیج پایه (فراخوانی توسط BFF بعد از Callback)
|
||||
/// </summary>
|
||||
public record VerifyBasePackagePaymentCommand : IRequest<VerifyBasePackagePaymentResponseDto>
|
||||
{
|
||||
/// <summary>
|
||||
/// شناسه سفارش CMS
|
||||
/// </summary>
|
||||
public long OrderId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// شناسه تراکنش CMS
|
||||
/// </summary>
|
||||
public long TransactionId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// آیا پرداخت موفق بوده؟ (نتیجه Verify از BFF)
|
||||
/// </summary>
|
||||
public bool PaymentSuccess { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// کد پیگیری بانکی (در صورت موفقیت)
|
||||
/// </summary>
|
||||
public string? RefId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// پیام از درگاه
|
||||
/// </summary>
|
||||
public string? Message { get; init; }
|
||||
}
|
||||
|
||||
public class VerifyBasePackagePaymentResponseDto
|
||||
{
|
||||
/// <summary>
|
||||
/// موفقیت عملیات
|
||||
/// </summary>
|
||||
public bool Success { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// پیام
|
||||
/// </summary>
|
||||
public string Message { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// شناسه سفارش
|
||||
/// </summary>
|
||||
public long OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// شناسه تراکنش
|
||||
/// </summary>
|
||||
public long TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// کد پیگیری بانکی
|
||||
/// </summary>
|
||||
public string? ReferenceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// موجودی کیف پول بعد از شارژ
|
||||
/// </summary>
|
||||
public long WalletBalance { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// موجودی تخفیف بعد از شارژ
|
||||
/// </summary>
|
||||
public long DiscountBalance { get; set; }
|
||||
}
|
||||
-233
@@ -1,233 +0,0 @@
|
||||
using CMSMicroservice.Application.Common.Exceptions;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Domain.Enums;
|
||||
using CMSMicroservice.Domain.Common;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
||||
|
||||
/// <summary>
|
||||
/// Handler برای تکمیل یا رد پرداخت پکیج پایه
|
||||
/// فراخوانی توسط BFF بعد از اینکه نتیجه Verify از PYMS مشخص شد
|
||||
///
|
||||
/// اگر PaymentSuccess = true:
|
||||
/// - شارژ کیف پول (Balance + DiscountBalance)
|
||||
/// - ثبت لاگ تغییر کیف پول
|
||||
/// - بهروزرسانی سفارش و کاربر
|
||||
///
|
||||
/// اگر PaymentSuccess = false:
|
||||
/// - فقط آپدیت وضعیت تراکنش و سفارش به Reject
|
||||
/// </summary>
|
||||
public class VerifyBasePackagePaymentCommandHandler : IRequestHandler<VerifyBasePackagePaymentCommand, VerifyBasePackagePaymentResponseDto>
|
||||
{
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly ILogger<VerifyBasePackagePaymentCommandHandler> _logger;
|
||||
|
||||
public VerifyBasePackagePaymentCommandHandler(
|
||||
IApplicationDbContext context,
|
||||
ILogger<VerifyBasePackagePaymentCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<VerifyBasePackagePaymentResponseDto> Handle(
|
||||
VerifyBasePackagePaymentCommand request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Processing base package payment result. OrderId: {OrderId}, TransactionId: {TransactionId}, PaymentSuccess: {PaymentSuccess}",
|
||||
request.OrderId,
|
||||
request.TransactionId,
|
||||
request.PaymentSuccess);
|
||||
|
||||
// 1. پیدا کردن سفارش با کاربر
|
||||
var order = await _context.UserOrders
|
||||
.Include(o => o.User)
|
||||
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
|
||||
|
||||
if (order == null)
|
||||
{
|
||||
_logger.LogWarning("Order not found. OrderId: {OrderId}", request.OrderId);
|
||||
throw new NotFoundException(nameof(UserOrder), request.OrderId);
|
||||
}
|
||||
|
||||
// 2. پیدا کردن تراکنش
|
||||
var transaction = await _context.Transactions
|
||||
.FirstOrDefaultAsync(t => t.Id == request.TransactionId, cancellationToken);
|
||||
|
||||
if (transaction == null)
|
||||
{
|
||||
_logger.LogWarning("Transaction not found. TransactionId: {TransactionId}", request.TransactionId);
|
||||
throw new NotFoundException(nameof(Transaction), request.TransactionId);
|
||||
}
|
||||
|
||||
// 3. بررسی Idempotency - اگر قبلاً تایید شده باشد
|
||||
if (order.PaymentStatus == PaymentStatus.Success)
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Order {OrderId} already verified successfully",
|
||||
request.OrderId);
|
||||
|
||||
var existingWallet = await _context.UserWallets
|
||||
.FirstOrDefaultAsync(w => w.UserId == order.UserId, cancellationToken);
|
||||
|
||||
return new VerifyBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "پرداخت قبلاً با موفقیت تایید شده است.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id,
|
||||
ReferenceCode = transaction.RefId,
|
||||
WalletBalance = existingWallet?.Balance ?? 0,
|
||||
DiscountBalance = existingWallet?.DiscountBalance ?? 0
|
||||
};
|
||||
}
|
||||
|
||||
// 4. اگر پرداخت ناموفق بود - فقط وضعیت را Reject میکنیم
|
||||
if (!request.PaymentSuccess)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"Payment failed. OrderId: {OrderId}, Message: {Message}",
|
||||
request.OrderId,
|
||||
request.Message);
|
||||
|
||||
transaction.PaymentStatus = PaymentStatus.Reject;
|
||||
order.PaymentStatus = PaymentStatus.Reject;
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
return new VerifyBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = false,
|
||||
Message = request.Message ?? "پرداخت ناموفق بود.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
}
|
||||
|
||||
// 5. پرداخت موفق - پیدا کردن یا ایجاد کیف پول
|
||||
var userWallet = await _context.UserWallets
|
||||
.FirstOrDefaultAsync(w => w.UserId == order.UserId, cancellationToken);
|
||||
|
||||
if (userWallet == null)
|
||||
{
|
||||
_logger.LogInformation("Creating new wallet for UserId: {UserId}", order.UserId);
|
||||
userWallet = new UserWallet
|
||||
{
|
||||
UserId = order.UserId,
|
||||
Balance = 0,
|
||||
DiscountBalance = 0,
|
||||
NetworkBalance = 0
|
||||
};
|
||||
_context.UserWallets.Add(userWallet);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
// 5.5. بارگذاری پکیج از سفارش
|
||||
var package = order.PackageId.HasValue
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == order.PackageId.Value, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
|
||||
if (package == null)
|
||||
throw new NotFoundException("پکیج یافت نشد");
|
||||
|
||||
// 6. شارژ کیف پول (هم Balance و هم DiscountBalance)
|
||||
var oldBalance = userWallet.Balance;
|
||||
var oldDiscountBalance = userWallet.DiscountBalance;
|
||||
|
||||
userWallet.Balance += package.Price;
|
||||
userWallet.DiscountBalance += (long)(package.Price * package.DiscountMultiplier);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Charging wallet for user {UserId}. Balance: {OldBalance} -> {NewBalance}, DiscountBalance: {OldDiscount} -> {NewDiscount}",
|
||||
order.UserId,
|
||||
oldBalance,
|
||||
userWallet.Balance,
|
||||
oldDiscountBalance,
|
||||
userWallet.DiscountBalance);
|
||||
|
||||
// 7. بهروزرسانی Transaction
|
||||
transaction.PaymentStatus = PaymentStatus.Success;
|
||||
transaction.PaymentDate = DateTime.Now;
|
||||
transaction.RefId = request.RefId;
|
||||
|
||||
// 8. ثبت لاگ تغییر کیف پول
|
||||
var changeLog = new UserWalletChangeLog
|
||||
{
|
||||
WalletId = userWallet.Id,
|
||||
CurrentBalance = userWallet.Balance,
|
||||
ChangeValue = package.Price,
|
||||
CurrentNetworkBalance = userWallet.NetworkBalance,
|
||||
ChangeNerworkValue = 0,
|
||||
CurrentDiscountBalance = userWallet.DiscountBalance,
|
||||
ChangeDiscountValue = (long)(package.Price * package.DiscountMultiplier),
|
||||
IsIncrease = true,
|
||||
RefrenceId = transaction.Id
|
||||
};
|
||||
|
||||
await _context.UserWalletChangeLogs.AddAsync(changeLog, cancellationToken);
|
||||
|
||||
// 9. ثبت UserPackagePurchase
|
||||
if (order.PackageId.HasValue)
|
||||
{
|
||||
var packagePurchase = new UserPackagePurchase
|
||||
{
|
||||
UserId = order.UserId,
|
||||
PackageId = order.PackageId.Value,
|
||||
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||
PurchasedAt = DateTime.Now,
|
||||
Amount = package.Price,
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Created UserPackagePurchase for UserId {UserId}, PackageId {PackageId}",
|
||||
order.UserId, order.PackageId.Value);
|
||||
}
|
||||
|
||||
// 10. بهروزرسانی Order
|
||||
order.TransactionId = transaction.Id;
|
||||
order.PaymentStatus = PaymentStatus.Success;
|
||||
order.PaymentDate = DateTime.Now;
|
||||
order.PaymentMethod = PaymentMethod.IPG;
|
||||
|
||||
// 11. بهروزرسانی User
|
||||
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
||||
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Base package payment completed successfully. OrderId: {OrderId}, UserId: {UserId}, TransactionId: {TransactionId}, RefId: {RefId}",
|
||||
order.Id,
|
||||
order.UserId,
|
||||
transaction.Id,
|
||||
request.RefId);
|
||||
|
||||
return new VerifyBasePackagePaymentResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "پرداخت با موفقیت تایید شد. کیف پول شما شارژ گردید.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id,
|
||||
ReferenceCode = request.RefId,
|
||||
WalletBalance = userWallet.Balance,
|
||||
DiscountBalance = userWallet.DiscountBalance
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(
|
||||
ex,
|
||||
"Error in VerifyBasePackagePaymentCommand. OrderId: {OrderId}",
|
||||
request.OrderId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
||||
|
||||
public class VerifyBasePackagePaymentCommandValidator : AbstractValidator<VerifyBasePackagePaymentCommand>
|
||||
{
|
||||
public VerifyBasePackagePaymentCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.OrderId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه سفارش معتبر نیست.");
|
||||
|
||||
RuleFor(x => x.TransactionId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه تراکنش معتبر نیست.");
|
||||
}
|
||||
}
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
using MediatR;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyGoldenPackagePurchase;
|
||||
|
||||
/// <summary>
|
||||
/// تایید پرداخت پکیج طلایی (پس از بازگشت از درگاه)
|
||||
/// </summary>
|
||||
public record VerifyGoldenPackagePurchaseCommand : IRequest<VerifyGoldenPackagePurchaseResponseDto>
|
||||
{
|
||||
public long OrderId { get; init; }
|
||||
public string Authority { get; init; } = string.Empty;
|
||||
public string Status { get; init; } = string.Empty; // OK یا NOK
|
||||
}
|
||||
|
||||
public class VerifyGoldenPackagePurchaseResponseDto
|
||||
{
|
||||
public bool Success { get; set; }
|
||||
public string Message { get; set; } = string.Empty;
|
||||
public long OrderId { get; set; }
|
||||
public long TransactionId { get; set; }
|
||||
public string ReferenceCode { get; set; } = string.Empty;
|
||||
public long WalletBalance { get; set; }
|
||||
}
|
||||
-235
@@ -1,235 +0,0 @@
|
||||
using CMSMicroservice.Application.Common.Exceptions;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Entities;
|
||||
using CMSMicroservice.Domain.Enums;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using ValidationException = FluentValidation.ValidationException;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyGoldenPackagePurchase;
|
||||
|
||||
public class VerifyGoldenPackagePurchaseCommandHandler : IRequestHandler<VerifyGoldenPackagePurchaseCommand, VerifyGoldenPackagePurchaseResponseDto>
|
||||
{
|
||||
private readonly IApplicationDbContext _context;
|
||||
private readonly IPaymentGatewayService _paymentGateway;
|
||||
private readonly ILogger<VerifyGoldenPackagePurchaseCommandHandler> _logger;
|
||||
|
||||
public VerifyGoldenPackagePurchaseCommandHandler(
|
||||
IApplicationDbContext context,
|
||||
IPaymentGatewayService paymentGateway,
|
||||
ILogger<VerifyGoldenPackagePurchaseCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_paymentGateway = paymentGateway;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<VerifyGoldenPackagePurchaseResponseDto> Handle(VerifyGoldenPackagePurchaseCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Verifying golden package purchase. OrderId: {OrderId}, Authority: {Authority}, Status: {Status}",
|
||||
request.OrderId,
|
||||
request.Authority,
|
||||
request.Status);
|
||||
|
||||
// 1. اگر پرداخت از سمت درگاه موفق گزارش نشده باشد
|
||||
if (!string.Equals(request.Status, "OK", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var pendingOrder = await _context.UserOrders
|
||||
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
|
||||
|
||||
if (pendingOrder != null && pendingOrder.PaymentStatus == PaymentStatus.Pending)
|
||||
{
|
||||
pendingOrder.PaymentStatus = PaymentStatus.Reject;
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
throw new ValidationException("پرداخت توسط کاربر لغو شد.");
|
||||
}
|
||||
|
||||
// 2. پیدا کردن سفارش به همراه کاربر
|
||||
var order = await _context.UserOrders
|
||||
.Include(o => o.User)
|
||||
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
|
||||
|
||||
if (order == null)
|
||||
{
|
||||
_logger.LogWarning("Golden package order not found. OrderId: {OrderId}", request.OrderId);
|
||||
throw new NotFoundException(nameof(UserOrder), request.OrderId);
|
||||
}
|
||||
|
||||
// اگر قبلاً با موفقیت پرداخت شده، پاسخ idempotent برگردانیم
|
||||
if (order.PaymentStatus == PaymentStatus.Success && order.TransactionId.HasValue)
|
||||
{
|
||||
var existingWallet = await _context.UserWallets
|
||||
.FirstOrDefaultAsync(w => w.UserId == order.UserId, cancellationToken);
|
||||
|
||||
var existingTransaction = await _context.Transactions
|
||||
.FirstOrDefaultAsync(t => t.Id == order.TransactionId.Value, cancellationToken);
|
||||
|
||||
return new VerifyGoldenPackagePurchaseResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "پرداخت قبلاً با موفقیت تایید شده است.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = existingTransaction?.Id ?? order.TransactionId.Value,
|
||||
ReferenceCode = existingTransaction?.RefId ?? string.Empty,
|
||||
WalletBalance = existingWallet?.Balance ?? 0
|
||||
};
|
||||
}
|
||||
|
||||
// 3. Verify با درگاه پرداخت
|
||||
var verifyResult = await _paymentGateway.VerifyPaymentAsync(
|
||||
request.Authority,
|
||||
request.Authority,
|
||||
cancellationToken);
|
||||
|
||||
if (!verifyResult.IsSuccess)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"Golden package payment verification failed. OrderId: {OrderId}, Message: {Message}",
|
||||
request.OrderId,
|
||||
verifyResult.Message);
|
||||
|
||||
order.PaymentStatus = PaymentStatus.Reject;
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
throw new ValidationException($"تراکنش ناموفق: {verifyResult.Message}");
|
||||
}
|
||||
|
||||
// 4. بارگذاری پکیج برای ضریب تخفیف
|
||||
var package = order.PackageId.HasValue
|
||||
? await _context.Packages.FirstOrDefaultAsync(p => p.Id == order.PackageId.Value, cancellationToken)
|
||||
: await _context.Packages.FirstOrDefaultAsync(p => p.IsBasePackage && !p.IsDeleted, cancellationToken);
|
||||
|
||||
var discountMultiplier = package?.DiscountMultiplier ?? 2.0m;
|
||||
|
||||
// 5. شارژ کیف پول (Balance فقط طبق سناریوی پکیج)
|
||||
var wallet = await _context.UserWallets
|
||||
.FirstOrDefaultAsync(w => w.UserId == order.UserId, cancellationToken);
|
||||
|
||||
if (wallet == null)
|
||||
{
|
||||
_logger.LogError("Wallet not found for UserId: {UserId}", order.UserId);
|
||||
throw new NotFoundException($"کیف پول کاربر با شناسه {order.UserId} یافت نشد");
|
||||
}
|
||||
|
||||
var oldBalance = wallet.Balance;
|
||||
wallet.Balance += order.Amount;
|
||||
|
||||
// شارژ DiscountBalance (موجودی اعتباری) — ضریب تخفیف از پکیج
|
||||
var oldDiscountBalance = wallet.DiscountBalance;
|
||||
var discountAmount = (long)(order.Amount * discountMultiplier);
|
||||
wallet.DiscountBalance += discountAmount;
|
||||
|
||||
_logger.LogInformation(
|
||||
"Charging wallet for user {UserId}. Balance: {OldBalance} -> {NewBalance}, DiscountBalance: {OldDiscount} -> {NewDiscount}",
|
||||
order.UserId,
|
||||
oldBalance,
|
||||
wallet.Balance,
|
||||
oldDiscountBalance,
|
||||
wallet.DiscountBalance);
|
||||
|
||||
// 5. ثبت Transaction
|
||||
var transaction = new Transaction
|
||||
{
|
||||
Amount = order.Amount,
|
||||
Description = $"خرید پکیج از درگاه - سفارش #{order.Id}",
|
||||
PaymentStatus = PaymentStatus.Success,
|
||||
PaymentDate = DateTime.Now,
|
||||
RefId = verifyResult.RefId,
|
||||
Type = TransactionType.DepositIpg
|
||||
};
|
||||
|
||||
_context.Transactions.Add(transaction);
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
// 6. ثبت لاگ تغییر Balance
|
||||
var balanceLog = new UserWalletChangeLog
|
||||
{
|
||||
WalletId = wallet.Id,
|
||||
CurrentBalance = wallet.Balance,
|
||||
ChangeValue = order.Amount,
|
||||
CurrentNetworkBalance = wallet.NetworkBalance,
|
||||
ChangeNerworkValue = 0,
|
||||
CurrentDiscountBalance = oldDiscountBalance,
|
||||
ChangeDiscountValue = 0,
|
||||
IsIncrease = true,
|
||||
RefrenceId = transaction.Id
|
||||
};
|
||||
await _context.UserWalletChangeLogs.AddAsync(balanceLog, cancellationToken);
|
||||
|
||||
// 7. ثبت لاگ تغییر DiscountBalance
|
||||
var discountLog = new UserWalletChangeLog
|
||||
{
|
||||
WalletId = wallet.Id,
|
||||
CurrentBalance = wallet.Balance,
|
||||
ChangeValue = 0,
|
||||
CurrentNetworkBalance = wallet.NetworkBalance,
|
||||
ChangeNerworkValue = 0,
|
||||
CurrentDiscountBalance = wallet.DiscountBalance,
|
||||
ChangeDiscountValue = discountAmount,
|
||||
IsIncrease = true,
|
||||
RefrenceId = transaction.Id
|
||||
};
|
||||
await _context.UserWalletChangeLogs.AddAsync(discountLog, cancellationToken);
|
||||
|
||||
// 8. ثبت UserPackagePurchase
|
||||
if (order.PackageId.HasValue)
|
||||
{
|
||||
var packagePurchase = new UserPackagePurchase
|
||||
{
|
||||
UserId = order.UserId,
|
||||
PackageId = order.PackageId.Value,
|
||||
PurchaseMethod = PackagePurchaseMethod.DirectPurchase,
|
||||
PurchasedAt = DateTime.Now,
|
||||
Amount = order.Amount,
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id
|
||||
};
|
||||
await _context.UserPackagePurchases.AddAsync(packagePurchase, cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Created UserPackagePurchase for UserId {UserId}, PackageId {PackageId}",
|
||||
order.UserId, order.PackageId.Value);
|
||||
}
|
||||
|
||||
// 9. بهروزرسانی سفارش و کاربر
|
||||
order.TransactionId = transaction.Id;
|
||||
order.PaymentStatus = PaymentStatus.Success;
|
||||
order.PaymentDate = DateTime.Now;
|
||||
order.PaymentMethod = PaymentMethod.IPG;
|
||||
order.User.PackagePurchaseMethod = PackagePurchaseMethod.DirectPurchase;
|
||||
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Golden package purchase verified successfully. OrderId: {OrderId}, UserId: {UserId}, TransactionId: {TransactionId}, RefId: {RefId}",
|
||||
order.Id,
|
||||
order.UserId,
|
||||
transaction.Id,
|
||||
verifyResult.RefId);
|
||||
|
||||
return new VerifyGoldenPackagePurchaseResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "پرداخت با موفقیت تایید شد. کیف پول شما شارژ گردید.",
|
||||
OrderId = order.Id,
|
||||
TransactionId = transaction.Id,
|
||||
ReferenceCode = verifyResult.RefId,
|
||||
WalletBalance = wallet.Balance
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(
|
||||
ex,
|
||||
"Error in VerifyGoldenPackagePurchaseCommand. OrderId: {OrderId}",
|
||||
request.OrderId);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
-23
@@ -1,23 +0,0 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace CMSMicroservice.Application.PackageCQ.Commands.VerifyGoldenPackagePurchase;
|
||||
|
||||
public class VerifyGoldenPackagePurchaseCommandValidator : AbstractValidator<VerifyGoldenPackagePurchaseCommand>
|
||||
{
|
||||
public VerifyGoldenPackagePurchaseCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.OrderId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه سفارش باید بزرگتر از 0 باشد");
|
||||
|
||||
RuleFor(x => x.Authority)
|
||||
.NotEmpty()
|
||||
.WithMessage("کد Authority الزامی است");
|
||||
|
||||
RuleFor(x => x.Status)
|
||||
.NotEmpty()
|
||||
.WithMessage("وضعیت پرداخت الزامی است")
|
||||
.Must(s => s == "OK" || s == "NOK")
|
||||
.WithMessage("وضعیت باید OK یا NOK باشد");
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,3 @@
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.PurchaseGoldenPackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.VerifyGoldenPackagePurchase;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.InitiateBasePackagePayment;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
||||
using CMSMicroservice.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||
using CMSMicroservice.Protobuf.Protos.Package;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
@@ -12,33 +8,6 @@ public class PackageProfile : IRegister
|
||||
{
|
||||
void IRegister.Register(TypeAdapterConfig config)
|
||||
{
|
||||
// PurchaseGoldenPackage
|
||||
config.NewConfig<PurchaseGoldenPackageRequest, PurchaseGoldenPackageCommand>()
|
||||
.Map(dest => dest.UserId, src => src.UserId)
|
||||
.Map(dest => dest.PackageId, src => src.PackageId)
|
||||
.Map(dest => dest.ReturnUrl, src => src.ReturnUrl);
|
||||
|
||||
config.NewConfig<PurchaseGoldenPackageResponseDto, PurchaseGoldenPackageResponse>()
|
||||
.Map(dest => dest.Success, src => src.Success)
|
||||
.Map(dest => dest.Message, src => src.Message)
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.PaymentGatewayUrl, src => src.PaymentGatewayUrl)
|
||||
.Map(dest => dest.TrackingCode, src => src.TrackingCode);
|
||||
|
||||
// VerifyGoldenPackagePurchase
|
||||
config.NewConfig<VerifyGoldenPackagePurchaseRequest, VerifyGoldenPackagePurchaseCommand>()
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.Authority, src => src.Authority)
|
||||
.Map(dest => dest.Status, src => src.Status);
|
||||
|
||||
config.NewConfig<VerifyGoldenPackagePurchaseResponseDto, VerifyGoldenPackagePurchaseResponse>()
|
||||
.Map(dest => dest.Success, src => src.Success)
|
||||
.Map(dest => dest.Message, src => src.Message)
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.TransactionId, src => src.TransactionId)
|
||||
.Map(dest => dest.ReferenceCode, src => src.ReferenceCode)
|
||||
.Map(dest => dest.WalletBalance, src => src.WalletBalance);
|
||||
|
||||
// GetUserPackageStatus
|
||||
config.NewConfig<GetUserPackageStatusRequest, GetUserPackageStatusQuery>()
|
||||
.Map(dest => dest.UserId, src => src.UserId);
|
||||
@@ -55,34 +24,6 @@ public class PackageProfile : IRegister
|
||||
.Map(dest => dest.LastPurchaseDate, src => src.LastPurchaseDate.HasValue
|
||||
? Timestamp.FromDateTime(src.LastPurchaseDate.Value.ToUniversalTime())
|
||||
: null);
|
||||
|
||||
// InitiateBasePackagePayment (56M پکیج پایه)
|
||||
config.NewConfig<InitiateBasePackagePaymentRequest, InitiateBasePackagePaymentCommand>()
|
||||
.Map(dest => dest.UserId, src => src.UserId);
|
||||
|
||||
config.NewConfig<InitiateBasePackagePaymentResponseDto, InitiateBasePackagePaymentResponse>()
|
||||
.Map(dest => dest.Success, src => src.Success)
|
||||
.Map(dest => dest.Message, src => src.Message)
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.TransactionId, src => src.TransactionId)
|
||||
.Map(dest => dest.Amount, src => src.Amount);
|
||||
|
||||
// VerifyBasePackagePayment (تأیید پرداخت پکیج پایه)
|
||||
config.NewConfig<VerifyBasePackagePaymentRequest, VerifyBasePackagePaymentCommand>()
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.TransactionId, src => src.TransactionId)
|
||||
.Map(dest => dest.PaymentSuccess, src => src.PaymentSuccess)
|
||||
.Map(dest => dest.RefId, src => src.RefId)
|
||||
.Map(dest => dest.Message, src => src.Message);
|
||||
|
||||
config.NewConfig<VerifyBasePackagePaymentResponseDto, VerifyBasePackagePaymentResponse>()
|
||||
.Map(dest => dest.Success, src => src.Success)
|
||||
.Map(dest => dest.Message, src => src.Message)
|
||||
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||
.Map(dest => dest.TransactionId, src => src.TransactionId)
|
||||
.Map(dest => dest.ReferenceCode, src => src.ReferenceCode)
|
||||
.Map(dest => dest.WalletBalance, src => src.WalletBalance)
|
||||
.Map(dest => dest.DiscountBalance, src => src.DiscountBalance);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,6 @@ using CMSMicroservice.WebApi.Common.Services;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.CreateNewPackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.UpdatePackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.DeletePackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.PurchaseGoldenPackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.VerifyGoldenPackagePurchase;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.InitiateBasePackagePayment;
|
||||
using CMSMicroservice.Application.PackageCQ.Commands.VerifyBasePackagePayment;
|
||||
using CMSMicroservice.Application.PackageCQ.Queries.GetPackage;
|
||||
using CMSMicroservice.Application.PackageCQ.Queries.GetAllPackageByFilter;
|
||||
using CMSMicroservice.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||
@@ -72,32 +68,11 @@ public class PackageService : PackageContract.PackageContractBase
|
||||
return await _dispatchRequestToCQRS.Handle<GetAllPackageByFilterRequest, GetAllPackageByFilterQuery, GetAllPackageByFilterResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<PurchaseGoldenPackageResponse> PurchaseGoldenPackage(PurchaseGoldenPackageRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<PurchaseGoldenPackageRequest, PurchaseGoldenPackageCommand, PurchaseGoldenPackageResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<VerifyGoldenPackagePurchaseResponse> VerifyGoldenPackagePurchase(VerifyGoldenPackagePurchaseRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<VerifyGoldenPackagePurchaseRequest, VerifyGoldenPackagePurchaseCommand, VerifyGoldenPackagePurchaseResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetUserPackageStatusResponse> GetUserPackageStatus(GetUserPackageStatusRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetUserPackageStatusRequest, GetUserPackageStatusQuery, GetUserPackageStatusResponse>(request, context);
|
||||
}
|
||||
|
||||
// Base Package Payment (56M)
|
||||
public override async Task<InitiateBasePackagePaymentResponse> InitiateBasePackagePayment(InitiateBasePackagePaymentRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<InitiateBasePackagePaymentRequest, InitiateBasePackagePaymentCommand, InitiateBasePackagePaymentResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<VerifyBasePackagePaymentResponse> VerifyBasePackagePayment(VerifyBasePackagePaymentRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<VerifyBasePackagePaymentRequest, VerifyBasePackagePaymentCommand, VerifyBasePackagePaymentResponse>(request, context);
|
||||
}
|
||||
|
||||
// ============= Customer-specific Method Implementations =============
|
||||
|
||||
public override async Task<GetCustomerPackagesResponse> GetCustomerPackages(GetCustomerPackagesRequest request, ServerCallContext context)
|
||||
|
||||
Reference in New Issue
Block a user