feat: Implement user permission checks and manual payment functionalities
- Added CheckUserPermissionQuery and CheckUserPermissionQueryHandler for permission validation. - Introduced GetUserRolesQuery and GetUserRolesQueryHandler to retrieve user roles. - Created IPermissionService interface and its implementation in PermissionService. - Defined permission and role constants in PermissionDefinitions. - Developed SetDefaultVatPercentageCommand and its handler for VAT configuration. - Implemented GetCurrentVatPercentageQuery and handler to fetch current VAT settings. - Added manual payment commands: CreateManualPayment, ApproveManualPayment, and RejectManualPayment with respective handlers and validators. - Created GetManualPaymentsQuery and handler for retrieving manual payment records. - Integrated gRPC services for manual payments with appropriate permission checks. - Established Protobuf definitions for manual payment operations and metadata.
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.AuthorizationCQ.Queries.CheckUserPermission;
|
||||
|
||||
public record CheckUserPermissionQuery(string Permission) : IRequest<bool>;
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.AuthorizationCQ.Queries.CheckUserPermission;
|
||||
|
||||
public class CheckUserPermissionQueryHandler : IRequestHandler<CheckUserPermissionQuery, bool>
|
||||
{
|
||||
private readonly IPermissionService _permissionService;
|
||||
|
||||
public CheckUserPermissionQueryHandler(IPermissionService permissionService)
|
||||
{
|
||||
_permissionService = permissionService;
|
||||
}
|
||||
|
||||
public async Task<bool> Handle(CheckUserPermissionQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(request.Permission))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return await _permissionService.HasPermissionAsync(request.Permission, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.AuthorizationCQ.Queries.GetUserRoles;
|
||||
|
||||
public record GetUserRolesQuery : IRequest<IReadOnlyList<string>>;
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.AuthorizationCQ.Queries.GetUserRoles;
|
||||
|
||||
public class GetUserRolesQueryHandler : IRequestHandler<GetUserRolesQuery, IReadOnlyList<string>>
|
||||
{
|
||||
private readonly IPermissionService _permissionService;
|
||||
|
||||
public GetUserRolesQueryHandler(IPermissionService permissionService)
|
||||
{
|
||||
_permissionService = permissionService;
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<string>> Handle(GetUserRolesQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
return await _permissionService.GetUserRolesAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,5 +61,8 @@ public interface IApplicationContractContext
|
||||
// Public Messages
|
||||
PublicMessageContract.PublicMessageContractClient PublicMessages { get; }
|
||||
|
||||
// Manual Payments (Admin) - CMS gRPC
|
||||
CMSMicroservice.Protobuf.Protos.ManualPayment.ManualPaymentContract.ManualPaymentContractClient ManualPayments { get; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BackOffice.BFF.Application.Common.Interfaces;
|
||||
|
||||
public interface IPermissionService
|
||||
{
|
||||
Task<IReadOnlyList<string>> GetUserRolesAsync(CancellationToken cancellationToken);
|
||||
|
||||
Task<bool> HasPermissionAsync(string permission, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ using CmsUserOrderFilter = CMSMicroservice.Protobuf.Protos.UserOrder.GetAllUserO
|
||||
using CmsUserOrderRequest = CMSMicroservice.Protobuf.Protos.UserOrder.GetAllUserOrderByFilterRequest;
|
||||
using GetAllUserOrderByFilterFilter = BackOffice.BFF.Application.UserOrderCQ.Queries.GetAllUserOrderByFilter.GetAllUserOrderByFilterFilter;
|
||||
using GetAllUserOrderByFilterResponseModel = BackOffice.BFF.Application.UserOrderCQ.Queries.GetAllUserOrderByFilter.GetAllUserOrderByFilterResponseModel;
|
||||
using CmsGetUserOrderResponse = CMSMicroservice.Protobuf.Protos.UserOrder.GetUserOrderResponse;
|
||||
using BffGetUserOrderResponseDto = BackOffice.BFF.Application.UserOrderCQ.Queries.GetUserOrder.GetUserOrderResponseDto;
|
||||
|
||||
namespace BackOffice.BFF.Application.Common.Mappings;
|
||||
|
||||
@@ -26,11 +28,13 @@ public class UserOrderProfile : IRegister
|
||||
.IgnoreIf((src, dest) => src.Filter.PaymentStatus==null,dest => dest.Filter.PaymentStatus)
|
||||
.Map(dest => dest.Filter, src => src.Filter == null || IsEmptyFilter(src.Filter) ? null : BuildFilter(src.Filter));
|
||||
|
||||
// config.NewConfig< CMSMicroservice.Protobuf.Protos.UserOrder.GetAllUserOrderByFilterResponseModel, GetAllUserOrderByFilterResponseModel>()
|
||||
//
|
||||
// .Map(dest => dest.p, src => src.PaymentMethod);
|
||||
|
||||
|
||||
// Map VAT information from CMS GetUserOrderResponse (VatInfo) to flattened DTO fields
|
||||
config.NewConfig<CmsGetUserOrderResponse, BffGetUserOrderResponseDto>()
|
||||
.Map(dest => dest.VatBaseAmount, src => src.VatInfo != null ? src.VatInfo.BaseAmount : 0)
|
||||
.Map(dest => dest.VatAmount, src => src.VatInfo != null ? src.VatInfo.VatAmount : 0)
|
||||
.Map(dest => dest.VatTotalAmount,
|
||||
src => src.VatInfo != null ? src.VatInfo.TotalAmount : src.Amount)
|
||||
.Map(dest => dest.VatPercentage, src => src.VatInfo != null ? src.VatInfo.VatRate * 100 : 0);
|
||||
}
|
||||
|
||||
private static bool IsEmptyFilter(GetAllUserOrderByFilterFilter src)
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace BackOffice.BFF.Application.Common.Models;
|
||||
|
||||
public static class RoleNames
|
||||
{
|
||||
public const string SuperAdmin = "SuperAdmin";
|
||||
public const string Admin = "Admin";
|
||||
public const string Inspector = "Inspector";
|
||||
}
|
||||
|
||||
public static class PermissionNames
|
||||
{
|
||||
// Dashboard
|
||||
public const string DashboardView = "dashboard.view";
|
||||
|
||||
// Orders
|
||||
public const string OrdersView = "orders.view";
|
||||
public const string OrdersCreate = "orders.create";
|
||||
public const string OrdersUpdate = "orders.update";
|
||||
public const string OrdersDelete = "orders.delete";
|
||||
public const string OrdersCancel = "orders.cancel";
|
||||
public const string OrdersApprove = "orders.approve";
|
||||
|
||||
// Products
|
||||
public const string ProductsView = "products.view";
|
||||
public const string ProductsCreate = "products.create";
|
||||
public const string ProductsUpdate = "products.update";
|
||||
public const string ProductsDelete = "products.delete";
|
||||
|
||||
// Users
|
||||
public const string UsersView = "users.view";
|
||||
public const string UsersUpdate = "users.update";
|
||||
public const string UsersDelete = "users.delete";
|
||||
|
||||
// Commission / Withdrawal
|
||||
public const string CommissionView = "commission.view";
|
||||
public const string CommissionApproveWithdrawal = "commission.approve_withdrawal";
|
||||
|
||||
// Public Messages
|
||||
public const string PublicMessagesView = "publicmessages.view";
|
||||
public const string PublicMessagesCreate = "publicmessages.create";
|
||||
public const string PublicMessagesUpdate = "publicmessages.update";
|
||||
public const string PublicMessagesPublish = "publicmessages.publish";
|
||||
|
||||
// Manual Payments
|
||||
public const string ManualPaymentsView = "manualpayments.view";
|
||||
public const string ManualPaymentsCreate = "manualpayments.create";
|
||||
public const string ManualPaymentsApprove = "manualpayments.approve";
|
||||
|
||||
// Settings / Configuration / VAT
|
||||
public const string SettingsView = "settings.view";
|
||||
public const string SettingsManageConfiguration = "settings.manage_configuration";
|
||||
public const string SettingsManageVat = "settings.manage_vat";
|
||||
|
||||
// Reports
|
||||
public const string ReportsView = "reports.view";
|
||||
}
|
||||
|
||||
public static class RolePermissionConfig
|
||||
{
|
||||
private static readonly IReadOnlyDictionary<string, string[]> RolePermissions =
|
||||
new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
// SuperAdmin: full access (wildcard)
|
||||
[RoleNames.SuperAdmin] = new[] { "*" },
|
||||
|
||||
// Admin: مدیریت سفارشها، محصولات، بخشی از کمیسیون و پیامها
|
||||
[RoleNames.Admin] = new[]
|
||||
{
|
||||
PermissionNames.DashboardView,
|
||||
|
||||
PermissionNames.OrdersView,
|
||||
PermissionNames.OrdersCreate,
|
||||
PermissionNames.OrdersUpdate,
|
||||
PermissionNames.OrdersCancel,
|
||||
|
||||
PermissionNames.ProductsView,
|
||||
PermissionNames.ProductsCreate,
|
||||
PermissionNames.ProductsUpdate,
|
||||
PermissionNames.ProductsDelete,
|
||||
|
||||
PermissionNames.UsersView,
|
||||
PermissionNames.UsersUpdate,
|
||||
|
||||
PermissionNames.CommissionView,
|
||||
PermissionNames.CommissionApproveWithdrawal,
|
||||
|
||||
PermissionNames.PublicMessagesView,
|
||||
PermissionNames.PublicMessagesCreate,
|
||||
PermissionNames.PublicMessagesUpdate,
|
||||
PermissionNames.PublicMessagesPublish,
|
||||
|
||||
PermissionNames.ManualPaymentsView,
|
||||
PermissionNames.ManualPaymentsCreate,
|
||||
|
||||
PermissionNames.ReportsView
|
||||
},
|
||||
|
||||
// Inspector: فقط مشاهده
|
||||
[RoleNames.Inspector] = new[]
|
||||
{
|
||||
PermissionNames.DashboardView,
|
||||
PermissionNames.OrdersView,
|
||||
PermissionNames.UsersView,
|
||||
PermissionNames.CommissionView,
|
||||
PermissionNames.PublicMessagesView,
|
||||
PermissionNames.ReportsView
|
||||
}
|
||||
};
|
||||
|
||||
public static bool HasPermission(string role, string permission)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(role) || string.IsNullOrWhiteSpace(permission))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!RolePermissions.TryGetValue(role, out var permissions))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (permissions.Contains("*", StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return permissions.Contains(permission, StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace BackOffice.BFF.Application.ConfigurationCQ.Commands.SetDefaultVatPercentage;
|
||||
|
||||
public record SetDefaultVatPercentageCommand : IRequest<Unit>
|
||||
{
|
||||
/// <summary>
|
||||
/// درصد VAT جدید (مثلاً 10 به معنای 10٪)
|
||||
/// </summary>
|
||||
public int VatPercentage { get; init; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.Configuration.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ConfigurationCQ.Commands.SetDefaultVatPercentage;
|
||||
|
||||
public class SetDefaultVatPercentageCommandHandler : IRequestHandler<SetDefaultVatPercentageCommand, Unit>
|
||||
{
|
||||
private const string VatConfigurationKey = "DefaultVatPercentage";
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<SetDefaultVatPercentageCommandHandler> _logger;
|
||||
|
||||
public SetDefaultVatPercentageCommandHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<SetDefaultVatPercentageCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<Unit> Handle(SetDefaultVatPercentageCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
var grpcRequest = new CreateOrUpdateConfigurationRequest
|
||||
{
|
||||
Key = VatConfigurationKey,
|
||||
Value = request.VatPercentage.ToString(),
|
||||
Scope = 0, // System scope
|
||||
Description = new StringValue
|
||||
{
|
||||
Value = "درصد پیشفرض مالیات بر ارزش افزوده سفارشها"
|
||||
}
|
||||
};
|
||||
|
||||
await _context.Configurations.CreateOrUpdateConfigurationAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
_logger.LogInformation("Default VAT percentage updated to {VatPercentage}%.", request.VatPercentage);
|
||||
|
||||
return Unit.Value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace BackOffice.BFF.Application.ConfigurationCQ.Commands.SetDefaultVatPercentage;
|
||||
|
||||
public class SetDefaultVatPercentageCommandValidator : AbstractValidator<SetDefaultVatPercentageCommand>
|
||||
{
|
||||
public SetDefaultVatPercentageCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.VatPercentage)
|
||||
.InclusiveBetween(0, 100)
|
||||
.WithMessage("درصد VAT باید بین 0 تا 100 باشد.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace BackOffice.BFF.Application.ConfigurationCQ.Queries.GetCurrentVatPercentage;
|
||||
|
||||
public record GetCurrentVatPercentageQuery : IRequest<GetCurrentVatPercentageResponse>;
|
||||
|
||||
public class GetCurrentVatPercentageResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// درصد VAT فعلی (مثلاً 10 به معنای 10٪)
|
||||
/// </summary>
|
||||
public int VatPercentage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// آیا مقدار از تنظیمات خوانده شده (true) یا مقدار پیشفرض استفاده شده (false)
|
||||
/// </summary>
|
||||
public bool IsConfigured { get; set; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.Configuration.Protobuf;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ConfigurationCQ.Queries.GetCurrentVatPercentage;
|
||||
|
||||
public class GetCurrentVatPercentageQueryHandler : IRequestHandler<GetCurrentVatPercentageQuery, GetCurrentVatPercentageResponse>
|
||||
{
|
||||
private const string VatConfigurationKey = "DefaultVatPercentage";
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<GetCurrentVatPercentageQueryHandler> _logger;
|
||||
|
||||
public GetCurrentVatPercentageQueryHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<GetCurrentVatPercentageQueryHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<GetCurrentVatPercentageResponse> Handle(GetCurrentVatPercentageQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
var grpcRequest = new GetConfigurationByKeyRequest
|
||||
{
|
||||
Key = VatConfigurationKey
|
||||
};
|
||||
|
||||
var response = await _context.Configurations.GetConfigurationByKeyAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
if (response == null || string.IsNullOrWhiteSpace(response.Value))
|
||||
{
|
||||
_logger.LogInformation("VAT configuration not found. Using default value 10%.");
|
||||
return new GetCurrentVatPercentageResponse
|
||||
{
|
||||
VatPercentage = 10,
|
||||
IsConfigured = false
|
||||
};
|
||||
}
|
||||
|
||||
if (!int.TryParse(response.Value, out var vat) || vat < 0)
|
||||
{
|
||||
_logger.LogWarning("Invalid VAT configuration value '{Value}'. Falling back to default 10%.", response.Value);
|
||||
return new GetCurrentVatPercentageResponse
|
||||
{
|
||||
VatPercentage = 10,
|
||||
IsConfigured = false
|
||||
};
|
||||
}
|
||||
|
||||
return new GetCurrentVatPercentageResponse
|
||||
{
|
||||
VatPercentage = vat,
|
||||
IsConfigured = true
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while reading VAT configuration. Falling back to default value 10%.");
|
||||
return new GetCurrentVatPercentageResponse
|
||||
{
|
||||
VatPercentage = 10,
|
||||
IsConfigured = false
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ApproveManualPayment;
|
||||
|
||||
public class ApproveManualPaymentCommand : IRequest<bool>
|
||||
{
|
||||
public long ManualPaymentId { get; set; }
|
||||
public string? ApprovalNote { get; set; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Protobuf.Protos.ManualPayment;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ApproveManualPayment;
|
||||
|
||||
public class ApproveManualPaymentCommandHandler : IRequestHandler<ApproveManualPaymentCommand, bool>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<ApproveManualPaymentCommandHandler> _logger;
|
||||
|
||||
public ApproveManualPaymentCommandHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<ApproveManualPaymentCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<bool> Handle(ApproveManualPaymentCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("Approving manual payment via BFF. Id: {Id}", request.ManualPaymentId);
|
||||
|
||||
var grpcRequest = new ApproveManualPaymentRequest
|
||||
{
|
||||
ManualPaymentId = request.ManualPaymentId
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(request.ApprovalNote))
|
||||
{
|
||||
grpcRequest.ApprovalNote = new StringValue { Value = request.ApprovalNote };
|
||||
}
|
||||
|
||||
await _context.ManualPayments.ApproveManualPaymentAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ApproveManualPayment;
|
||||
|
||||
public class ApproveManualPaymentCommandValidator : AbstractValidator<ApproveManualPaymentCommand>
|
||||
{
|
||||
public ApproveManualPaymentCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.ManualPaymentId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه پرداخت دستی نامعتبر است.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.CreateManualPayment;
|
||||
|
||||
public class CreateManualPaymentCommand : IRequest<CreateManualPaymentResponseDto>
|
||||
{
|
||||
public long UserId { get; set; }
|
||||
public long Amount { get; set; }
|
||||
public int Type { get; set; }
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string? ReferenceNumber { get; set; }
|
||||
}
|
||||
|
||||
public class CreateManualPaymentResponseDto
|
||||
{
|
||||
public long Id { get; set; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Protobuf.Protos.ManualPayment;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.CreateManualPayment;
|
||||
|
||||
public class CreateManualPaymentCommandHandler : IRequestHandler<CreateManualPaymentCommand, CreateManualPaymentResponseDto>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<CreateManualPaymentCommandHandler> _logger;
|
||||
|
||||
public CreateManualPaymentCommandHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<CreateManualPaymentCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<CreateManualPaymentResponseDto> Handle(CreateManualPaymentCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Creating manual payment via BFF for UserId {UserId}, Amount {Amount}, Type {Type}",
|
||||
request.UserId,
|
||||
request.Amount,
|
||||
request.Type);
|
||||
|
||||
var grpcRequest = new CreateManualPaymentRequest
|
||||
{
|
||||
UserId = request.UserId,
|
||||
Amount = request.Amount,
|
||||
Type = (ManualPaymentType)request.Type,
|
||||
Description = request.Description
|
||||
};
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(request.ReferenceNumber))
|
||||
{
|
||||
grpcRequest.ReferenceNumber = new StringValue { Value = request.ReferenceNumber };
|
||||
}
|
||||
|
||||
var response = await _context.ManualPayments.CreateManualPaymentAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
return new CreateManualPaymentResponseDto
|
||||
{
|
||||
Id = response.Id
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.CreateManualPayment;
|
||||
|
||||
public class CreateManualPaymentCommandValidator : AbstractValidator<CreateManualPaymentCommand>
|
||||
{
|
||||
public CreateManualPaymentCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.UserId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه کاربر باید بزرگتر از صفر باشد.");
|
||||
|
||||
RuleFor(x => x.Amount)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("مبلغ باید بزرگتر از صفر باشد.");
|
||||
|
||||
RuleFor(x => x.Description)
|
||||
.NotEmpty()
|
||||
.WithMessage("توضیحات الزامی است.");
|
||||
|
||||
RuleFor(x => x.Type)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("نوع پرداخت دستی نامعتبر است.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.RejectManualPayment;
|
||||
|
||||
public class RejectManualPaymentCommand : IRequest<bool>
|
||||
{
|
||||
public long ManualPaymentId { get; set; }
|
||||
public string RejectionReason { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Protobuf.Protos.ManualPayment;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.RejectManualPayment;
|
||||
|
||||
public class RejectManualPaymentCommandHandler : IRequestHandler<RejectManualPaymentCommand, bool>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<RejectManualPaymentCommandHandler> _logger;
|
||||
|
||||
public RejectManualPaymentCommandHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<RejectManualPaymentCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<bool> Handle(RejectManualPaymentCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("Rejecting manual payment via BFF. Id: {Id}", request.ManualPaymentId);
|
||||
|
||||
var grpcRequest = new RejectManualPaymentRequest
|
||||
{
|
||||
ManualPaymentId = request.ManualPaymentId,
|
||||
RejectionReason = request.RejectionReason
|
||||
};
|
||||
|
||||
await _context.ManualPayments.RejectManualPaymentAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.RejectManualPayment;
|
||||
|
||||
public class RejectManualPaymentCommandValidator : AbstractValidator<RejectManualPaymentCommand>
|
||||
{
|
||||
public RejectManualPaymentCommandValidator()
|
||||
{
|
||||
RuleFor(x => x.ManualPaymentId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه پرداخت دستی نامعتبر است.");
|
||||
|
||||
RuleFor(x => x.RejectionReason)
|
||||
.NotEmpty()
|
||||
.WithMessage("دلیل رد الزامی است.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
using MediatR;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Queries.GetManualPayments;
|
||||
|
||||
public class GetManualPaymentsQuery : IRequest<GetManualPaymentsResponseDto>
|
||||
{
|
||||
public int PageNumber { get; set; } = 1;
|
||||
public int PageSize { get; set; } = 10;
|
||||
public long? UserId { get; set; }
|
||||
public int? Status { get; set; }
|
||||
public int? Type { get; set; }
|
||||
public long? RequestedBy { get; set; }
|
||||
public bool OrderByDescending { get; set; } = true;
|
||||
public string? ReferenceNumber { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.Application.Common.Models;
|
||||
using CMSMicroservice.Protobuf.Protos.ManualPayment;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Queries.GetManualPayments;
|
||||
|
||||
public class GetManualPaymentsQueryHandler : IRequestHandler<GetManualPaymentsQuery, GetManualPaymentsResponseDto>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<GetManualPaymentsQueryHandler> _logger;
|
||||
|
||||
public GetManualPaymentsQueryHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<GetManualPaymentsQueryHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<GetManualPaymentsResponseDto> Handle(GetManualPaymentsQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"Getting manual payments via BFF. Page: {Page}, PageSize: {PageSize}, Status: {Status}, Type: {Type}",
|
||||
request.PageNumber,
|
||||
request.PageSize,
|
||||
request.Status,
|
||||
request.Type);
|
||||
|
||||
var grpcRequest = new GetAllManualPaymentsRequest
|
||||
{
|
||||
PageNumber = request.PageNumber,
|
||||
PageSize = request.PageSize
|
||||
};
|
||||
|
||||
if (request.UserId.HasValue)
|
||||
{
|
||||
grpcRequest.UserId = new Int64Value { Value = request.UserId.Value };
|
||||
}
|
||||
|
||||
if (request.Status.HasValue)
|
||||
{
|
||||
grpcRequest.Status = new Int32Value { Value = request.Status.Value };
|
||||
}
|
||||
|
||||
if (request.Type.HasValue)
|
||||
{
|
||||
grpcRequest.Type = new Int32Value { Value = request.Type.Value };
|
||||
}
|
||||
|
||||
if (request.RequestedBy.HasValue)
|
||||
{
|
||||
grpcRequest.RequestedBy = new Int64Value { Value = request.RequestedBy.Value };
|
||||
}
|
||||
|
||||
grpcRequest.OrderByDescending = new BoolValue { Value = request.OrderByDescending };
|
||||
|
||||
var response = await _context.ManualPayments.GetAllManualPaymentsAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
var meta = response.MetaData;
|
||||
|
||||
var models = response.Models?
|
||||
.Select(m => new ManualPaymentModel
|
||||
{
|
||||
Id = m.Id,
|
||||
UserId = m.UserId,
|
||||
UserFullName = m.UserFullName,
|
||||
UserMobile = m.UserMobile,
|
||||
Amount = m.Amount,
|
||||
Type = (int)m.Type,
|
||||
TypeDisplay = m.TypeDisplay,
|
||||
Description = m.Description,
|
||||
ReferenceNumber = m.ReferenceNumber,
|
||||
Status = (int)m.Status,
|
||||
StatusDisplay = m.StatusDisplay,
|
||||
RequestedBy = m.RequestedBy,
|
||||
RequestedByName = m.RequestedByName,
|
||||
ApprovedBy = m.ApprovedBy?.Value,
|
||||
ApprovedByName = m.ApprovedByName,
|
||||
ApprovedAt = m.ApprovedAt?.ToDateTime(),
|
||||
RejectionReason = m.RejectionReason,
|
||||
TransactionId = m.TransactionId?.Value,
|
||||
Created = m.Created.ToDateTime()
|
||||
})
|
||||
.ToList()
|
||||
?? new List<ManualPaymentModel>();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(request.ReferenceNumber))
|
||||
{
|
||||
models = models
|
||||
.Where(m => !string.IsNullOrWhiteSpace(m.ReferenceNumber) &&
|
||||
m.ReferenceNumber.Contains(request.ReferenceNumber!, StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
var result = new GetManualPaymentsResponseDto
|
||||
{
|
||||
MetaData = new MetaData
|
||||
{
|
||||
CurrentPage = meta.CurrentPage,
|
||||
TotalPage = meta.TotalPage,
|
||||
PageSize = meta.PageSize,
|
||||
TotalCount = meta.TotalCount,
|
||||
HasPrevious = meta.HasPrevious,
|
||||
HasNext = meta.HasNext
|
||||
},
|
||||
Models = models
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using BackOffice.BFF.Application.Common.Models;
|
||||
|
||||
namespace BackOffice.BFF.Application.ManualPaymentCQ.Queries.GetManualPayments;
|
||||
|
||||
public class GetManualPaymentsResponseDto
|
||||
{
|
||||
public MetaData MetaData { get; set; } = new();
|
||||
public List<ManualPaymentModel>? Models { get; set; }
|
||||
}
|
||||
|
||||
public class ManualPaymentModel
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public long UserId { get; set; }
|
||||
public string UserFullName { get; set; } = string.Empty;
|
||||
public string UserMobile { get; set; } = string.Empty;
|
||||
public long Amount { get; set; }
|
||||
public int Type { get; set; }
|
||||
public string TypeDisplay { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public string? ReferenceNumber { get; set; }
|
||||
public int Status { get; set; }
|
||||
public string StatusDisplay { get; set; } = string.Empty;
|
||||
public long RequestedBy { get; set; }
|
||||
public string RequestedByName { get; set; } = string.Empty;
|
||||
public long? ApprovedBy { get; set; }
|
||||
public string? ApprovedByName { get; set; }
|
||||
public DateTime? ApprovedAt { get; set; }
|
||||
public string? RejectionReason { get; set; }
|
||||
public long? TransactionId { get; set; }
|
||||
public DateTime Created { get; set; }
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.Package.Protobuf.Protos.Package;
|
||||
using CMSMicroservice.Protobuf.Protos.Package;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using BffPackage = BackOffice.BFF.Package.Protobuf.Protos.Package;
|
||||
using CmsPackage = CMSMicroservice.Protobuf.Protos.Package;
|
||||
|
||||
namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||
|
||||
public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageStatusQuery, GetUserPackageStatusResponse>
|
||||
public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageStatusQuery, BffPackage.GetUserPackageStatusResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<GetUserPackageStatusQueryHandler> _logger;
|
||||
@@ -19,9 +19,9 @@ public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageSt
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<GetUserPackageStatusResponse> Handle(GetUserPackageStatusQuery request, CancellationToken cancellationToken)
|
||||
public async Task<BffPackage.GetUserPackageStatusResponse> Handle(GetUserPackageStatusQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
var grpcRequest = new GetUserPackageStatusRequest
|
||||
var grpcRequest = new CmsPackage.GetUserPackageStatusRequest
|
||||
{
|
||||
UserId = request.UserId
|
||||
};
|
||||
@@ -30,7 +30,7 @@ public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageSt
|
||||
|
||||
_logger.LogInformation("Retrieved package status for user {UserId}", request.UserId);
|
||||
|
||||
var result = new GetUserPackageStatusResponse
|
||||
var result = new BffPackage.GetUserPackageStatusResponse
|
||||
{
|
||||
UserId = response.UserId,
|
||||
PackagePurchaseMethod = response.PackagePurchaseMethod,
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.ArchiveMessage;
|
||||
|
||||
public class ArchiveMessageCommandHandler : IRequestHandler<ArchiveMessageRequest, ArchiveMessageResponse>
|
||||
public class ArchiveMessageCommand : IRequest<BffProto.ArchiveMessageResponse>
|
||||
{
|
||||
public long MessageId { get; set; }
|
||||
}
|
||||
|
||||
public class ArchiveMessageCommandHandler : IRequestHandler<ArchiveMessageCommand, BffProto.ArchiveMessageResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -13,9 +18,9 @@ public class ArchiveMessageCommandHandler : IRequestHandler<ArchiveMessageReques
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<ArchiveMessageResponse> Handle(ArchiveMessageRequest request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.ArchiveMessageResponse> Handle(ArchiveMessageCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new ArchiveMessageRequest
|
||||
var cmsRequest = new CmsProto.ArchiveMessageRequest
|
||||
{
|
||||
MessageId = request.MessageId
|
||||
};
|
||||
@@ -24,7 +29,7 @@ public class ArchiveMessageCommandHandler : IRequestHandler<ArchiveMessageReques
|
||||
cmsRequest,
|
||||
cancellationToken: cancellationToken);
|
||||
|
||||
return new ArchiveMessageResponse
|
||||
return new BffProto.ArchiveMessageResponse
|
||||
{
|
||||
Success = cmsResponse.Success,
|
||||
Message = cmsResponse.Message,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.CreatePublicMessage;
|
||||
|
||||
public class CreatePublicMessageCommandHandler : IRequestHandler<CreatePublicMessageRequest, CreatePublicMessageResponse>
|
||||
public class CreatePublicMessageCommandHandler : IRequestHandler<BffProto.CreatePublicMessageRequest, BffProto.CreatePublicMessageResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -14,9 +14,9 @@ public class CreatePublicMessageCommandHandler : IRequestHandler<CreatePublicMes
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<CreatePublicMessageResponse> Handle(CreatePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.CreatePublicMessageResponse> Handle(BffProto.CreatePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new CreatePublicMessageRequest
|
||||
var cmsRequest = new CmsProto.CreatePublicMessageRequest
|
||||
{
|
||||
Title = request.Title,
|
||||
Content = request.Content,
|
||||
@@ -30,7 +30,7 @@ public class CreatePublicMessageCommandHandler : IRequestHandler<CreatePublicMes
|
||||
cmsRequest,
|
||||
cancellationToken: cancellationToken);
|
||||
|
||||
return new CreatePublicMessageResponse
|
||||
return new BffProto.CreatePublicMessageResponse
|
||||
{
|
||||
Success = true,
|
||||
Message = "پیام با موفقیت ایجاد شد",
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using MediatR;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.DeletePublicMessage;
|
||||
|
||||
public class DeletePublicMessageCommandHandler : IRequestHandler<DeletePublicMessageRequest, DeletePublicMessageRequest>
|
||||
public class DeletePublicMessageCommandHandler : IRequestHandler<BffProto.DeletePublicMessageRequest, BffProto.DeletePublicMessageRequest>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -13,9 +14,9 @@ public class DeletePublicMessageCommandHandler : IRequestHandler<DeletePublicMes
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<DeletePublicMessageRequest> Handle(DeletePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.DeletePublicMessageRequest> Handle(BffProto.DeletePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new DeletePublicMessageRequest
|
||||
var cmsRequest = new CmsProto.DeletePublicMessageRequest
|
||||
{
|
||||
MessageId = request.MessageId
|
||||
};
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using MediatR;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.PublishMessage;
|
||||
|
||||
public class PublishMessageCommandHandler : IRequestHandler<PublishMessageRequest, PublishMessageResponse>
|
||||
public class PublishMessageCommandHandler : IRequestHandler<BffProto.PublishMessageRequest, BffProto.PublishMessageResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -13,9 +14,9 @@ public class PublishMessageCommandHandler : IRequestHandler<PublishMessageReques
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<PublishMessageResponse> Handle(PublishMessageRequest request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.PublishMessageResponse> Handle(BffProto.PublishMessageRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new PublishMessageRequest
|
||||
var cmsRequest = new CmsProto.PublishMessageRequest
|
||||
{
|
||||
MessageId = request.MessageId
|
||||
};
|
||||
@@ -24,7 +25,7 @@ public class PublishMessageCommandHandler : IRequestHandler<PublishMessageReques
|
||||
cmsRequest,
|
||||
cancellationToken: cancellationToken);
|
||||
|
||||
return new PublishMessageResponse
|
||||
return new BffProto.PublishMessageResponse
|
||||
{
|
||||
Success = cmsResponse.Success,
|
||||
Message = cmsResponse.Message,
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.UpdatePublicMessage;
|
||||
|
||||
public class UpdatePublicMessageCommandHandler : IRequestHandler<UpdatePublicMessageRequest, UpdatePublicMessageRequest>
|
||||
public class UpdatePublicMessageCommandHandler : IRequestHandler<BffProto.UpdatePublicMessageRequest, BffProto.UpdatePublicMessageRequest>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -14,9 +15,9 @@ public class UpdatePublicMessageCommandHandler : IRequestHandler<UpdatePublicMes
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<UpdatePublicMessageRequest> Handle(UpdatePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.UpdatePublicMessageRequest> Handle(BffProto.UpdatePublicMessageRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new UpdatePublicMessageRequest
|
||||
var cmsRequest = new CmsProto.UpdatePublicMessageRequest
|
||||
{
|
||||
Id = request.MessageId,
|
||||
Title = request.Title,
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
// GetActiveMessages - Public view
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages;
|
||||
|
||||
public record GetActiveMessagesQuery : IRequest<GetActiveMessagesResponse>
|
||||
public record GetActiveMessagesQuery : IRequest<BffProto.GetActiveMessagesResponse>
|
||||
{
|
||||
public int? MessageType { get; init; }
|
||||
public string? TargetAudience { get; init; }
|
||||
}
|
||||
|
||||
public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQuery, GetActiveMessagesResponse>
|
||||
public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQuery, BffProto.GetActiveMessagesResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -22,18 +21,18 @@ public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQu
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<GetActiveMessagesResponse> Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.GetActiveMessagesResponse> Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new GetActiveMessagesRequest();
|
||||
var cmsRequest = new CmsProto.GetActiveMessagesRequest();
|
||||
|
||||
// نسخه فعلی CMS فیلدی برای فیلتر ندارد؛ در صورت اضافه شدن، اینجا مپ میشود.
|
||||
var cmsResponse = await _context.PublicMessages.GetActiveMessagesAsync(cmsRequest, cancellationToken: cancellationToken);
|
||||
|
||||
var result = new GetActiveMessagesResponse();
|
||||
var result = new BffProto.GetActiveMessagesResponse();
|
||||
|
||||
foreach (var message in cmsResponse.Messages)
|
||||
{
|
||||
result.Messages.Add(new PublicMessageDto
|
||||
result.Messages.Add(new BffProto.PublicMessageDto
|
||||
{
|
||||
MessageId = message.Id,
|
||||
Title = message.Title,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
// GetAllMessages - Admin view
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CMSMicroservice.Protobuf.Protos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using MediatR;
|
||||
using BffProto = BackOffice.BFF.PublicMessage.Protobuf;
|
||||
using CmsProto = CMSMicroservice.Protobuf.Protos;
|
||||
|
||||
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages;
|
||||
|
||||
public record GetAllMessagesQuery : IRequest<GetAllMessagesResponse>
|
||||
public record GetAllMessagesQuery : IRequest<BffProto.GetAllMessagesResponse>
|
||||
{
|
||||
public int? Status { get; init; }
|
||||
public int? MessageType { get; init; }
|
||||
@@ -15,7 +15,7 @@ public record GetAllMessagesQuery : IRequest<GetAllMessagesResponse>
|
||||
public int PageSize { get; init; }
|
||||
}
|
||||
|
||||
public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, GetAllMessagesResponse>
|
||||
public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, BffProto.GetAllMessagesResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
|
||||
@@ -24,9 +24,9 @@ public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, G
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<GetAllMessagesResponse> Handle(GetAllMessagesQuery request, CancellationToken cancellationToken)
|
||||
public async Task<BffProto.GetAllMessagesResponse> Handle(GetAllMessagesQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
var cmsRequest = new GetAllMessagesRequest
|
||||
var cmsRequest = new CmsProto.GetAllMessagesRequest
|
||||
{
|
||||
PageNumber = request.PageNumber,
|
||||
PageSize = request.PageSize
|
||||
@@ -44,7 +44,7 @@ public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, G
|
||||
|
||||
var cmsResponse = await _context.PublicMessages.GetAllMessagesAsync(cmsRequest, cancellationToken: cancellationToken);
|
||||
|
||||
var result = new GetAllMessagesResponse
|
||||
var result = new BffProto.GetAllMessagesResponse
|
||||
{
|
||||
TotalCount = (int)cmsResponse.MetaData.TotalCount,
|
||||
PageNumber = request.PageNumber,
|
||||
@@ -53,7 +53,7 @@ public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, G
|
||||
|
||||
foreach (var message in cmsResponse.Messages)
|
||||
{
|
||||
result.Messages.Add(new AdminPublicMessageDto
|
||||
result.Messages.Add(new BffProto.AdminPublicMessageDto
|
||||
{
|
||||
MessageId = message.Id,
|
||||
Title = message.Title,
|
||||
|
||||
@@ -15,53 +15,3 @@ public class CancelOrderCommandValidator : AbstractValidator<CancelOrderCommand>
|
||||
.WithMessage("دلیل لغو سفارش الزامی است");
|
||||
}
|
||||
}
|
||||
|
||||
*** Add File: BackOffice.BFF/src/BackOffice.BFF.Application/UserOrderCQ/Commands/CancelOrder/CancelOrderCommandHandler.cs
|
||||
using BackOffice.BFF.Application.Common.Interfaces;
|
||||
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||
using CMSMicroservice.Protobuf.Protos.UserOrder;
|
||||
using MediatR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.CancelOrder;
|
||||
|
||||
public class CancelOrderCommandHandler : IRequestHandler<CancelOrderCommand, CancelOrderResponse>
|
||||
{
|
||||
private readonly IApplicationContractContext _context;
|
||||
private readonly ILogger<CancelOrderCommandHandler> _logger;
|
||||
|
||||
public CancelOrderCommandHandler(
|
||||
IApplicationContractContext context,
|
||||
ILogger<CancelOrderCommandHandler> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<CancelOrderResponse> Handle(CancelOrderCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
var grpcRequest = new CMSMicroservice.Protobuf.Protos.UserOrder.CancelOrderRequest
|
||||
{
|
||||
OrderId = request.OrderId,
|
||||
CancelReason = request.CancelReason ?? string.Empty,
|
||||
RefundPayment = request.RefundPayment
|
||||
};
|
||||
|
||||
var response = await _context.UserOrders.CancelOrderAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Cancelled order {OrderId}. Status={Status} RefundProcessed={RefundProcessed}",
|
||||
response.OrderId,
|
||||
response.Status,
|
||||
response.RefundProcessed);
|
||||
|
||||
return new CancelOrderResponse
|
||||
{
|
||||
OrderId = response.OrderId,
|
||||
Status = (int)response.Status,
|
||||
Message = response.Message,
|
||||
RefundProcessed = response.RefundProcessed
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,4 +43,8 @@ public class GetAllUserOrderByFilterResponseModel
|
||||
public string? UserNationalCode { get; set; }
|
||||
// روش پرداخت (0=IPG,1=Wallet)
|
||||
public int PaymentMethod { get; set; }
|
||||
// مبلغ مالیات بر ارزش افزوده (ریال)
|
||||
public long VatAmount { get; set; }
|
||||
// درصد مالیات بر ارزش افزوده (مثلاً 9 برای 9٪)
|
||||
public double VatPercentage { get; set; }
|
||||
}
|
||||
|
||||
@@ -36,6 +36,14 @@ public class GetUserOrderResponseDto
|
||||
public string? UserFullName { get; set; }
|
||||
// کدملی کاربر
|
||||
public string? UserNationalCode { get; set; }
|
||||
// مبلغ پایه (قبل از مالیات)
|
||||
public long VatBaseAmount { get; set; }
|
||||
// مبلغ مالیات بر ارزش افزوده (ریال)
|
||||
public long VatAmount { get; set; }
|
||||
// مبلغ نهایی (شامل مالیات)
|
||||
public long VatTotalAmount { get; set; }
|
||||
// درصد مالیات بر ارزش افزوده (مثلاً 9 برای 9٪)
|
||||
public double VatPercentage { get; set; }
|
||||
}
|
||||
|
||||
public class GetUserOrderResponseFactorDetail
|
||||
|
||||
Reference in New Issue
Block a user