feat: Implement User Package Status and User Order Management features
- Added GetUserPackageStatus functionality with mapping and service implementation. - Introduced UserOrder service methods for updating order status, applying discounts, and calculating order PV. - Created Protobuf definitions for public messages and user orders, including necessary request and response messages. - Implemented mapping profiles for package and user order related queries and commands. - Developed query handlers and validators for new commands and queries in the application layer. - Established PublicMessage service for handling public messages with appropriate gRPC endpoints.
This commit is contained in:
@@ -16,12 +16,14 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\BackOffice.BFF.Domain\BackOffice.BFF.Domain.csproj" />
|
<ProjectReference Include="..\BackOffice.BFF.Domain\BackOffice.BFF.Domain.csproj" />
|
||||||
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Package.Protobuf\BackOffice.BFF.Package.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.UserOrder.Protobuf\BackOffice.BFF.UserOrder.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.UserOrder.Protobuf\BackOffice.BFF.UserOrder.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Commission.Protobuf\BackOffice.BFF.Commission.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Commission.Protobuf\BackOffice.BFF.Commission.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.NetworkMembership.Protobuf\BackOffice.BFF.NetworkMembership.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.NetworkMembership.Protobuf\BackOffice.BFF.NetworkMembership.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.ClubMembership.Protobuf\BackOffice.BFF.ClubMembership.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.ClubMembership.Protobuf\BackOffice.BFF.ClubMembership.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Configuration.Protobuf\BackOffice.BFF.Configuration.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Configuration.Protobuf\BackOffice.BFF.Configuration.Protobuf.csproj" />
|
||||||
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Health.Protobuf\BackOffice.BFF.Health.Protobuf.csproj" />
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.Health.Protobuf\BackOffice.BFF.Health.Protobuf.csproj" />
|
||||||
|
<ProjectReference Include="..\Protobufs\BackOffice.BFF.PublicMessage.Protobuf\BackOffice.BFF.PublicMessage.Protobuf.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class CreateDiscountCategoryCommandHandler : IRequestHandler<CreateDiscou
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (request.ParentCategoryId.HasValue)
|
if (request.ParentCategoryId.HasValue)
|
||||||
createRequest.ParentCategoryId = new Int64Value { Value = request.ParentCategoryId.Value };
|
createRequest.ParentCategoryId = request.ParentCategoryId.Value ;
|
||||||
|
|
||||||
// Upload Image
|
// Upload Image
|
||||||
if (request.ImageFile != null && request.ImageFile.File != null && request.ImageFile.File.Length > 0)
|
if (request.ImageFile != null && request.ImageFile.File != null && request.ImageFile.File.Length > 0)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class UpdateDiscountCategoryCommandHandler : IRequestHandler<UpdateDiscou
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (request.ParentCategoryId.HasValue)
|
if (request.ParentCategoryId.HasValue)
|
||||||
updateRequest.ParentCategoryId = new Int64Value { Value = request.ParentCategoryId.Value };
|
updateRequest.ParentCategoryId =request.ParentCategoryId.Value ;
|
||||||
|
|
||||||
// Upload new Image if provided
|
// Upload new Image if provided
|
||||||
if (request.ImageFile != null && request.ImageFile.File != null && request.ImageFile.File.Length > 0)
|
if (request.ImageFile != null && request.ImageFile.File != null && request.ImageFile.File.Length > 0)
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ public class GetDiscountCategoriesQueryHandler : IRequestHandler<GetDiscountCate
|
|||||||
var grpcRequest = new GetDiscountCategoriesRequest();
|
var grpcRequest = new GetDiscountCategoriesRequest();
|
||||||
|
|
||||||
if (request.ParentCategoryId.HasValue)
|
if (request.ParentCategoryId.HasValue)
|
||||||
grpcRequest.ParentCategoryId = new Int64Value { Value = request.ParentCategoryId.Value };
|
grpcRequest.ParentCategoryId = request.ParentCategoryId.Value ;
|
||||||
|
|
||||||
if (request.IsActive.HasValue)
|
if (request.IsActive.HasValue)
|
||||||
grpcRequest.IsActive = new BoolValue { Value = request.IsActive.Value };
|
grpcRequest.IsActive = request.IsActive.Value ;
|
||||||
|
|
||||||
var response = await _context.DiscountCategories.GetDiscountCategoriesAsync(grpcRequest, cancellationToken: cancellationToken);
|
var response = await _context.DiscountCategories.GetDiscountCategoriesAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||||
|
|
||||||
@@ -37,9 +37,9 @@ public class GetDiscountCategoriesQueryHandler : IRequestHandler<GetDiscountCate
|
|||||||
Id = node.Id,
|
Id = node.Id,
|
||||||
Name = node.Name,
|
Name = node.Name,
|
||||||
Title = node.Title,
|
Title = node.Title,
|
||||||
Description = node.HasDescription ? node.Description.Value : string.Empty,
|
Description = string.IsNullOrWhiteSpace(node.Description) ? node.Description : string.Empty,
|
||||||
ImagePath = node.HasImagePath ? node.ImagePath.Value : string.Empty,
|
ImagePath =string.IsNullOrWhiteSpace(node.ImagePath)? node.ImagePath : string.Empty,
|
||||||
ParentCategoryId = node.HasParentCategoryId ? node.ParentCategoryId.Value : null,
|
ParentCategoryId = node.ParentCategoryId!=null? node.ParentCategoryId.Value : null,
|
||||||
SortOrder = node.SortOrder,
|
SortOrder = node.SortOrder,
|
||||||
IsActive = node.IsActive,
|
IsActive = node.IsActive,
|
||||||
ProductCount = node.ProductCount,
|
ProductCount = node.ProductCount,
|
||||||
|
|||||||
@@ -22,22 +22,22 @@ public class GetDiscountProductsQueryHandler : IRequestHandler<GetDiscountProduc
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (request.CategoryId.HasValue)
|
if (request.CategoryId.HasValue)
|
||||||
grpcRequest.CategoryId = new Int64Value { Value = request.CategoryId.Value };
|
grpcRequest.CategoryId = request.CategoryId.Value ;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(request.SearchQuery))
|
if (!string.IsNullOrWhiteSpace(request.SearchQuery))
|
||||||
grpcRequest.SearchQuery = new StringValue { Value = request.SearchQuery };
|
grpcRequest.SearchQuery = request.SearchQuery;
|
||||||
|
|
||||||
if (request.MinPrice.HasValue)
|
if (request.MinPrice.HasValue)
|
||||||
grpcRequest.MinPrice = new Int64Value { Value = request.MinPrice.Value };
|
grpcRequest.MinPrice = request.MinPrice.Value ;
|
||||||
|
|
||||||
if (request.MaxPrice.HasValue)
|
if (request.MaxPrice.HasValue)
|
||||||
grpcRequest.MaxPrice = new Int64Value { Value = request.MaxPrice.Value };
|
grpcRequest.MaxPrice = request.MaxPrice.Value ;
|
||||||
|
|
||||||
if (request.IsActive.HasValue)
|
if (request.IsActive.HasValue)
|
||||||
grpcRequest.IsActive = new BoolValue { Value = request.IsActive.Value };
|
grpcRequest.IsActive = request.IsActive.Value ;
|
||||||
|
|
||||||
if (request.InStock.HasValue)
|
if (request.InStock.HasValue)
|
||||||
grpcRequest.InStock = new BoolValue { Value = request.InStock.Value };
|
grpcRequest.InStock = request.InStock.Value ;
|
||||||
|
|
||||||
var response = await _context.DiscountProducts.GetDiscountProductsAsync(grpcRequest, cancellationToken: cancellationToken);
|
var response = await _context.DiscountProducts.GetDiscountProductsAsync(grpcRequest, cancellationToken: cancellationToken);
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ public class GetDiscountProductsQueryHandler : IRequestHandler<GetDiscountProduc
|
|||||||
MetaData = new MetaData
|
MetaData = new MetaData
|
||||||
{
|
{
|
||||||
CurrentPage = response.MetaData.CurrentPage,
|
CurrentPage = response.MetaData.CurrentPage,
|
||||||
TotalPage = response.MetaData.TotalPages,
|
TotalPage = response.MetaData.TotalPage,
|
||||||
PageSize = response.MetaData.PageSize,
|
PageSize = response.MetaData.PageSize,
|
||||||
TotalCount = response.MetaData.TotalCount,
|
TotalCount = response.MetaData.TotalCount,
|
||||||
HasPrevious = response.MetaData.HasPrevious,
|
HasPrevious = response.MetaData.HasPrevious,
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using BackOffice.BFF.Package.Protobuf.Protos.Package;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||||
|
|
||||||
|
public record GetUserPackageStatusQuery : IRequest<GetUserPackageStatusResponse>
|
||||||
|
{
|
||||||
|
public long UserId { get; init; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
using BackOffice.BFF.Package.Protobuf.Protos.Package;
|
||||||
|
using MediatR;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||||
|
|
||||||
|
public class GetUserPackageStatusQueryHandler : IRequestHandler<GetUserPackageStatusQuery, GetUserPackageStatusResponse>
|
||||||
|
{
|
||||||
|
private readonly PackageContract.PackageContractClient _packageClient;
|
||||||
|
private readonly ILogger<GetUserPackageStatusQueryHandler> _logger;
|
||||||
|
|
||||||
|
public GetUserPackageStatusQueryHandler(
|
||||||
|
PackageContract.PackageContractClient packageClient,
|
||||||
|
ILogger<GetUserPackageStatusQueryHandler> logger)
|
||||||
|
{
|
||||||
|
_packageClient = packageClient;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<GetUserPackageStatusResponse> Handle(GetUserPackageStatusQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: پیادهسازی GetUserPackageStatus
|
||||||
|
//
|
||||||
|
// 1. ایجاد gRPC Request:
|
||||||
|
// - var grpcRequest = new CMSMicroservice.Protobuf.Protos.Package.GetUserPackageStatusRequest {
|
||||||
|
// UserId = request.UserId
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// 2. فراخوانی CMS:
|
||||||
|
// - var response = await _packageClient.GetUserPackageStatusAsync(grpcRequest, cancellationToken: cancellationToken)
|
||||||
|
//
|
||||||
|
// 3. تبدیل به BFF Response:
|
||||||
|
// - return new GetUserPackageStatusResponse {
|
||||||
|
// UserId = response.UserId,
|
||||||
|
// PackagePurchaseMethod = response.PackagePurchaseMethod,
|
||||||
|
// HasPurchasedPackage = response.HasPurchasedPackage,
|
||||||
|
// IsClubMemberActive = response.IsClubMemberActive,
|
||||||
|
// WalletBalance = response.WalletBalance,
|
||||||
|
// DiscountBalance = response.DiscountBalance,
|
||||||
|
// CanActivateClubMembership = response.CanActivateClubMembership,
|
||||||
|
// LastOrderNumber = response.LastOrderNumber,
|
||||||
|
// LastPurchaseDate = response.LastPurchaseDate
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// 4. Log:
|
||||||
|
// - _logger.LogInformation("Retrieved package status for user {UserId}", request.UserId)
|
||||||
|
//
|
||||||
|
// نکته: این endpoint برای Admin است تا وضعیت کاربران را بررسی کند
|
||||||
|
|
||||||
|
throw new NotImplementedException("GetUserPackageStatus needs implementation");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||||
|
|
||||||
|
public class GetUserPackageStatusQueryValidator : AbstractValidator<GetUserPackageStatusQuery>
|
||||||
|
{
|
||||||
|
public GetUserPackageStatusQueryValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.UserId)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("شناسه کاربر باید بزرگتر از 0 باشد");
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep
Normal file
1
src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// Placeholder for PublicMessageCQ
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// TODO: PublicMessage Commands
|
||||||
|
// - CreatePublicMessage
|
||||||
|
// - UpdatePublicMessage
|
||||||
|
// - DeletePublicMessage
|
||||||
|
// - PublishMessage
|
||||||
|
// - ArchiveMessage
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// GetActiveMessages - Public view
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages;
|
||||||
|
|
||||||
|
public record GetActiveMessagesQuery : IRequest<object> // TODO: define response
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetActiveMessagesQueryHandler : IRequestHandler<GetActiveMessagesQuery, object>
|
||||||
|
{
|
||||||
|
public async Task<object> Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: gRPC call to CMS PublicMessageContract.GetActiveMessages
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// GetAllMessages - Admin view
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages;
|
||||||
|
|
||||||
|
public record GetAllMessagesQuery : IRequest<object> // TODO: define response
|
||||||
|
{
|
||||||
|
public int PageNumber { get; init; }
|
||||||
|
public int PageSize { get; init; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetAllMessagesQueryHandler : IRequestHandler<GetAllMessagesQuery, object>
|
||||||
|
{
|
||||||
|
public async Task<object> Handle(GetAllMessagesQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: gRPC call to CMS PublicMessageContract.GetAllMessages
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;
|
||||||
|
|
||||||
|
public record ApplyDiscountToOrderCommand : IRequest<ApplyDiscountToOrderResponse>
|
||||||
|
{
|
||||||
|
public long OrderId { get; init; }
|
||||||
|
public long DiscountAmount { get; init; }
|
||||||
|
public string Reason { get; init; } = string.Empty;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;
|
||||||
|
|
||||||
|
public class ApplyDiscountToOrderCommandHandler : IRequestHandler<ApplyDiscountToOrderCommand, ApplyDiscountToOrderResponse>
|
||||||
|
{
|
||||||
|
private readonly UserOrderContract.UserOrderContractClient _orderClient;
|
||||||
|
private readonly ILogger<ApplyDiscountToOrderCommandHandler> _logger;
|
||||||
|
|
||||||
|
public ApplyDiscountToOrderCommandHandler(
|
||||||
|
UserOrderContract.UserOrderContractClient orderClient,
|
||||||
|
ILogger<ApplyDiscountToOrderCommandHandler> logger)
|
||||||
|
{
|
||||||
|
_orderClient = orderClient;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ApplyDiscountToOrderResponse> Handle(ApplyDiscountToOrderCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: پیادهسازی ApplyDiscountToOrder
|
||||||
|
// 1. ایجاد gRPC Request و فراخوانی CMS
|
||||||
|
// 2. return response از CMS
|
||||||
|
throw new NotImplementedException("ApplyDiscountToOrder needs implementation");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;
|
||||||
|
|
||||||
|
public class ApplyDiscountToOrderCommandValidator : AbstractValidator<ApplyDiscountToOrderCommand>
|
||||||
|
{
|
||||||
|
public ApplyDiscountToOrderCommandValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.OrderId)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("شناسه سفارش باید بزرگتر از 0 باشد");
|
||||||
|
|
||||||
|
RuleFor(x => x.DiscountAmount)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("مبلغ تخفیف باید بزرگتر از 0 باشد");
|
||||||
|
|
||||||
|
RuleFor(x => x.Reason)
|
||||||
|
.NotEmpty()
|
||||||
|
.WithMessage("دلیل تخفیف الزامی است");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||||
|
|
||||||
|
public record UpdateOrderStatusCommand : IRequest<UpdateOrderStatusResponse>
|
||||||
|
{
|
||||||
|
public long OrderId { get; init; }
|
||||||
|
public int NewStatus { get; init; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||||
|
|
||||||
|
public class UpdateOrderStatusCommandHandler : IRequestHandler<UpdateOrderStatusCommand, UpdateOrderStatusResponse>
|
||||||
|
{
|
||||||
|
private readonly UserOrderContract.UserOrderContractClient _orderClient;
|
||||||
|
private readonly ILogger<UpdateOrderStatusCommandHandler> _logger;
|
||||||
|
|
||||||
|
public UpdateOrderStatusCommandHandler(
|
||||||
|
UserOrderContract.UserOrderContractClient orderClient,
|
||||||
|
ILogger<UpdateOrderStatusCommandHandler> logger)
|
||||||
|
{
|
||||||
|
_orderClient = orderClient;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<UpdateOrderStatusResponse> Handle(UpdateOrderStatusCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: پیادهسازی UpdateOrderStatus
|
||||||
|
// 1. ایجاد gRPC Request و فراخوانی CMS
|
||||||
|
// 2. return response از CMS
|
||||||
|
throw new NotImplementedException("UpdateOrderStatus needs implementation");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||||
|
|
||||||
|
public class UpdateOrderStatusCommandValidator : AbstractValidator<UpdateOrderStatusCommand>
|
||||||
|
{
|
||||||
|
public UpdateOrderStatusCommandValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.OrderId)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("شناسه سفارش باید بزرگتر از 0 باشد");
|
||||||
|
|
||||||
|
RuleFor(x => x.NewStatus)
|
||||||
|
.IsInEnum()
|
||||||
|
.WithMessage("وضعیت جدید معتبر نیست");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using CMSMicroservice.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV;
|
||||||
|
|
||||||
|
public record CalculateOrderPVQuery : IRequest<CalculateOrderPVResponse>
|
||||||
|
{
|
||||||
|
public long OrderId { get; init; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using CMSMicroservice.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
using UserOrderContract = BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder.UserOrderContract;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV;
|
||||||
|
|
||||||
|
public class CalculateOrderPVQueryHandler : IRequestHandler<CalculateOrderPVQuery, CalculateOrderPVResponse>
|
||||||
|
{
|
||||||
|
private readonly UserOrderContract.UserOrderContractClient _orderClient;
|
||||||
|
|
||||||
|
public CalculateOrderPVQueryHandler(UserOrderContract.UserOrderContractClient orderClient)
|
||||||
|
{
|
||||||
|
_orderClient = orderClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CalculateOrderPVResponse> Handle(CalculateOrderPVQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: پیادهسازی CalculateOrderPV
|
||||||
|
// 1. ایجاد gRPC Request و فراخوانی CMS
|
||||||
|
// 2. return response از CMS
|
||||||
|
throw new NotImplementedException("CalculateOrderPV needs implementation");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV;
|
||||||
|
|
||||||
|
public class CalculateOrderPVQueryValidator : AbstractValidator<CalculateOrderPVQuery>
|
||||||
|
{
|
||||||
|
public CalculateOrderPVQueryValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.OrderId)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("شناسه سفارش باید بزرگتر از 0 باشد");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange;
|
||||||
|
|
||||||
|
public record GetOrdersByDateRangeQuery : IRequest<GetOrdersByDateRangeResponse>
|
||||||
|
{
|
||||||
|
public DateTime StartDate { get; init; }
|
||||||
|
public DateTime EndDate { get; init; }
|
||||||
|
public int? Status { get; init; }
|
||||||
|
public long? UserId { get; init; }
|
||||||
|
public int PageNumber { get; init; }
|
||||||
|
public int PageSize { get; init; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange;
|
||||||
|
|
||||||
|
public class GetOrdersByDateRangeQueryValidator : AbstractValidator<GetOrdersByDateRangeQuery>
|
||||||
|
{
|
||||||
|
public GetOrdersByDateRangeQueryValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.StartDate)
|
||||||
|
.LessThanOrEqualTo(x => x.EndDate)
|
||||||
|
.WithMessage("تاریخ شروع باید قبل از تاریخ پایان باشد");
|
||||||
|
|
||||||
|
RuleFor(x => x.PageNumber)
|
||||||
|
.GreaterThan(0)
|
||||||
|
.WithMessage("شماره صفحه باید بزرگتر از 0 باشد");
|
||||||
|
|
||||||
|
RuleFor(x => x.PageSize)
|
||||||
|
.InclusiveBetween(1, 100)
|
||||||
|
.WithMessage("اندازه صفحه باید بین 1 تا 100 باشد");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange;
|
||||||
|
|
||||||
|
public class GetOrdersByDateRangeQueryHandler : IRequestHandler<GetOrdersByDateRangeQuery, GetOrdersByDateRangeResponse>
|
||||||
|
{
|
||||||
|
private readonly UserOrderContract.UserOrderContractClient _orderClient;
|
||||||
|
|
||||||
|
public GetOrdersByDateRangeQueryHandler(UserOrderContract.UserOrderContractClient orderClient)
|
||||||
|
{
|
||||||
|
_orderClient = orderClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<GetOrdersByDateRangeResponse> Handle(GetOrdersByDateRangeQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// TODO: پیادهسازی GetOrdersByDateRange
|
||||||
|
// 1. ایجاد gRPC Request و فراخوانی CMS
|
||||||
|
// 2. return response از CMS
|
||||||
|
throw new NotImplementedException("GetOrdersByDateRange needs implementation");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
|
using BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||||
|
using BackOffice.BFF.Package.Protobuf.Protos.Package;
|
||||||
|
|
||||||
namespace BackOffice.BFF.WebApi.Common.Mappings;
|
namespace BackOffice.BFF.WebApi.Common.Mappings;
|
||||||
|
|
||||||
public class PackageProfile : IRegister
|
public class PackageProfile : IRegister
|
||||||
{
|
{
|
||||||
void IRegister.Register(TypeAdapterConfig config)
|
void IRegister.Register(TypeAdapterConfig config)
|
||||||
{
|
{
|
||||||
//config.NewConfig<Source,Destination>()
|
// GetUserPackageStatus
|
||||||
// .Map(dest => dest.FullName, src => $"{src.Firstname} {src.Lastname}");
|
config.NewConfig<GetUserPackageStatusRequest, GetUserPackageStatusQuery>()
|
||||||
|
.Map(dest => dest.UserId, src => src.UserId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
namespace BackOffice.BFF.WebApi.Common.Mappings;
|
||||||
|
|
||||||
|
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||||
|
using BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages;
|
||||||
|
using BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages;
|
||||||
|
using Google.Protobuf.WellKnownTypes;
|
||||||
|
|
||||||
|
public class PublicMessageProfile : IRegister
|
||||||
|
{
|
||||||
|
void IRegister.Register(TypeAdapterConfig config)
|
||||||
|
{
|
||||||
|
// GetAllMessages mappings
|
||||||
|
config.NewConfig<GetAllMessagesRequest, GetAllMessagesQuery>()
|
||||||
|
.Map(dest => dest.Status, src => src.Status != null ? (int?)src.Status.Value : null)
|
||||||
|
.Map(dest => dest.MessageType, src => src.MessageType != null ? (int?)src.MessageType.Value : null)
|
||||||
|
.Map(dest => dest.PageNumber, src => src.PageNumber)
|
||||||
|
.Map(dest => dest.PageSize, src => src.PageSize);
|
||||||
|
|
||||||
|
config.NewConfig<GetAllMessagesQuery, GetAllMessagesResponse>()
|
||||||
|
.Map(dest => dest.Messages, src => src.Messages)
|
||||||
|
.Map(dest => dest.TotalCount, src => src.TotalCount)
|
||||||
|
.Map(dest => dest.PageNumber, src => src.PageNumber)
|
||||||
|
.Map(dest => dest.PageSize, src => src.PageSize);
|
||||||
|
|
||||||
|
config.NewConfig<AdminPublicMessageDto, AdminPublicMessageDto>()
|
||||||
|
.Map(dest => dest.MessageId, src => src.MessageId)
|
||||||
|
.Map(dest => dest.Title, src => src.Title)
|
||||||
|
.Map(dest => dest.Content, src => src.Content)
|
||||||
|
.Map(dest => dest.MessageType, src => src.MessageType)
|
||||||
|
.Map(dest => dest.MessageTypeName, src => src.MessageTypeName)
|
||||||
|
.Map(dest => dest.Priority, src => src.Priority)
|
||||||
|
.Map(dest => dest.PriorityName, src => src.PriorityName)
|
||||||
|
.Map(dest => dest.Status, src => src.Status)
|
||||||
|
.Map(dest => dest.StatusName, src => src.StatusName)
|
||||||
|
.Map(dest => dest.StartsAt, src => src.StartsAt.HasValue ? Timestamp.FromDateTime(src.StartsAt.Value.ToUniversalTime()) : null)
|
||||||
|
.Map(dest => dest.ExpiresAt, src => src.ExpiresAt.HasValue ? Timestamp.FromDateTime(src.ExpiresAt.Value.ToUniversalTime()) : null)
|
||||||
|
.Map(dest => dest.PublishedAt, src => src.PublishedAt.HasValue ? Timestamp.FromDateTime(src.PublishedAt.Value.ToUniversalTime()) : null)
|
||||||
|
.Map(dest => dest.ArchivedAt, src => src.ArchivedAt.HasValue ? Timestamp.FromDateTime(src.ArchivedAt.Value.ToUniversalTime()) : null)
|
||||||
|
.Map(dest => dest.IsDismissible, src => src.IsDismissible)
|
||||||
|
.Map(dest => dest.TargetAudience, src => src.TargetAudience)
|
||||||
|
.Map(dest => dest.Tags, src => src.Tags)
|
||||||
|
.Map(dest => dest.Created, src => Timestamp.FromDateTime(src.Created.ToUniversalTime()))
|
||||||
|
.Map(dest => dest.LastModified, src => Timestamp.FromDateTime(src.LastModified.ToUniversalTime()));
|
||||||
|
|
||||||
|
// GetActiveMessages mappings
|
||||||
|
config.NewConfig<GetActiveMessagesRequest, GetActiveMessagesQuery>()
|
||||||
|
.Map(dest => dest.MessageType, src => src.MessageType != null ? (int?)src.MessageType.Value : null)
|
||||||
|
.Map(dest => dest.TargetAudience, src => src.TargetAudience);
|
||||||
|
|
||||||
|
config.NewConfig<GetActiveMessagesQuery, GetActiveMessagesResponse>()
|
||||||
|
.Map(dest => dest.Messages, src => src.Messages);
|
||||||
|
|
||||||
|
config.NewConfig<PublicMessageDto, PublicMessageDto>()
|
||||||
|
.Map(dest => dest.MessageId, src => src.MessageId)
|
||||||
|
.Map(dest => dest.Title, src => src.Title)
|
||||||
|
.Map(dest => dest.Content, src => src.Content)
|
||||||
|
.Map(dest => dest.MessageType, src => src.MessageType)
|
||||||
|
.Map(dest => dest.MessageTypeName, src => src.MessageTypeName)
|
||||||
|
.Map(dest => dest.Priority, src => src.Priority)
|
||||||
|
.Map(dest => dest.PriorityName, src => src.PriorityName)
|
||||||
|
.Map(dest => dest.StartsAt, src => Timestamp.FromDateTime(src.StartsAt.ToUniversalTime()))
|
||||||
|
.Map(dest => dest.ExpiresAt, src => Timestamp.FromDateTime(src.ExpiresAt.ToUniversalTime()))
|
||||||
|
.Map(dest => dest.IsDismissible, src => src.IsDismissible)
|
||||||
|
.Map(dest => dest.Tags, src => src.Tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,79 @@
|
|||||||
namespace BackOffice.BFF.WebApi.Common.Mappings;
|
namespace BackOffice.BFF.WebApi.Common.Mappings;
|
||||||
|
|
||||||
|
using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV;
|
||||||
|
using Google.Protobuf.WellKnownTypes;
|
||||||
|
|
||||||
public class UserOrderProfile : IRegister
|
public class UserOrderProfile : IRegister
|
||||||
{
|
{
|
||||||
void IRegister.Register(TypeAdapterConfig config)
|
void IRegister.Register(TypeAdapterConfig config)
|
||||||
{
|
{
|
||||||
//config.NewConfig<Source,Destination>()
|
// UpdateOrderStatus mappings
|
||||||
// .Map(dest => dest.FullName, src => $"{src.Firstname} {src.Lastname}");
|
config.NewConfig<UpdateOrderStatusRequest, UpdateOrderStatusCommand>()
|
||||||
|
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||||
|
.Map(dest => dest.NewStatus, src => src.NewStatus);
|
||||||
|
|
||||||
|
config.NewConfig<UpdateOrderStatusCommand, UpdateOrderStatusResponse>()
|
||||||
|
.Map(dest => dest.Success, src => src.Success)
|
||||||
|
.Map(dest => dest.Message, src => src.Message)
|
||||||
|
.Map(dest => dest.OldStatus, src => src.OldStatus)
|
||||||
|
.Map(dest => dest.NewStatus, src => src.NewStatus);
|
||||||
|
|
||||||
|
// GetOrdersByDateRange mappings
|
||||||
|
config.NewConfig<GetOrdersByDateRangeRequest, GetOrdersByDateRangeQuery>()
|
||||||
|
.Map(dest => dest.StartDate, src => src.StartDate.ToDateTime())
|
||||||
|
.Map(dest => dest.EndDate, src => src.EndDate.ToDateTime())
|
||||||
|
.Map(dest => dest.Status, src => src.Status != null ? (int?)src.Status.Value : null)
|
||||||
|
.Map(dest => dest.UserId, src => src.UserId != null ? (long?)src.UserId.Value : null)
|
||||||
|
.Map(dest => dest.PageNumber, src => src.PageNumber)
|
||||||
|
.Map(dest => dest.PageSize, src => src.PageSize);
|
||||||
|
|
||||||
|
config.NewConfig<GetOrdersByDateRangeQuery, GetOrdersByDateRangeResponse>()
|
||||||
|
.Map(dest => dest.MetaData, src => src.MetaData)
|
||||||
|
.Map(dest => dest.Orders, src => src.Orders);
|
||||||
|
|
||||||
|
config.NewConfig<OrderSummaryDto, OrderSummaryDto>()
|
||||||
|
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||||
|
.Map(dest => dest.OrderNumber, src => src.OrderNumber)
|
||||||
|
.Map(dest => dest.UserId, src => src.UserId)
|
||||||
|
.Map(dest => dest.UserFullName, src => src.UserFullName)
|
||||||
|
.Map(dest => dest.TotalAmount, src => src.TotalAmount)
|
||||||
|
.Map(dest => dest.Status, src => src.Status)
|
||||||
|
.Map(dest => dest.StatusName, src => src.StatusName)
|
||||||
|
.Map(dest => dest.ItemsCount, src => src.ItemsCount)
|
||||||
|
.Map(dest => dest.CreatedAt, src => Timestamp.FromDateTime(src.CreatedAt.ToUniversalTime()));
|
||||||
|
|
||||||
|
// ApplyDiscountToOrder mappings
|
||||||
|
config.NewConfig<ApplyDiscountToOrderRequest, ApplyDiscountToOrderCommand>()
|
||||||
|
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||||
|
.Map(dest => dest.DiscountAmount, src => src.DiscountAmount)
|
||||||
|
.Map(dest => dest.Reason, src => src.Reason);
|
||||||
|
|
||||||
|
config.NewConfig<ApplyDiscountToOrderCommand, ApplyDiscountToOrderResponse>()
|
||||||
|
.Map(dest => dest.Success, src => src.Success)
|
||||||
|
.Map(dest => dest.Message, src => src.Message)
|
||||||
|
.Map(dest => dest.OriginalAmount, src => src.OriginalAmount)
|
||||||
|
.Map(dest => dest.DiscountAmount, src => src.DiscountAmount)
|
||||||
|
.Map(dest => dest.FinalAmount, src => src.FinalAmount);
|
||||||
|
|
||||||
|
// CalculateOrderPV mappings
|
||||||
|
config.NewConfig<CalculateOrderPVRequest, CalculateOrderPVQuery>()
|
||||||
|
.Map(dest => dest.OrderId, src => src.OrderId);
|
||||||
|
|
||||||
|
config.NewConfig<CalculateOrderPVQuery, CalculateOrderPVResponse>()
|
||||||
|
.Map(dest => dest.OrderId, src => src.OrderId)
|
||||||
|
.Map(dest => dest.TotalPv, src => src.TotalPV)
|
||||||
|
.Map(dest => dest.Products, src => src.Products);
|
||||||
|
|
||||||
|
config.NewConfig<ProductPVDto, ProductPVDto>()
|
||||||
|
.Map(dest => dest.ProductId, src => src.ProductId)
|
||||||
|
.Map(dest => dest.ProductTitle, src => src.ProductTitle)
|
||||||
|
.Map(dest => dest.Quantity, src => src.Quantity)
|
||||||
|
.Map(dest => dest.UnitPv, src => src.UnitPV)
|
||||||
|
.Map(dest => dest.TotalPv, src => src.TotalPV);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using BackOffice.BFF.Application.PackageCQ.Commands.UpdatePackage;
|
|||||||
using BackOffice.BFF.Application.PackageCQ.Commands.DeletePackage;
|
using BackOffice.BFF.Application.PackageCQ.Commands.DeletePackage;
|
||||||
using BackOffice.BFF.Application.PackageCQ.Queries.GetPackage;
|
using BackOffice.BFF.Application.PackageCQ.Queries.GetPackage;
|
||||||
using BackOffice.BFF.Application.PackageCQ.Queries.GetAllPackageByFilter;
|
using BackOffice.BFF.Application.PackageCQ.Queries.GetAllPackageByFilter;
|
||||||
|
using BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus;
|
||||||
namespace BackOffice.BFF.WebApi.Services;
|
namespace BackOffice.BFF.WebApi.Services;
|
||||||
public class PackageService : PackageContract.PackageContractBase
|
public class PackageService : PackageContract.PackageContractBase
|
||||||
{
|
{
|
||||||
@@ -34,4 +35,9 @@ public class PackageService : PackageContract.PackageContractBase
|
|||||||
{
|
{
|
||||||
return await _dispatchRequestToCQRS.Handle<GetAllPackageByFilterRequest, GetAllPackageByFilterQuery, GetAllPackageByFilterResponse>(request, context);
|
return await _dispatchRequestToCQRS.Handle<GetAllPackageByFilterRequest, GetAllPackageByFilterQuery, GetAllPackageByFilterResponse>(request, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override async Task<GetUserPackageStatusResponse> GetUserPackageStatus(GetUserPackageStatusRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<GetUserPackageStatusRequest, GetUserPackageStatusQuery, GetUserPackageStatusResponse>(request, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
26
src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs
Normal file
26
src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using BackOffice.BFF.PublicMessage.Protobuf;
|
||||||
|
using BackOffice.BFF.WebApi.Common.Services;
|
||||||
|
using BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages;
|
||||||
|
using BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages;
|
||||||
|
|
||||||
|
namespace BackOffice.BFF.WebApi.Services;
|
||||||
|
|
||||||
|
public class PublicMessageService : PublicMessageContract.PublicMessageContractBase
|
||||||
|
{
|
||||||
|
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
|
||||||
|
|
||||||
|
public PublicMessageService(IDispatchRequestToCQRS dispatchRequestToCQRS)
|
||||||
|
{
|
||||||
|
_dispatchRequestToCQRS = dispatchRequestToCQRS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<GetAllMessagesResponse> GetAllMessages(GetAllMessagesRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<GetAllMessagesRequest, GetAllMessagesQuery, GetAllMessagesResponse>(request, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<GetActiveMessagesResponse> GetActiveMessages(GetActiveMessagesRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<GetActiveMessagesRequest, GetActiveMessagesQuery, GetActiveMessagesResponse>(request, context);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,10 @@ using BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateUserOrder;
|
|||||||
using BackOffice.BFF.Application.UserOrderCQ.Commands.DeleteUserOrder;
|
using BackOffice.BFF.Application.UserOrderCQ.Commands.DeleteUserOrder;
|
||||||
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetUserOrder;
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetUserOrder;
|
||||||
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetAllUserOrderByFilter;
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetAllUserOrderByFilter;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange;
|
||||||
|
using BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV;
|
||||||
namespace BackOffice.BFF.WebApi.Services;
|
namespace BackOffice.BFF.WebApi.Services;
|
||||||
public class UserOrderService : UserOrderContract.UserOrderContractBase
|
public class UserOrderService : UserOrderContract.UserOrderContractBase
|
||||||
{
|
{
|
||||||
@@ -34,4 +38,24 @@ public class UserOrderService : UserOrderContract.UserOrderContractBase
|
|||||||
{
|
{
|
||||||
return await _dispatchRequestToCQRS.Handle<GetAllUserOrderByFilterRequest, GetAllUserOrderByFilterQuery, GetAllUserOrderByFilterResponse>(request, context);
|
return await _dispatchRequestToCQRS.Handle<GetAllUserOrderByFilterRequest, GetAllUserOrderByFilterQuery, GetAllUserOrderByFilterResponse>(request, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override async Task<UpdateOrderStatusResponse> UpdateOrderStatus(UpdateOrderStatusRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<UpdateOrderStatusRequest, UpdateOrderStatusCommand, UpdateOrderStatusResponse>(request, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<GetOrdersByDateRangeResponse> GetOrdersByDateRange(GetOrdersByDateRangeRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<GetOrdersByDateRangeRequest, GetOrdersByDateRangeQuery, GetOrdersByDateRangeResponse>(request, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<ApplyDiscountToOrderResponse> ApplyDiscountToOrder(ApplyDiscountToOrderRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<ApplyDiscountToOrderRequest, ApplyDiscountToOrderCommand, ApplyDiscountToOrderResponse>(request, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<CalculateOrderPVResponse> CalculateOrderPV(CalculateOrderPVRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<CalculateOrderPVRequest, CalculateOrderPVQuery, CalculateOrderPVResponse>(request, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,13 @@ service PackageContract
|
|||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Package Purchase System (Admin endpoints)
|
||||||
|
rpc GetUserPackageStatus(GetUserPackageStatusRequest) returns (GetUserPackageStatusResponse){
|
||||||
|
option (google.api.http) = {
|
||||||
|
get: "/GetUserPackageStatus"
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
message CreateNewPackageRequest
|
message CreateNewPackageRequest
|
||||||
{
|
{
|
||||||
@@ -113,6 +120,25 @@ message GetAllPackageByFilterResponseModel
|
|||||||
int64 price = 5;
|
int64 price = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Package Purchase Messages
|
||||||
|
message GetUserPackageStatusRequest
|
||||||
|
{
|
||||||
|
int64 user_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetUserPackageStatusResponse
|
||||||
|
{
|
||||||
|
int64 user_id = 1;
|
||||||
|
string package_purchase_method = 2;
|
||||||
|
bool has_purchased_package = 3;
|
||||||
|
bool is_club_member_active = 4;
|
||||||
|
int64 wallet_balance = 5;
|
||||||
|
int64 discount_balance = 6;
|
||||||
|
bool can_activate_club_membership = 7;
|
||||||
|
google.protobuf.StringValue last_order_number = 8;
|
||||||
|
google.protobuf.Timestamp last_purchase_date = 9;
|
||||||
|
}
|
||||||
|
|
||||||
message PaginationState
|
message PaginationState
|
||||||
{
|
{
|
||||||
int32 page_number = 1;
|
int32 page_number = 1;
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>disable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Google.Protobuf" Version="3.28.3" />
|
||||||
|
<PackageReference Include="Grpc.Net.Client" Version="2.68.0" />
|
||||||
|
<PackageReference Include="Grpc.Tools" Version="2.68.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Protobuf Include="Protos\public_messages.proto" GrpcServices="Client" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
import "google/protobuf/wrappers.proto";
|
||||||
|
|
||||||
|
option csharp_namespace = "BackOffice.BFF.PublicMessage.Protobuf";
|
||||||
|
|
||||||
|
package publicmessages;
|
||||||
|
|
||||||
|
service PublicMessageContract
|
||||||
|
{
|
||||||
|
rpc CreatePublicMessage(CreatePublicMessageRequest) returns (CreatePublicMessageResponse);
|
||||||
|
rpc UpdatePublicMessage(UpdatePublicMessageRequest) returns (UpdatePublicMessageRequest);
|
||||||
|
rpc DeletePublicMessage(DeletePublicMessageRequest) returns (DeletePublicMessageRequest);
|
||||||
|
rpc PublishMessage(PublishMessageRequest) returns (PublishMessageResponse);
|
||||||
|
rpc ArchiveMessage(ArchiveMessageRequest) returns (ArchiveMessageResponse);
|
||||||
|
rpc GetAllMessages(GetAllMessagesRequest) returns (GetAllMessagesResponse);
|
||||||
|
rpc GetActiveMessages(GetActiveMessagesRequest) returns (GetActiveMessagesResponse);
|
||||||
|
rpc GetPublicMessage(GetPublicMessageRequest) returns (GetPublicMessageResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Public Message
|
||||||
|
message CreatePublicMessageRequest
|
||||||
|
{
|
||||||
|
string title = 1;
|
||||||
|
string content = 2;
|
||||||
|
int32 message_type = 3;
|
||||||
|
int32 priority = 4;
|
||||||
|
google.protobuf.Timestamp starts_at = 5;
|
||||||
|
google.protobuf.Timestamp expires_at = 6;
|
||||||
|
bool is_dismissible = 7;
|
||||||
|
string target_audience = 8;
|
||||||
|
repeated string tags = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CreatePublicMessageResponse
|
||||||
|
{
|
||||||
|
bool success = 1;
|
||||||
|
string message = 2;
|
||||||
|
int64 message_id = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update Public Message
|
||||||
|
message UpdatePublicMessageRequest
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
string title = 2;
|
||||||
|
string content = 3;
|
||||||
|
int32 message_type = 4;
|
||||||
|
int32 priority = 5;
|
||||||
|
google.protobuf.Timestamp starts_at = 6;
|
||||||
|
google.protobuf.Timestamp expires_at = 7;
|
||||||
|
bool is_dismissible = 8;
|
||||||
|
string target_audience = 9;
|
||||||
|
repeated string tags = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete Public Message
|
||||||
|
message DeletePublicMessageRequest
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Publish Message
|
||||||
|
message PublishMessageRequest
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message PublishMessageResponse
|
||||||
|
{
|
||||||
|
bool success = 1;
|
||||||
|
string message = 2;
|
||||||
|
google.protobuf.Timestamp published_at = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Archive Message
|
||||||
|
message ArchiveMessageRequest
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ArchiveMessageResponse
|
||||||
|
{
|
||||||
|
bool success = 1;
|
||||||
|
string message = 2;
|
||||||
|
google.protobuf.Timestamp archived_at = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get All Messages (Admin view)
|
||||||
|
message GetAllMessagesRequest
|
||||||
|
{
|
||||||
|
google.protobuf.Int32Value status = 1;
|
||||||
|
google.protobuf.Int32Value message_type = 2;
|
||||||
|
int32 page_number = 3;
|
||||||
|
int32 page_size = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetAllMessagesResponse
|
||||||
|
{
|
||||||
|
repeated AdminPublicMessageDto messages = 1;
|
||||||
|
int32 total_count = 2;
|
||||||
|
int32 page_number = 3;
|
||||||
|
int32 page_size = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AdminPublicMessageDto
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
string title = 2;
|
||||||
|
string content = 3;
|
||||||
|
int32 message_type = 4;
|
||||||
|
string message_type_name = 5;
|
||||||
|
int32 priority = 6;
|
||||||
|
string priority_name = 7;
|
||||||
|
int32 status = 8;
|
||||||
|
string status_name = 9;
|
||||||
|
google.protobuf.Timestamp starts_at = 10;
|
||||||
|
google.protobuf.Timestamp expires_at = 11;
|
||||||
|
google.protobuf.Timestamp published_at = 12;
|
||||||
|
google.protobuf.Timestamp archived_at = 13;
|
||||||
|
bool is_dismissible = 14;
|
||||||
|
string target_audience = 15;
|
||||||
|
repeated string tags = 16;
|
||||||
|
google.protobuf.Timestamp created = 17;
|
||||||
|
google.protobuf.Timestamp last_modified = 18;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Active Messages (Frontend view)
|
||||||
|
message GetActiveMessagesRequest
|
||||||
|
{
|
||||||
|
google.protobuf.Int32Value message_type = 1;
|
||||||
|
string target_audience = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetActiveMessagesResponse
|
||||||
|
{
|
||||||
|
repeated PublicMessageDto messages = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message PublicMessageDto
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
string title = 2;
|
||||||
|
string content = 3;
|
||||||
|
int32 message_type = 4;
|
||||||
|
string message_type_name = 5;
|
||||||
|
int32 priority = 6;
|
||||||
|
string priority_name = 7;
|
||||||
|
google.protobuf.Timestamp starts_at = 8;
|
||||||
|
google.protobuf.Timestamp expires_at = 9;
|
||||||
|
bool is_dismissible = 10;
|
||||||
|
repeated string tags = 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Single Public Message
|
||||||
|
message GetPublicMessageRequest
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetPublicMessageResponse
|
||||||
|
{
|
||||||
|
int64 message_id = 1;
|
||||||
|
string title = 2;
|
||||||
|
string content = 3;
|
||||||
|
int32 message_type = 4;
|
||||||
|
string message_type_name = 5;
|
||||||
|
int32 priority = 6;
|
||||||
|
string priority_name = 7;
|
||||||
|
int32 status = 8;
|
||||||
|
string status_name = 9;
|
||||||
|
google.protobuf.Timestamp starts_at = 10;
|
||||||
|
google.protobuf.Timestamp expires_at = 11;
|
||||||
|
google.protobuf.Timestamp published_at = 12;
|
||||||
|
google.protobuf.Timestamp archived_at = 13;
|
||||||
|
bool is_dismissible = 14;
|
||||||
|
string target_audience = 15;
|
||||||
|
repeated string tags = 16;
|
||||||
|
google.protobuf.Timestamp created = 17;
|
||||||
|
google.protobuf.Timestamp last_modified = 18;
|
||||||
|
}
|
||||||
@@ -62,6 +62,30 @@ service UserOrderContract
|
|||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Order Management
|
||||||
|
rpc UpdateOrderStatus(UpdateOrderStatusRequest) returns (UpdateOrderStatusResponse){
|
||||||
|
option (google.api.http) = {
|
||||||
|
post: "/UpdateOrderStatus"
|
||||||
|
body: "*"
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rpc GetOrdersByDateRange(GetOrdersByDateRangeRequest) returns (GetOrdersByDateRangeResponse){
|
||||||
|
option (google.api.http) = {
|
||||||
|
get: "/GetOrdersByDateRange"
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rpc ApplyDiscountToOrder(ApplyDiscountToOrderRequest) returns (ApplyDiscountToOrderResponse){
|
||||||
|
option (google.api.http) = {
|
||||||
|
post: "/ApplyDiscountToOrder"
|
||||||
|
body: "*"
|
||||||
|
};
|
||||||
|
};
|
||||||
|
rpc CalculateOrderPV(CalculateOrderPVRequest) returns (CalculateOrderPVResponse){
|
||||||
|
option (google.api.http) = {
|
||||||
|
get: "/CalculateOrderPV"
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
message CreateNewUserOrderRequest
|
message CreateNewUserOrderRequest
|
||||||
{
|
{
|
||||||
@@ -229,6 +253,88 @@ message MetaData
|
|||||||
|
|
||||||
bool has_next = 6;
|
bool has_next = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Order Management Messages
|
||||||
|
message UpdateOrderStatusRequest
|
||||||
|
{
|
||||||
|
int64 order_id = 1;
|
||||||
|
int32 new_status = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UpdateOrderStatusResponse
|
||||||
|
{
|
||||||
|
bool success = 1;
|
||||||
|
string message = 2;
|
||||||
|
int32 old_status = 3;
|
||||||
|
int32 new_status = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetOrdersByDateRangeRequest
|
||||||
|
{
|
||||||
|
google.protobuf.Timestamp start_date = 1;
|
||||||
|
google.protobuf.Timestamp end_date = 2;
|
||||||
|
google.protobuf.Int32Value status = 3;
|
||||||
|
google.protobuf.Int64Value user_id = 4;
|
||||||
|
int32 page_number = 5;
|
||||||
|
int32 page_size = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetOrdersByDateRangeResponse
|
||||||
|
{
|
||||||
|
MetaData meta_data = 1;
|
||||||
|
repeated OrderSummaryDto orders = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message OrderSummaryDto
|
||||||
|
{
|
||||||
|
int64 order_id = 1;
|
||||||
|
string order_number = 2;
|
||||||
|
int64 user_id = 3;
|
||||||
|
string user_full_name = 4;
|
||||||
|
int64 total_amount = 5;
|
||||||
|
int32 status = 6;
|
||||||
|
string status_name = 7;
|
||||||
|
int32 items_count = 8;
|
||||||
|
google.protobuf.Timestamp created_at = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ApplyDiscountToOrderRequest
|
||||||
|
{
|
||||||
|
int64 order_id = 1;
|
||||||
|
int64 discount_amount = 2;
|
||||||
|
string reason = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ApplyDiscountToOrderResponse
|
||||||
|
{
|
||||||
|
bool success = 1;
|
||||||
|
string message = 2;
|
||||||
|
int64 original_amount = 3;
|
||||||
|
int64 discount_amount = 4;
|
||||||
|
int64 final_amount = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CalculateOrderPVRequest
|
||||||
|
{
|
||||||
|
int64 order_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CalculateOrderPVResponse
|
||||||
|
{
|
||||||
|
int64 order_id = 1;
|
||||||
|
int64 total_pv = 2;
|
||||||
|
repeated ProductPVDto products = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ProductPVDto
|
||||||
|
{
|
||||||
|
int64 product_id = 1;
|
||||||
|
string product_title = 2;
|
||||||
|
int32 quantity = 3;
|
||||||
|
int64 unit_pv = 4;
|
||||||
|
int64 total_pv = 5;
|
||||||
|
}
|
||||||
|
|
||||||
message DecimalValue
|
message DecimalValue
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user