diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Commands/ProcessWithdrawal/ProcessWithdrawalCommandHandler.cs b/src/BackOffice.BFF.Application/CommissionCQ/Commands/ProcessWithdrawal/ProcessWithdrawalCommandHandler.cs index 3e92606..ae1d004 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Commands/ProcessWithdrawal/ProcessWithdrawalCommandHandler.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Commands/ProcessWithdrawal/ProcessWithdrawalCommandHandler.cs @@ -1,4 +1,5 @@ using BackOffice.BFF.Commission.Protobuf; +using Google.Protobuf.WellKnownTypes; namespace BackOffice.BFF.Application.CommissionCQ.Commands.ProcessWithdrawal; @@ -13,30 +14,21 @@ public class ProcessWithdrawalCommandHandler : IRequestHandler Handle(ProcessWithdrawalCommand request, CancellationToken cancellationToken) { - // TODO: Implement when CMS ProcessWithdrawal endpoint is ready - await Task.CompletedTask; - + var grpcRequest = new ProcessWithdrawalRequest + { + PayoutId = request.WithdrawalId, + IsApproved = true, + Reason = request.AdminNote != null + ? new StringValue { Value = request.AdminNote } + : null + }; + + await _context.Commissions.ProcessWithdrawalAsync(grpcRequest, cancellationToken: cancellationToken); + return new ProcessWithdrawalResponseDto { Success = true, - Message = "Withdrawal processing pending CMS implementation" + Message = "درخواست برداشت برای پرداخت ارسال شد" }; - - /* Uncomment when CMS endpoint is ready: - var grpcRequest = new ProcessWithdrawalRequest - { - WithdrawalId = request.WithdrawalId, - TransactionId = request.TransactionId ?? string.Empty, - AdminNote = request.AdminNote ?? string.Empty - }; - - var response = await _context.Commissions.ProcessWithdrawalAsync(grpcRequest, cancellationToken: cancellationToken); - - return new ProcessWithdrawalResponseDto - { - Success = response.Success, - Message = response.Message - }; - */ } } diff --git a/src/BackOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs b/src/BackOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs index 326d191..0544ac8 100644 --- a/src/BackOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs +++ b/src/BackOffice.BFF.Application/Common/Interfaces/IApplicationContractContext.cs @@ -20,6 +20,7 @@ using CMSMicroservice.Protobuf.Protos.DiscountShoppingCart; using CMSMicroservice.Protobuf.Protos.DiscountOrder; using CMSMicroservice.Protobuf.Protos.Tag; using CMSMicroservice.Protobuf.Protos.ProductTag; +using CMSMicroservice.Protobuf.Protos; namespace BackOffice.BFF.Application.Common.Interfaces; @@ -57,5 +58,8 @@ public interface IApplicationContractContext TagContract.TagContractClient Tags { get; } ProductTagContract.ProductTagContractClient ProductTags { get; } + // Public Messages + PublicMessageContract.PublicMessageContractClient PublicMessages { get; } + #endregion } diff --git a/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs index 448b93b..0d47ecf 100644 --- a/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs +++ b/src/BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/GetUserPackageStatusQueryHandler.cs @@ -1,4 +1,6 @@ +using BackOffice.BFF.Application.Common.Interfaces; using BackOffice.BFF.Package.Protobuf.Protos.Package; +using CMSMicroservice.Protobuf.Protos.Package; using MediatR; using Microsoft.Extensions.Logging; @@ -6,47 +8,49 @@ namespace BackOffice.BFF.Application.PackageCQ.Queries.GetUserPackageStatus; public class GetUserPackageStatusQueryHandler : IRequestHandler { - private readonly PackageContract.PackageContractClient _packageClient; + private readonly IApplicationContractContext _context; private readonly ILogger _logger; public GetUserPackageStatusQueryHandler( - PackageContract.PackageContractClient packageClient, + IApplicationContractContext context, ILogger logger) { - _packageClient = packageClient; + _context = context; _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 است تا وضعیت کاربران را بررسی کند + var grpcRequest = new GetUserPackageStatusRequest + { + UserId = request.UserId + }; - throw new NotImplementedException("GetUserPackageStatus needs implementation"); + var response = await _context.Packages.GetUserPackageStatusAsync(grpcRequest, cancellationToken: cancellationToken); + + _logger.LogInformation("Retrieved package status for user {UserId}", request.UserId); + + var result = new GetUserPackageStatusResponse + { + UserId = response.UserId, + PackagePurchaseMethod = response.PackagePurchaseMethod, + HasPurchasedPackage = response.HasPurchasedPackage, + IsClubMemberActive = response.IsClubMemberActive, + WalletBalance = response.WalletBalance, + DiscountBalance = response.DiscountBalance, + CanActivateClubMembership = response.CanActivateClubMembership + }; + + if (response.LastOrderNumber != null) + { + result.LastOrderNumber = response.LastOrderNumber; + } + + if (response.LastPurchaseDate != null) + { + result.LastPurchaseDate = response.LastPurchaseDate; + } + + return result; } } diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/ArchiveMessage/ArchiveMessageCommandHandler.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/ArchiveMessage/ArchiveMessageCommandHandler.cs new file mode 100644 index 0000000..3e7f332 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/ArchiveMessage/ArchiveMessageCommandHandler.cs @@ -0,0 +1,35 @@ +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.ArchiveMessage; + +public class ArchiveMessageCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public ArchiveMessageCommandHandler(IApplicationContractContext context) + { + _context = context; + } + + public async Task Handle(ArchiveMessageRequest request, CancellationToken cancellationToken) + { + var cmsRequest = new ArchiveMessageRequest + { + MessageId = request.MessageId + }; + + var cmsResponse = await _context.PublicMessages.ArchiveMessageAsync( + cmsRequest, + cancellationToken: cancellationToken); + + return new ArchiveMessageResponse + { + Success = cmsResponse.Success, + Message = cmsResponse.Message, + ArchivedAt = cmsResponse.ArchivedAt + }; + } +} + diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/CreatePublicMessage/CreatePublicMessageCommandHandler.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/CreatePublicMessage/CreatePublicMessageCommandHandler.cs new file mode 100644 index 0000000..8a84ff8 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/CreatePublicMessage/CreatePublicMessageCommandHandler.cs @@ -0,0 +1,41 @@ +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; +using Google.Protobuf.WellKnownTypes; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.CreatePublicMessage; + +public class CreatePublicMessageCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public CreatePublicMessageCommandHandler(IApplicationContractContext context) + { + _context = context; + } + + public async Task Handle(CreatePublicMessageRequest request, CancellationToken cancellationToken) + { + var cmsRequest = new CreatePublicMessageRequest + { + Title = request.Title, + Content = request.Content, + Type = request.MessageType, + Priority = request.Priority, + StartDate = Timestamp.FromDateTime(request.StartsAt.ToUniversalTime()), + EndDate = Timestamp.FromDateTime(request.ExpiresAt.ToUniversalTime()) + }; + + var cmsResponse = await _context.PublicMessages.CreatePublicMessageAsync( + cmsRequest, + cancellationToken: cancellationToken); + + return new CreatePublicMessageResponse + { + Success = true, + Message = "پیام با موفقیت ایجاد شد", + MessageId = cmsResponse.Id + }; + } +} + diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/DeletePublicMessage/DeletePublicMessageCommandHandler.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/DeletePublicMessage/DeletePublicMessageCommandHandler.cs new file mode 100644 index 0000000..4453ced --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/DeletePublicMessage/DeletePublicMessageCommandHandler.cs @@ -0,0 +1,30 @@ +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.DeletePublicMessage; + +public class DeletePublicMessageCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public DeletePublicMessageCommandHandler(IApplicationContractContext context) + { + _context = context; + } + + public async Task Handle(DeletePublicMessageRequest request, CancellationToken cancellationToken) + { + var cmsRequest = new DeletePublicMessageRequest + { + MessageId = request.MessageId + }; + + await _context.PublicMessages.DeletePublicMessageAsync( + cmsRequest, + cancellationToken: cancellationToken); + + return request; + } +} + diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/PublishMessage/PublishMessageCommandHandler.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/PublishMessage/PublishMessageCommandHandler.cs new file mode 100644 index 0000000..438f420 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/PublishMessage/PublishMessageCommandHandler.cs @@ -0,0 +1,35 @@ +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.PublishMessage; + +public class PublishMessageCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public PublishMessageCommandHandler(IApplicationContractContext context) + { + _context = context; + } + + public async Task Handle(PublishMessageRequest request, CancellationToken cancellationToken) + { + var cmsRequest = new PublishMessageRequest + { + MessageId = request.MessageId + }; + + var cmsResponse = await _context.PublicMessages.PublishMessageAsync( + cmsRequest, + cancellationToken: cancellationToken); + + return new PublishMessageResponse + { + Success = cmsResponse.Success, + Message = cmsResponse.Message, + PublishedAt = cmsResponse.PublishedAt + }; + } +} + diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md index 97e9e3f..6cb0a08 100644 --- a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/README.md @@ -1,4 +1,4 @@ -// TODO: PublicMessage Commands +// PublicMessage Commands implemented: // - CreatePublicMessage // - UpdatePublicMessage // - DeletePublicMessage diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/UpdatePublicMessage/UpdatePublicMessageCommandHandler.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/UpdatePublicMessage/UpdatePublicMessageCommandHandler.cs new file mode 100644 index 0000000..07aa280 --- /dev/null +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Commands/UpdatePublicMessage/UpdatePublicMessageCommandHandler.cs @@ -0,0 +1,38 @@ +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; +using Google.Protobuf.WellKnownTypes; + +namespace BackOffice.BFF.Application.PublicMessageCQ.Commands.UpdatePublicMessage; + +public class UpdatePublicMessageCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + + public UpdatePublicMessageCommandHandler(IApplicationContractContext context) + { + _context = context; + } + + public async Task Handle(UpdatePublicMessageRequest request, CancellationToken cancellationToken) + { + var cmsRequest = new UpdatePublicMessageRequest + { + Id = request.MessageId, + Title = request.Title, + Content = request.Content, + Type = request.MessageType, + Priority = request.Priority, + StartDate = Timestamp.FromDateTime(request.StartsAt.ToUniversalTime()), + EndDate = Timestamp.FromDateTime(request.ExpiresAt.ToUniversalTime()) + }; + + await _context.PublicMessages.UpdatePublicMessageAsync( + cmsRequest, + cancellationToken: cancellationToken); + + // در حال حاضر پاسخ خاصی از CMS دریافت نمی‌کنیم؛ همان ورودی را برمی‌گردانیم + return request; + } +} + diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs index c1df59b..85da603 100644 --- a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetActiveMessages/GetActiveMessagesQuery.cs @@ -1,17 +1,54 @@ // GetActiveMessages - Public view +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; +using Google.Protobuf.WellKnownTypes; using MediatR; namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetActiveMessages; -public record GetActiveMessagesQuery : IRequest // TODO: define response +public record GetActiveMessagesQuery : IRequest { + public int? MessageType { get; init; } + public string? TargetAudience { get; init; } } -public class GetActiveMessagesQueryHandler : IRequestHandler +public class GetActiveMessagesQueryHandler : IRequestHandler { - public async Task Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken) + private readonly IApplicationContractContext _context; + + public GetActiveMessagesQueryHandler(IApplicationContractContext context) { - // TODO: gRPC call to CMS PublicMessageContract.GetActiveMessages - throw new NotImplementedException(); + _context = context; + } + + public async Task Handle(GetActiveMessagesQuery request, CancellationToken cancellationToken) + { + var cmsRequest = new GetActiveMessagesRequest(); + + // نسخه فعلی CMS فیلدی برای فیلتر ندارد؛ در صورت اضافه شدن، اینجا مپ می‌شود. + var cmsResponse = await _context.PublicMessages.GetActiveMessagesAsync(cmsRequest, cancellationToken: cancellationToken); + + var result = new GetActiveMessagesResponse(); + + foreach (var message in cmsResponse.Messages) + { + result.Messages.Add(new PublicMessageDto + { + MessageId = message.Id, + Title = message.Title, + Content = message.Content, + MessageType = message.Type, + MessageTypeName = message.TypeName, + Priority = message.Priority, + PriorityName = message.PriorityName, + StartsAt = message.StartsAt, + ExpiresAt = message.ExpiresAt, + IsDismissible = false, + Tags = { } + }); + } + + return result; } } diff --git a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs index 0c970e2..49dd28d 100644 --- a/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs +++ b/src/BackOffice.BFF.Application/PublicMessageCQ/Queries/GetAllMessages/GetAllMessagesQuery.cs @@ -1,19 +1,80 @@ // GetAllMessages - Admin view +using BackOffice.BFF.Application.Common.Interfaces; +using BackOffice.BFF.PublicMessage.Protobuf; +using CMSMicroservice.Protobuf.Protos; +using Google.Protobuf.WellKnownTypes; using MediatR; namespace BackOffice.BFF.Application.PublicMessageCQ.Queries.GetAllMessages; -public record GetAllMessagesQuery : IRequest // TODO: define response +public record GetAllMessagesQuery : IRequest { + public int? Status { get; init; } + public int? MessageType { get; init; } public int PageNumber { get; init; } public int PageSize { get; init; } } -public class GetAllMessagesQueryHandler : IRequestHandler +public class GetAllMessagesQueryHandler : IRequestHandler { - public async Task Handle(GetAllMessagesQuery request, CancellationToken cancellationToken) + private readonly IApplicationContractContext _context; + + public GetAllMessagesQueryHandler(IApplicationContractContext context) { - // TODO: gRPC call to CMS PublicMessageContract.GetAllMessages - throw new NotImplementedException(); + _context = context; + } + + public async Task Handle(GetAllMessagesQuery request, CancellationToken cancellationToken) + { + var cmsRequest = new GetAllMessagesRequest + { + PageNumber = request.PageNumber, + PageSize = request.PageSize + }; + + if (request.Status.HasValue) + { + cmsRequest.IsActive = new BoolValue { Value = request.Status.Value == 1 }; + } + + if (request.MessageType.HasValue) + { + cmsRequest.Type = new Int32Value { Value = request.MessageType.Value }; + } + + var cmsResponse = await _context.PublicMessages.GetAllMessagesAsync(cmsRequest, cancellationToken: cancellationToken); + + var result = new GetAllMessagesResponse + { + TotalCount = (int)cmsResponse.MetaData.TotalCount, + PageNumber = request.PageNumber, + PageSize = request.PageSize + }; + + foreach (var message in cmsResponse.Messages) + { + result.Messages.Add(new AdminPublicMessageDto + { + MessageId = message.Id, + Title = message.Title, + Content = message.Content, + MessageType = message.Type, + MessageTypeName = message.TypeName, + Priority = message.Priority, + PriorityName = message.PriorityName, + Status = message.IsActive ? 1 : 0, + StatusName = message.IsActive ? "Active" : (message.IsExpired ? "Expired" : "Inactive"), + StartsAt = message.StartsAt, + ExpiresAt = message.ExpiresAt, + PublishedAt = null, + ArchivedAt = null, + IsDismissible = false, + TargetAudience = string.Empty, + Created = message.Created, + LastModified = message.LastModified + }); + } + + return result; } } diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs index 2cbbf35..2f0d037 100644 --- a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/ApplyDiscountToOrder/ApplyDiscountToOrderCommandHandler.cs @@ -1,4 +1,6 @@ +using BackOffice.BFF.Application.Common.Interfaces; using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using CMSMicroservice.Protobuf.Protos.UserOrder; using MediatR; using Microsoft.Extensions.Logging; @@ -6,22 +8,42 @@ namespace BackOffice.BFF.Application.UserOrderCQ.Commands.ApplyDiscountToOrder; public class ApplyDiscountToOrderCommandHandler : IRequestHandler { - private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly IApplicationContractContext _context; private readonly ILogger _logger; public ApplyDiscountToOrderCommandHandler( - UserOrderContract.UserOrderContractClient orderClient, + IApplicationContractContext context, ILogger logger) { - _orderClient = orderClient; + _context = context; _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"); + var grpcRequest = new ApplyDiscountToOrderRequest + { + OrderId = request.OrderId, + DiscountAmount = request.DiscountAmount, + Reason = request.Reason ?? string.Empty + }; + + var response = await _context.UserOrders.ApplyDiscountToOrderAsync(grpcRequest, cancellationToken: cancellationToken); + + _logger.LogInformation( + "Applied discount to order {OrderId}. Success={Success}, Discount={DiscountAmount}, FinalAmount={FinalAmount}", + request.OrderId, + response.Success, + response.DiscountAmount, + response.FinalAmount); + + return new ApplyDiscountToOrderResponse + { + Success = response.Success, + Message = response.Message, + OriginalAmount = response.OriginalAmount, + DiscountAmount = response.DiscountAmount, + FinalAmount = response.FinalAmount + }; } } diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs index 393b7e6..c89cea3 100644 --- a/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Commands/UpdateOrderStatus/UpdateOrderStatusCommandHandler.cs @@ -1,4 +1,6 @@ +using BackOffice.BFF.Application.Common.Interfaces; using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using CMSMicroservice.Protobuf.Protos.UserOrder; using MediatR; using Microsoft.Extensions.Logging; @@ -6,22 +8,40 @@ namespace BackOffice.BFF.Application.UserOrderCQ.Commands.UpdateOrderStatus; public class UpdateOrderStatusCommandHandler : IRequestHandler { - private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly IApplicationContractContext _context; private readonly ILogger _logger; public UpdateOrderStatusCommandHandler( - UserOrderContract.UserOrderContractClient orderClient, + IApplicationContractContext context, ILogger logger) { - _orderClient = orderClient; + _context = context; _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"); + var grpcRequest = new UpdateOrderStatusRequest + { + OrderId = request.OrderId, + NewStatus = request.NewStatus + }; + + var response = await _context.UserOrders.UpdateOrderStatusAsync(grpcRequest, cancellationToken: cancellationToken); + + _logger.LogInformation( + "Updated order {OrderId} status from {OldStatus} to {NewStatus}. Success={Success}", + request.OrderId, + response.OldStatus, + response.NewStatus, + response.Success); + + return new UpdateOrderStatusResponse + { + Success = response.Success, + Message = response.Message, + OldStatus = response.OldStatus, + NewStatus = response.NewStatus + }; } } diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs index b5d4a79..8362ebb 100644 --- a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/CalculateOrderPV/CalculateOrderPVQueryHandler.cs @@ -1,22 +1,46 @@ +using BackOffice.BFF.Application.Common.Interfaces; using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using CMSMicroservice.Protobuf.Protos.UserOrder; using MediatR; namespace BackOffice.BFF.Application.UserOrderCQ.Queries.CalculateOrderPV; public class CalculateOrderPVQueryHandler : IRequestHandler { - private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly IApplicationContractContext _context; - public CalculateOrderPVQueryHandler(UserOrderContract.UserOrderContractClient orderClient) + public CalculateOrderPVQueryHandler(IApplicationContractContext context) { - _orderClient = orderClient; + _context = context; } public async Task Handle(CalculateOrderPVQuery request, CancellationToken cancellationToken) { - // TODO: پیاده‌سازی CalculateOrderPV - // 1. ایجاد gRPC Request و فراخوانی CMS - // 2. return response از CMS - throw new NotImplementedException("CalculateOrderPV needs implementation"); + var grpcRequest = new CalculateOrderPVRequest + { + OrderId = request.OrderId + }; + + var response = await _context.UserOrders.CalculateOrderPVAsync(grpcRequest, cancellationToken: cancellationToken); + + var result = new CalculateOrderPVResponse + { + OrderId = response.OrderId, + TotalPv = response.TotalPv + }; + + foreach (var product in response.Products) + { + result.Products.Add(new ProductPVDto + { + ProductId = product.ProductId, + ProductTitle = product.ProductTitle, + Quantity = product.Quantity, + UnitPv = product.UnitPv, + TotalPv = product.TotalPv + }); + } + + return result; } } diff --git a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs index 35588a1..4de19e7 100644 --- a/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs +++ b/src/BackOffice.BFF.Application/UserOrderCQ/Queries/GetOrdersByDateRange/GetOrdersByDateRangeQueryValidator.cs @@ -1,22 +1,71 @@ +using BackOffice.BFF.Application.Common.Interfaces; using BackOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; +using CMSMicroservice.Protobuf.Protos.UserOrder; +using Google.Protobuf.WellKnownTypes; using MediatR; namespace BackOffice.BFF.Application.UserOrderCQ.Queries.GetOrdersByDateRange; public class GetOrdersByDateRangeQueryHandler : IRequestHandler { - private readonly UserOrderContract.UserOrderContractClient _orderClient; + private readonly IApplicationContractContext _context; - public GetOrdersByDateRangeQueryHandler(UserOrderContract.UserOrderContractClient orderClient) + public GetOrdersByDateRangeQueryHandler(IApplicationContractContext context) { - _orderClient = orderClient; + _context = context; } public async Task Handle(GetOrdersByDateRangeQuery request, CancellationToken cancellationToken) { - // TODO: پیاده‌سازی GetOrdersByDateRange - // 1. ایجاد gRPC Request و فراخوانی CMS - // 2. return response از CMS - throw new NotImplementedException("GetOrdersByDateRange needs implementation"); + var grpcRequest = new GetOrdersByDateRangeRequest + { + StartDate = Timestamp.FromDateTime(request.StartDate.ToUniversalTime()), + EndDate = Timestamp.FromDateTime(request.EndDate.ToUniversalTime()), + PageNumber = request.PageNumber, + PageSize = request.PageSize + }; + + if (request.Status.HasValue) + { + grpcRequest.Status = new Int32Value { Value = request.Status.Value }; + } + + if (request.UserId.HasValue) + { + grpcRequest.UserId = new Int64Value { Value = request.UserId.Value }; + } + + var response = await _context.UserOrders.GetOrdersByDateRangeAsync(grpcRequest, cancellationToken: cancellationToken); + + var result = new GetOrdersByDateRangeResponse + { + MetaData = new MetaData + { + CurrentPage = response.MetaData.CurrentPage, + TotalPage = response.MetaData.TotalPage, + PageSize = response.MetaData.PageSize, + TotalCount = response.MetaData.TotalCount, + HasPrevious = response.MetaData.HasPrevious, + HasNext = response.MetaData.HasNext + } + }; + + foreach (var order in response.Orders) + { + result.Orders.Add(new OrderSummaryDto + { + OrderId = order.OrderId, + OrderNumber = order.OrderNumber, + UserId = order.UserId, + UserFullName = order.UserFullName, + TotalAmount = order.TotalAmount, + Status = order.Status, + StatusName = order.StatusName, + ItemsCount = order.ItemsCount, + CreatedAt = order.CreatedAt + }); + } + + return result; } } diff --git a/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj b/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj index 520241c..7053e77 100644 --- a/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj +++ b/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/src/BackOffice.BFF.Infrastructure/Services/ApplicationContractContext.cs b/src/BackOffice.BFF.Infrastructure/Services/ApplicationContractContext.cs index 1edf49f..2066cd4 100644 --- a/src/BackOffice.BFF.Infrastructure/Services/ApplicationContractContext.cs +++ b/src/BackOffice.BFF.Infrastructure/Services/ApplicationContractContext.cs @@ -21,6 +21,7 @@ using CMSMicroservice.Protobuf.Protos.DiscountShoppingCart; using CMSMicroservice.Protobuf.Protos.DiscountOrder; using CMSMicroservice.Protobuf.Protos.Tag; using CMSMicroservice.Protobuf.Protos.ProductTag; +using CMSMicroservice.Protobuf.Protos; using Microsoft.Extensions.DependencyInjection; namespace BackOffice.BFF.Infrastructure.Services; @@ -80,5 +81,8 @@ public class ApplicationContractContext : IApplicationContractContext // Tag Management System public TagContract.TagContractClient Tags => GetService(); public ProductTagContract.ProductTagContractClient ProductTags => GetService(); + + // Public Messages + public PublicMessageContract.PublicMessageContractClient PublicMessages => GetService(); #endregion } diff --git a/src/BackOffice.BFF.WebApi/Services/CommissionService.cs b/src/BackOffice.BFF.WebApi/Services/CommissionService.cs index 4d91db0..607cab3 100644 --- a/src/BackOffice.BFF.WebApi/Services/CommissionService.cs +++ b/src/BackOffice.BFF.WebApi/Services/CommissionService.cs @@ -4,6 +4,7 @@ using BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; using BackOffice.BFF.Application.CommissionCQ.Queries.GetAllWeeklyPools; using BackOffice.BFF.Application.CommissionCQ.Queries.GetUserWeeklyBalances; using BackOffice.BFF.Application.CommissionCQ.Queries.GetWithdrawalRequests; +using BackOffice.BFF.Application.CommissionCQ.Queries.GetWithdrawalReports; using BackOffice.BFF.Application.CommissionCQ.Commands.ApproveWithdrawal; using BackOffice.BFF.Application.CommissionCQ.Commands.RejectWithdrawal; using BackOffice.BFF.Application.CommissionCQ.Commands.ProcessWithdrawal; @@ -57,8 +58,6 @@ public class CommissionService : CommissionContract.CommissionContractBase context); } - // TODO: Uncomment when CMS implements these endpoints - /* public override async Task GetWithdrawalRequests( GetWithdrawalRequestsRequest request, ServerCallContext context) @@ -87,5 +86,23 @@ public class CommissionService : CommissionContract.CommissionContractBase context); return new Empty(); } - */ + + public override async Task ProcessWithdrawal( + ProcessWithdrawalRequest request, + ServerCallContext context) + { + await _dispatchRequestToCQRS.Handle( + request, + context); + return new Empty(); + } + + public override async Task GetWithdrawalReports( + GetWithdrawalReportsRequest 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 index 9b94d4a..06cd562 100644 --- a/src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs +++ b/src/BackOffice.BFF.WebApi/Services/PublicMessageService.cs @@ -14,13 +14,52 @@ public class PublicMessageService : PublicMessageContract.PublicMessageContractB _dispatchRequestToCQRS = dispatchRequestToCQRS; } + public override async Task CreatePublicMessage(CreatePublicMessageRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } + + public override async Task UpdatePublicMessage(UpdatePublicMessageRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } + + public override async Task DeletePublicMessage(DeletePublicMessageRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } + + public override async Task PublishMessage(PublishMessageRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } + + public override async Task ArchiveMessage(ArchiveMessageRequest request, ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } + public override async Task GetAllMessages(GetAllMessagesRequest request, ServerCallContext context) { - return await _dispatchRequestToCQRS.Handle(request, context); + return await _dispatchRequestToCQRS.Handle( + request, + context); } public override async Task GetActiveMessages(GetActiveMessagesRequest request, ServerCallContext context) { - return await _dispatchRequestToCQRS.Handle(request, context); + return await _dispatchRequestToCQRS.Handle( + request, + context); } }