feat: Add Protobuf definitions for Network Membership service

- Introduced `networkmembership.proto` with RPC methods for retrieving user network tree, statistics, and position.
- Implemented HTTP annotations for gRPC transcoding in the service methods.
- Added support for Google API annotations in `annotations.proto` and `http.proto`.
- Created `ConfigureServices.cs` to register FluentValidation for the Protobuf services.
- Updated project file to include necessary dependencies for gRPC and Protobuf.
This commit is contained in:
masoodafar-web
2025-12-04 19:53:47 +03:30
parent 75e446f80f
commit 9a42060653
55 changed files with 3729 additions and 16 deletions

View File

@@ -0,0 +1,39 @@
namespace FrontOffice.BFF.Application.DiscountShopCQ.Commands.PlaceDiscountOrder;
/// <summary>
/// ثبت سفارش از سبد خرید تخفیفی
/// </summary>
public record PlaceDiscountOrderCommand : IRequest<PlaceDiscountOrderResponseDto>
{
/// <summary>
/// شناسه آدرس کاربر
/// </summary>
public long UserAddressId { get; init; }
/// <summary>
/// مقدار استفاده از موجودی تخفیف (اختیاری)
/// </summary>
public long DiscountBalanceToUse { get; init; }
/// <summary>
/// توضیحات
/// </summary>
public string? Notes { get; init; }
}
public class PlaceDiscountOrderResponseDto
{
public bool Success { get; set; }
public string Message { get; set; } = string.Empty;
public long OrderId { get; set; }
/// <summary>
/// مبلغ قابل پرداخت از درگاه
/// </summary>
public long GatewayAmount { get; set; }
/// <summary>
/// لینک پرداخت (اگر نیاز باشد)
/// </summary>
public string? PaymentUrl { get; set; }
}

View File

@@ -0,0 +1,41 @@
using CMSMicroservice.Protobuf.Protos.DiscountOrder;
namespace FrontOffice.BFF.Application.DiscountShopCQ.Commands.PlaceDiscountOrder;
public class PlaceDiscountOrderCommandHandler : IRequestHandler<PlaceDiscountOrderCommand, PlaceDiscountOrderResponseDto>
{
private readonly IApplicationContractContext _context;
private readonly ICurrentUserService _currentUserService;
public PlaceDiscountOrderCommandHandler(IApplicationContractContext context, ICurrentUserService currentUserService)
{
_context = context;
_currentUserService = currentUserService;
}
public async Task<PlaceDiscountOrderResponseDto> Handle(PlaceDiscountOrderCommand request, CancellationToken cancellationToken)
{
var userId = _currentUserService.UserId ?? throw new UnauthorizedAccessException("User not authenticated");
var cmsRequest = new PlaceOrderRequest
{
UserId = userId,
UserAddressId = request.UserAddressId,
DiscountBalanceToUse = request.DiscountBalanceToUse
};
if (!string.IsNullOrEmpty(request.Notes))
cmsRequest.Notes = request.Notes;
var response = await _context.DiscountOrders.PlaceOrderAsync(cmsRequest, cancellationToken: cancellationToken);
return new PlaceDiscountOrderResponseDto
{
Success = response.Success,
Message = response.Message,
OrderId = response.OrderId,
GatewayAmount = response.GatewayAmount,
PaymentUrl = response.PaymentUrl
};
}
}