From 4b6f8187e5f82710c3ab7dde92b85e86f5aaf646 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Thu, 4 Dec 2025 03:43:28 +0330 Subject: [PATCH] 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. --- .../BackOffice.BFF.Application.csproj | 2 + .../CreateDiscountCategoryCommandHandler.cs | 2 +- .../UpdateDiscountCategoryCommandHandler.cs | 2 +- .../GetDiscountCategoriesQueryHandler.cs | 10 +- .../GetDiscountProductsQueryHandler.cs | 14 +- .../GetUserPackageStatusQuery.cs | 9 + .../GetUserPackageStatusQueryHandler.cs | 52 +++++ .../GetUserPackageStatusQueryValidator.cs | 13 ++ .../PublicMessageCQ/.gitkeep | 1 + .../PublicMessageCQ/Commands/README.md | 6 + .../GetActiveMessagesQuery.cs | 17 ++ .../GetAllMessages/GetAllMessagesQuery.cs | 19 ++ .../ApplyDiscountToOrderCommand.cs | 11 ++ .../ApplyDiscountToOrderCommandHandler.cs | 27 +++ .../ApplyDiscountToOrderCommandValidator.cs | 21 ++ .../UpdateOrderStatusCommand.cs | 10 + .../UpdateOrderStatusCommandHandler.cs | 27 +++ .../UpdateOrderStatusCommandValidator.cs | 17 ++ .../CalculateOrderPV/CalculateOrderPVQuery.cs | 10 + .../CalculateOrderPVQueryHandler.cs | 23 +++ .../CalculateOrderPVQueryValidator.cs | 13 ++ .../GetOrdersByDateRangeQuery.cs | 14 ++ .../GetOrdersByDateRangeQueryHandler.cs | 21 ++ .../GetOrdersByDateRangeQueryValidator.cs | 22 +++ .../Common/Mappings/PackageProfile.cs | 8 +- .../Common/Mappings/PublicMessageProfile.cs | 66 +++++++ .../Common/Mappings/UserOrderProfile.cs | 73 ++++++- .../Services/PackageService.cs | 6 + .../Services/PublicMessageService.cs | 26 +++ .../Services/UserOrderService.cs | 24 +++ .../Protos/package.proto | 26 +++ ...ckOffice.BFF.PublicMessage.Protobuf.csproj | 22 +++ .../Protos/public_messages.proto | 182 ++++++++++++++++++ .../Protos/userorder.proto | 106 ++++++++++ 34 files changed, 884 insertions(+), 18 deletions(-) create mode 100644 src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQuery.cs create mode 100644 src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs create mode 100644 src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryValidator.cs create mode 100644 src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep create mode 100644 src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md create mode 100644 src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs create mode 100644 src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommand.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandValidator.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommand.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandValidator.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQuery.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryValidator.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQuery.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryHandler.cs create mode 100644 src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs create mode 100644 src/BackOffice.BFF.WebApi/Common/Mappings/PublicMessageProfile.cs create mode 100644 src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs create mode 100644 src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj create mode 100644 src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/Protos/public_messages.proto diff --git a/src/BackOffice.BFF.Application/BackOffice.BFF.Application.csproj b/src/BackOffice.BFF.Application/BackOffice.BFF.Application.csproj index 0bb478b..792b1b6 100644 --- a/src/BackOffice.BFF.Application/BackOffice.BFF.Application.csproj +++ b/src/BackOffice.BFF.Application/BackOffice.BFF.Application.csproj @@ -16,12 +16,14 @@ + + diff --git a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/CreateDiscountCategory/CreateDiscountCategoryCommandHandler.cs b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/CreateDiscountCategory/CreateDiscountCategoryCommandHandler.cs index d2d28cf..c1a47cc 100644 --- a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/CreateDiscountCategory/CreateDiscountCategoryCommandHandler.cs +++ b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/CreateDiscountCategory/CreateDiscountCategoryCommandHandler.cs @@ -25,7 +25,7 @@ public class CreateDiscountCategoryCommandHandler : IRequestHandler 0) diff --git a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/UpdateDiscountCategory/UpdateDiscountCategoryCommandHandler.cs b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/UpdateDiscountCategory/UpdateDiscountCategoryCommandHandler.cs index 42b2fd2..d3c378b 100644 --- a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/UpdateDiscountCategory/UpdateDiscountCategoryCommandHandler.cs +++ b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Commands/UpdateDiscountCategory/UpdateDiscountCategoryCommandHandler.cs @@ -26,7 +26,7 @@ public class UpdateDiscountCategoryCommandHandler : IRequestHandler 0) diff --git a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Queries/GetDiscountCategories/GetDiscountCategoriesQueryHandler.cs b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Queries/GetDiscountCategories/GetDiscountCategoriesQueryHandler.cs index c805683..e0230b8 100644 --- a/src/BackOffice.BFF.Application/DiscountCategoryCQ/Queries/GetDiscountCategories/GetDiscountCategoriesQueryHandler.cs +++ b/src/BackOffice.BFF.Application/DiscountCategoryCQ/Queries/GetDiscountCategories/GetDiscountCategoriesQueryHandler.cs @@ -17,10 +17,10 @@ public class GetDiscountCategoriesQueryHandler : IRequestHandler +{ + public long UserId { get; init; } +} diff --git a/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs new file mode 100644 index 0000000..448b93b --- /dev/null +++ b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs @@ -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 +{ + private readonly PackageContract.PackageContractClient _packageClient; + private readonly ILogger _logger; + + public GetUserPackageStatusQueryHandler( + PackageContract.PackageContractClient packageClient, + ILogger logger) + { + _packageClient = packageClient; + _logger = logger; + } + + public async Task 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"); + } +} diff --git a/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryValidator.cs b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryValidator.cs new file mode 100644 index 0000000..eb8c408 --- /dev/null +++ b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryValidator.cs @@ -0,0 +1,13 @@ +using FluentValidation; + +namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus; + +public class GetUserPackageStatusQueryValidator : AbstractValidator +{ + public GetUserPackageStatusQueryValidator() + { + RuleFor(x => x.UserId) + .GreaterThan(0) + .WithMessage("شناسه کاربر باید بزرگتر از 0 باشد"); + } +} diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep b/src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep new file mode 100644 index 0000000..e42c885 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/.gitkeep @@ -0,0 +1 @@ +// Placeholder for PublicMessageCQ diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md new file mode 100644 index 0000000..97e9e3f --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md @@ -0,0 +1,6 @@ +// TODO: PublicMessage Commands +// - CreatePublicMessage +// - UpdatePublicMessage +// - DeletePublicMessage +// - PublishMessage +// - ArchiveMessage diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs new file mode 100644 index 0000000..c1df59b --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs @@ -0,0 +1,17 @@ +// GetActiveMessages - Public view +using MediatR; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages; + +public record GetActiveMessagesQuery : IRequest // TODO: define response +{ +} + +public class GetActiveMessagesQueryHandler : IRequestHandler +{ + public async Task Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken) + { + // TODO: gRPC call to CMS PublicMessageContract.GetActiveMessages + throw new NotImplementedException(); + } +} diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs new file mode 100644 index 0000000..0c970e2 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs @@ -0,0 +1,19 @@ +// GetAllMessages - Admin view +using MediatR; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages; + +public record GetAllMessagesQuery : IRequest // TODO: define response +{ + public int PageNumber { get; init; } + public int PageSize { get; init; } +} + +public class GetAllMessagesQueryHandler : IRequestHandler +{ + public async Task Handle(GetAllMessagesQuery request, CancellationToken cancellationToken) + { + // TODO: gRPC call to CMS PublicMessageContract.GetAllMessages + throw new NotImplementedException(); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommand.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommand.cs new file mode 100644 index 0000000..c92d82d --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommand.cs @@ -0,0 +1,11 @@ +using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using MediatR; + +namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder; + +public record ApplyDiscountToOrderCommand : IRequest +{ + public long OrderId { get; init; } + public long DiscountAmount { get; init; } + public string Reason { get; init; } = string.Empty; +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs new file mode 100644 index 0000000..2cbbf35 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs @@ -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 +{ + private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly ILogger _logger; + + public ApplyDiscountToOrderCommandHandler( + UserOrderContract.UserOrderContractClient orderClient, + ILogger logger) + { + _orderClient = orderClient; + _logger = logger; + } + + public async Task Handle(ApplyDiscountToOrderCommand request, CancellationToken cancellationToken) + { + // TODO: پیاده‌سازی ApplyDiscountToOrder + // 1. ایجاد gRPC Request و فراخوانی CMS + // 2. return response از CMS + throw new NotImplementedException("ApplyDiscountToOrder needs implementation"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandValidator.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandValidator.cs new file mode 100644 index 0000000..62ecb1a --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandValidator.cs @@ -0,0 +1,21 @@ +using FluentValidation; + +namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder; + +public class ApplyDiscountToOrderCommandValidator : AbstractValidator +{ + public ApplyDiscountToOrderCommandValidator() + { + RuleFor(x => x.OrderId) + .GreaterThan(0) + .WithMessage("شناسه سفارش باید بزرگتر از 0 باشد"); + + RuleFor(x => x.DiscountAmount) + .GreaterThan(0) + .WithMessage("مبلغ تخفیف باید بزرگتر از 0 باشد"); + + RuleFor(x => x.Reason) + .NotEmpty() + .WithMessage("دلیل تخفیف الزامی است"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommand.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommand.cs new file mode 100644 index 0000000..cbc0319 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommand.cs @@ -0,0 +1,10 @@ +using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using MediatR; + +namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus; + +public record UpdateOrderStatusCommand : IRequest +{ + public long OrderId { get; init; } + public int NewStatus { get; init; } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs new file mode 100644 index 0000000..393b7e6 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs @@ -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 +{ + private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly ILogger _logger; + + public UpdateOrderStatusCommandHandler( + UserOrderContract.UserOrderContractClient orderClient, + ILogger logger) + { + _orderClient = orderClient; + _logger = logger; + } + + public async Task Handle(UpdateOrderStatusCommand request, CancellationToken cancellationToken) + { + // TODO: پیاده‌سازی UpdateOrderStatus + // 1. ایجاد gRPC Request و فراخوانی CMS + // 2. return response از CMS + throw new NotImplementedException("UpdateOrderStatus needs implementation"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandValidator.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandValidator.cs new file mode 100644 index 0000000..5ece8c8 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandValidator.cs @@ -0,0 +1,17 @@ +using FluentValidation; + +namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus; + +public class UpdateOrderStatusCommandValidator : AbstractValidator +{ + public UpdateOrderStatusCommandValidator() + { + RuleFor(x => x.OrderId) + .GreaterThan(0) + .WithMessage("شناسه سفارش باید بزرگتر از 0 باشد"); + + RuleFor(x => x.NewStatus) + .IsInEnum() + .WithMessage("وضعیت جدید معتبر نیست"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQuery.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQuery.cs new file mode 100644 index 0000000..6981a8e --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQuery.cs @@ -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 +{ + public long OrderId { get; init; } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs new file mode 100644 index 0000000..b3b3d21 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs @@ -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 +{ + private readonly UserOrderContract.UserOrderContractClient _orderClient; + + public CalculateOrderPVQueryHandler(UserOrderContract.UserOrderContractClient orderClient) + { + _orderClient = orderClient; + } + + public async Task Handle(CalculateOrderPVQuery request, CancellationToken cancellationToken) + { + // TODO: پیاده‌سازی CalculateOrderPV + // 1. ایجاد gRPC Request و فراخوانی CMS + // 2. return response از CMS + throw new NotImplementedException("CalculateOrderPV needs implementation"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryValidator.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryValidator.cs new file mode 100644 index 0000000..73e707a --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryValidator.cs @@ -0,0 +1,13 @@ +using FluentValidation; + +namespace BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV; + +public class CalculateOrderPVQueryValidator : AbstractValidator +{ + public CalculateOrderPVQueryValidator() + { + RuleFor(x => x.OrderId) + .GreaterThan(0) + .WithMessage("شناسه سفارش باید بزرگتر از 0 باشد"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQuery.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQuery.cs new file mode 100644 index 0000000..4695570 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQuery.cs @@ -0,0 +1,14 @@ +using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using MediatR; + +namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange; + +public record GetOrdersByDateRangeQuery : IRequest +{ + 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; } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryHandler.cs new file mode 100644 index 0000000..13512a0 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryHandler.cs @@ -0,0 +1,21 @@ +using FluentValidation; + +namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange; + +public class GetOrdersByDateRangeQueryValidator : AbstractValidator +{ + 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 باشد"); + } +} diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs new file mode 100644 index 0000000..35588a1 --- /dev/null +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs @@ -0,0 +1,22 @@ +using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using MediatR; + +namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange; + +public class GetOrdersByDateRangeQueryHandler : IRequestHandler +{ + private readonly UserOrderContract.UserOrderContractClient _orderClient; + + public GetOrdersByDateRangeQueryHandler(UserOrderContract.UserOrderContractClient orderClient) + { + _orderClient = orderClient; + } + + public async Task Handle(GetOrdersByDateRangeQuery request, CancellationToken cancellationToken) + { + // TODO: پیاده‌سازی GetOrdersByDateRange + // 1. ایجاد gRPC Request و فراخوانی CMS + // 2. return response از CMS + throw new NotImplementedException("GetOrdersByDateRange needs implementation"); + } +} diff --git a/src/BackOffice.BFF.WebApi/Common/Mappings/PackageProfile.cs b/src/BackOffice.BFF.WebApi/Common/Mappings/PackageProfile.cs index 0c866f4..ebdfc7b 100644 --- a/src/BackOffice.BFF.WebApi/Common/Mappings/PackageProfile.cs +++ b/src/BackOffice.BFF.WebApi/Common/Mappings/PackageProfile.cs @@ -1,10 +1,14 @@ +using BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus; +using BackOffice.BFF.Package.Protobuf.Protos.Package; + namespace BackOffice.BFF.WebApi.Common.Mappings; public class PackageProfile : IRegister { void IRegister.Register(TypeAdapterConfig config) { - //config.NewConfig() - // .Map(dest => dest.FullName, src => $"{src.Firstname} {src.Lastname}"); + // GetUserPackageStatus + config.NewConfig() + .Map(dest => dest.UserId, src => src.UserId); } } diff --git a/src/BackOffice.BFF.WebApi/Common/Mappings/PublicMessageProfile.cs b/src/BackOffice.BFF.WebApi/Common/Mappings/PublicMessageProfile.cs new file mode 100644 index 0000000..9370046 --- /dev/null +++ b/src/BackOffice.BFF.WebApi/Common/Mappings/PublicMessageProfile.cs @@ -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() + .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() + .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() + .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() + .Map(dest => dest.MessageType, src => src.MessageType != null ? (int?)src.MessageType.Value : null) + .Map(dest => dest.TargetAudience, src => src.TargetAudience); + + config.NewConfig() + .Map(dest => dest.Messages, src => src.Messages); + + config.NewConfig() + .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); + } +} diff --git a/src/BackOffice.BFF.WebApi/Common/Mappings/UserOrderProfile.cs b/src/BackOffice.BFF.WebApi/Common/Mappings/UserOrderProfile.cs index 476e951..0c17bd7 100644 --- a/src/BackOffice.BFF.WebApi/Common/Mappings/UserOrderProfile.cs +++ b/src/BackOffice.BFF.WebApi/Common/Mappings/UserOrderProfile.cs @@ -1,10 +1,79 @@ 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 { void IRegister.Register(TypeAdapterConfig config) { - //config.NewConfig() - // .Map(dest => dest.FullName, src => $"{src.Firstname} {src.Lastname}"); + // UpdateOrderStatus mappings + config.NewConfig() + .Map(dest => dest.OrderId, src => src.OrderId) + .Map(dest => dest.NewStatus, src => src.NewStatus); + + config.NewConfig() + .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() + .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() + .Map(dest => dest.MetaData, src => src.MetaData) + .Map(dest => dest.Orders, src => src.Orders); + + config.NewConfig() + .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() + .Map(dest => dest.OrderId, src => src.OrderId) + .Map(dest => dest.DiscountAmount, src => src.DiscountAmount) + .Map(dest => dest.Reason, src => src.Reason); + + config.NewConfig() + .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() + .Map(dest => dest.OrderId, src => src.OrderId); + + config.NewConfig() + .Map(dest => dest.OrderId, src => src.OrderId) + .Map(dest => dest.TotalPv, src => src.TotalPV) + .Map(dest => dest.Products, src => src.Products); + + config.NewConfig() + .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); } } + diff --git a/src/BackOffice.BFF.WebApi/Services/PackageService.cs b/src/BackOffice.BFF.WebApi/Services/PackageService.cs index ba79cdc..5f23484 100644 --- a/src/BackOffice.BFF.WebApi/Services/PackageService.cs +++ b/src/BackOffice.BFF.WebApi/Services/PackageService.cs @@ -5,6 +5,7 @@ using BackOffice.BFF.Application.PackageCQ.Commands.UpdatePackage; using BackOffice.BFF.Application.PackageCQ.Commands.DeletePackage; using BackOffice.BFF.Application.PackageCQ.Queries.GetPackage; using BackOffice.BFF.Application.PackageCQ.Queries.GetAllPackageByFilter; +using BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus; namespace BackOffice.BFF.WebApi.Services; public class PackageService : PackageContract.PackageContractBase { @@ -34,4 +35,9 @@ public class PackageService : PackageContract.PackageContractBase { return await _dispatchRequestToCQRS.Handle(request, context); } + + public override async Task GetUserPackageStatus(GetUserPackageStatusRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } } diff --git a/src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs b/src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs new file mode 100644 index 0000000..9b94d4a --- /dev/null +++ b/src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs @@ -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 GetAllMessages(GetAllMessagesRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } + + public override async Task GetActiveMessages(GetActiveMessagesRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } +} diff --git a/src/BackOffice.BFF.WebApi/Services/UserOrderService.cs b/src/BackOffice.BFF.WebApi/Services/UserOrderService.cs index 4e8b15c..ccd0434 100644 --- a/src/BackOffice.BFF.WebApi/Services/UserOrderService.cs +++ b/src/BackOffice.BFF.WebApi/Services/UserOrderService.cs @@ -5,6 +5,10 @@ using BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateUserOrder; using BackOffice.BFF.Application.UserOrderCQ.Commands.DeleteUserOrder; using BackOffice.BFF.Application.UserOrderCQ.Queries.GetUserOrder; 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; public class UserOrderService : UserOrderContract.UserOrderContractBase { @@ -34,4 +38,24 @@ public class UserOrderService : UserOrderContract.UserOrderContractBase { return await _dispatchRequestToCQRS.Handle(request, context); } + + public override async Task UpdateOrderStatus(UpdateOrderStatusRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } + + public override async Task GetOrdersByDateRange(GetOrdersByDateRangeRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } + + public override async Task ApplyDiscountToOrder(ApplyDiscountToOrderRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } + + public override async Task CalculateOrderPV(CalculateOrderPVRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle(request, context); + } } diff --git a/src/Protobufs/BackOffice.BFF.Package.Protobuf/Protos/package.proto b/src/Protobufs/BackOffice.BFF.Package.Protobuf/Protos/package.proto index 85c8b6c..ffd360b 100644 --- a/src/Protobufs/BackOffice.BFF.Package.Protobuf/Protos/package.proto +++ b/src/Protobufs/BackOffice.BFF.Package.Protobuf/Protos/package.proto @@ -42,6 +42,13 @@ service PackageContract }; }; + + // Package Purchase System (Admin endpoints) + rpc GetUserPackageStatus(GetUserPackageStatusRequest) returns (GetUserPackageStatusResponse){ + option (google.api.http) = { + get: "/GetUserPackageStatus" + }; + }; } message CreateNewPackageRequest { @@ -113,6 +120,25 @@ message GetAllPackageByFilterResponseModel 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 { int32 page_number = 1; diff --git a/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj b/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj new file mode 100644 index 0000000..b0d8306 --- /dev/null +++ b/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/BackOffice.BFF.PublicMessage.Protobuf.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + disable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/Protos/public_messages.proto b/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/Protos/public_messages.proto new file mode 100644 index 0000000..279ef8c --- /dev/null +++ b/src/Protobufs/BackOffice.BFF.PublicMessage.Protobuf/Protos/public_messages.proto @@ -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; +} diff --git a/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto b/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto index c900239..c07d4ba 100644 --- a/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto +++ b/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto @@ -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 { @@ -229,6 +253,88 @@ message MetaData 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 {