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,42 @@
using FrontOffice.BFF.Application.ClubMembershipCQ.Queries.GetMyClubMembership;
using FrontOffice.BFF.Application.ClubMembershipCQ.Commands.ActivateMyClubMembership;
using Google.Protobuf.WellKnownTypes;
using ProtoDto = FrontOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership;
namespace FrontOffice.BFF.WebApi.Common.Mappings;
public class ClubMembershipProfile : IRegister
{
void IRegister.Register(TypeAdapterConfig config)
{
// Request -> Command mappings
config.NewConfig<ProtoDto.ActivateMyClubMembershipRequest, ActivateMyClubMembershipCommand>()
.Map(dest => dest.PackageId, src => src.PackageId)
.Map(dest => dest.ActivationCode, src => src.ActivationCode)
.Map(dest => dest.DurationMonths, src => src.DurationMonths > 0 ? src.DurationMonths : 12);
// Response mappings
config.NewConfig<GetMyClubMembershipResponseDto, ProtoDto.GetMyClubMembershipResponse>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.PackageId, src => src.PackageId)
.Map(dest => dest.PackageName, src => src.PackageName)
.Map(dest => dest.ActivationCode, src => src.ActivationCode)
.Map(dest => dest.IsActive, src => src.IsActive)
.Map(dest => dest.ActivationDate, src => src.ActivationDate.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.ActivationDate.Value, DateTimeKind.Utc))
: null)
.Map(dest => dest.ExpirationDate, src => src.ExpirationDate.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.ExpirationDate.Value, DateTimeKind.Utc))
: null)
.Map(dest => dest.Status, src => src.Status)
.Map(dest => dest.DaysRemaining, src => src.DaysRemaining)
.Map(dest => dest.IsTrialPeriod, src => src.IsTrialPeriod);
config.NewConfig<ActivateMyClubMembershipResponseDto, ProtoDto.ActivateMyClubMembershipResponse>()
.Map(dest => dest.Success, src => src.Success)
.Map(dest => dest.Message, src => src.Message)
.Map(dest => dest.ActivationDate, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.ActivationDate, DateTimeKind.Utc)))
.Map(dest => dest.ExpirationDate, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.ExpirationDate, DateTimeKind.Utc)))
.Map(dest => dest.AmountPaid, src => src.AmountPaid);
}
}

View File

@@ -0,0 +1,59 @@
using FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyCommissionPayouts;
using FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
using Google.Protobuf.WellKnownTypes;
using ProtoDto = FrontOffice.BFF.Commission.Protobuf.Protos.Commission;
namespace FrontOffice.BFF.WebApi.Common.Mappings;
public class CommissionProfile : IRegister
{
void IRegister.Register(TypeAdapterConfig config)
{
// Request -> Query mappings
config.NewConfig<ProtoDto.GetMyCommissionPayoutsRequest, GetMyCommissionPayoutsQuery>()
.Map(dest => dest.PageNumber, src => src.PageNumber)
.Map(dest => dest.PageSize, src => src.PageSize)
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
.Map(dest => dest.Status, src => src.Status);
config.NewConfig<ProtoDto.GetMyWeeklyBalancesRequest, GetMyWeeklyBalancesQuery>()
.Map(dest => dest.PageNumber, src => src.PageNumber)
.Map(dest => dest.PageSize, src => src.PageSize)
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
.Map(dest => dest.OnlyActive, src => src.OnlyActive);
// Response mappings
config.NewConfig<GetMyCommissionPayoutsResponseDto, ProtoDto.GetMyCommissionPayoutsResponse>()
.Map(dest => dest.MetaData, src => new ProtoDto.MetaData { TotalCount = src.TotalCount })
.Map(dest => dest.Payouts, src => src.Payouts);
config.NewConfig<CommissionPayoutDto, ProtoDto.CommissionPayoutModel>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
.Map(dest => dest.WeekLabel, src => src.WeekLabel)
.Map(dest => dest.BalancesEarned, src => src.BalancesEarned)
.Map(dest => dest.TotalAmount, src => src.TotalAmount)
.Map(dest => dest.AmountFormatted, src => src.AmountFormatted)
.Map(dest => dest.Status, src => src.Status)
.Map(dest => dest.StatusBadgeColor, src => src.StatusBadgeColor)
.Map(dest => dest.CalculatedDate, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.CalculatedDate, DateTimeKind.Utc)))
.Map(dest => dest.DatePersian, src => src.DatePersian);
config.NewConfig<GetMyWeeklyBalancesResponseDto, ProtoDto.GetMyWeeklyBalancesResponse>()
.Map(dest => dest.MetaData, src => new ProtoDto.MetaData { TotalCount = src.TotalCount })
.Map(dest => dest.Balances, src => src.Balances)
.Map(dest => dest.TotalLeftBalances, src => src.TotalLeftBalances)
.Map(dest => dest.TotalRightBalances, src => src.TotalRightBalances)
.Map(dest => dest.WeakerLeg, src => src.WeakerLeg);
config.NewConfig<WeeklyBalanceItemDto, ProtoDto.WeeklyBalanceModel>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
.Map(dest => dest.LeftLegBalances, src => src.LeftLegBalances)
.Map(dest => dest.RightLegBalances, src => src.RightLegBalances)
.Map(dest => dest.TotalBalances, src => src.TotalBalances)
.Map(dest => dest.WeeklyPoolContribution, src => src.WeeklyPoolContribution)
.Map(dest => dest.IsExpired, src => src.IsExpired)
.Map(dest => dest.DatePersian, src => src.DatePersian);
}
}

View File

@@ -0,0 +1,104 @@
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetDiscountProducts;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetDiscountCategories;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetMyDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetMyDiscountOrders;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.AddToDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.RemoveFromDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.PlaceDiscountOrder;
using ProtoDto = FrontOffice.BFF.DiscountShop.Protobuf.Protos.DiscountShop;
namespace FrontOffice.BFF.WebApi.Common.Mappings;
public class DiscountShopProfile : IRegister
{
void IRegister.Register(TypeAdapterConfig config)
{
// Request -> Query/Command mappings
config.NewConfig<ProtoDto.GetDiscountProductsRequest, GetDiscountProductsQuery>()
.Map(dest => dest.PageNumber, src => src.PageNumber)
.Map(dest => dest.PageSize, src => src.PageSize)
.Map(dest => dest.SearchTerm, src => src.SearchTerm)
.Map(dest => dest.CategoryId, src => src.CategoryId);
config.NewConfig<ProtoDto.GetDiscountCategoriesRequest, GetDiscountCategoriesQuery>()
.Map(dest => dest.ParentCategoryId, src => src.ParentCategoryId)
.Map(dest => dest.OnlyActive, src => src.OnlyActive);
config.NewConfig<ProtoDto.GetMyDiscountOrdersRequest, GetMyDiscountOrdersQuery>()
.Map(dest => dest.PageNumber, src => src.PageNumber)
.Map(dest => dest.PageSize, src => src.PageSize);
config.NewConfig<ProtoDto.AddToDiscountCartRequest, AddToDiscountCartCommand>()
.Map(dest => dest.ProductId, src => src.ProductId)
.Map(dest => dest.Count, src => src.Count);
config.NewConfig<ProtoDto.RemoveFromDiscountCartRequest, RemoveFromDiscountCartCommand>()
.Map(dest => dest.ProductId, src => src.ProductId);
config.NewConfig<ProtoDto.PlaceDiscountOrderRequest, PlaceDiscountOrderCommand>()
.Map(dest => dest.UserAddressId, src => src.UserAddressId)
.Map(dest => dest.DiscountBalanceToUse, src => src.DiscountBalanceToUse)
.Map(dest => dest.Notes, src => src.Notes);
// Response mappings
config.NewConfig<GetDiscountProductsResponseDto, ProtoDto.GetDiscountProductsResponse>()
.Map(dest => dest.MetaData, src => new ProtoDto.MetaData { TotalCount = src.MetaData.TotalCount })
.Map(dest => dest.Products, src => src.Products);
config.NewConfig<DiscountProductDto, ProtoDto.DiscountProductModel>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.Title, src => src.Title)
.Map(dest => dest.Description, src => src.ShortInformation)
.Map(dest => dest.ImagePath, src => src.ImagePath)
.Map(dest => dest.OriginalPrice, src => src.Price)
.Map(dest => dest.DiscountedPrice, src => src.DiscountedPrice)
.Map(dest => dest.DiscountPercent, src => src.MaxDiscountPercent)
.Map(dest => dest.RemainingCount, src => src.AvailableCount)
.Map(dest => dest.IsAvailable, src => src.IsActive);
config.NewConfig<GetDiscountCategoriesResponseDto, ProtoDto.GetDiscountCategoriesResponse>()
.Map(dest => dest.Categories, src => src.Categories);
config.NewConfig<DiscountCategoryDto, ProtoDto.DiscountCategoryModel>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.Title, src => src.Title)
.Map(dest => dest.ParentId, src => src.ParentCategoryId)
.Map(dest => dest.IconPath, src => src.ImagePath)
.Map(dest => dest.SortOrder, src => src.SortOrder)
.Map(dest => dest.Children, src => src.Children);
config.NewConfig<GetMyDiscountCartResponseDto, ProtoDto.GetMyDiscountCartResponse>()
.Map(dest => dest.Items, src => src.Items)
.Map(dest => dest.TotalPrice, src => src.TotalPrice)
.Map(dest => dest.TotalDiscountAmount, src => src.TotalDiscountAmount);
config.NewConfig<DiscountCartItemDto, ProtoDto.DiscountCartItemModel>()
.Map(dest => dest.ProductId, src => src.ProductId)
.Map(dest => dest.ProductTitle, src => src.ProductTitle)
.Map(dest => dest.ProductImagePath, src => src.ThumbnailPath)
.Map(dest => dest.UnitPrice, src => src.UnitPrice)
.Map(dest => dest.Count, src => src.Count)
.Map(dest => dest.TotalPrice, src => src.TotalPrice);
config.NewConfig<GetMyDiscountOrdersResponseDto, ProtoDto.GetMyDiscountOrdersResponse>()
.Map(dest => dest.MetaData, src => new ProtoDto.MetaData { TotalCount = src.MetaData.TotalCount })
.Map(dest => dest.Orders, src => src.Orders);
config.NewConfig<DiscountOrderDto, ProtoDto.DiscountOrderModel>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.OrderNumber, src => src.OrderNumber)
.Map(dest => dest.Status, src => src.Status)
.Map(dest => dest.StatusColor, src => src.StatusColor)
.Map(dest => dest.TotalAmount, src => src.TotalAmount)
.Map(dest => dest.DiscountUsed, src => src.DiscountUsed)
.Map(dest => dest.GatewayPaid, src => src.GatewayPaid)
.Map(dest => dest.CreatedAtPersian, src => src.CreatedAtPersian);
config.NewConfig<PlaceDiscountOrderResponseDto, ProtoDto.PlaceDiscountOrderResponse>()
.Map(dest => dest.Success, src => src.Success)
.Map(dest => dest.Message, src => src.Message)
.Map(dest => dest.OrderId, src => src.OrderId)
.Map(dest => dest.OrderNumber, src => src.OrderId.ToString())
.Map(dest => dest.PaymentUrl, src => src.PaymentUrl);
}
}

View File

@@ -0,0 +1,68 @@
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkTree;
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkStatistics;
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkPosition;
using Google.Protobuf.WellKnownTypes;
using ProtoDto = FrontOffice.BFF.NetworkMembership.Protobuf.Protos.NetworkMembership;
namespace FrontOffice.BFF.WebApi.Common.Mappings;
public class NetworkMembershipProfile : IRegister
{
void IRegister.Register(TypeAdapterConfig config)
{
// Request -> Query mappings
config.NewConfig<ProtoDto.GetMyNetworkTreeRequest, GetMyNetworkTreeQuery>()
.Map(dest => dest.MaxDepth, src => src.MaxDepth > 0 ? src.MaxDepth : 3);
// Response mappings - Tree
config.NewConfig<GetMyNetworkTreeResponseDto, ProtoDto.GetMyNetworkTreeResponse>()
.Map(dest => dest.RootNode, src => src.RootNode)
.Map(dest => dest.TotalMembers, src => src.TotalMembers)
.Map(dest => dest.CurrentDepth, src => src.CurrentDepth);
config.NewConfig<NetworkNodeDto, ProtoDto.NetworkNodeModel>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.FullName, src => src.FullName)
.Map(dest => dest.Mobile, src => src.Mobile)
.Map(dest => dest.Avatar, src => src.Avatar)
.Map(dest => dest.Position, src => src.Position)
.Map(dest => dest.LeftChild, src => src.LeftChild)
.Map(dest => dest.RightChild, src => src.RightChild)
.Map(dest => dest.Level, src => src.Level)
.Map(dest => dest.HasChildren, src => src.HasChildren);
// Response mappings - Statistics
config.NewConfig<GetMyNetworkStatisticsResponseDto, ProtoDto.GetMyNetworkStatisticsResponse>()
.Map(dest => dest.TotalMembers, src => src.TotalMembers)
.Map(dest => dest.ActiveMembers, src => src.ActiveMembers)
.Map(dest => dest.LeftLegCount, src => src.LeftLegCount)
.Map(dest => dest.RightLegCount, src => src.RightLegCount)
.Map(dest => dest.LeftPercentage, src => src.LeftPercentage)
.Map(dest => dest.RightPercentage, src => src.RightPercentage)
.Map(dest => dest.AverageDepth, src => src.AverageDepth)
.Map(dest => dest.MaxDepth, src => src.MaxDepth)
.Map(dest => dest.WeakerLeg, src => src.WeakerLeg)
.Map(dest => dest.MyNetworkLevel, src => src.MyNetworkLevel)
.Map(dest => dest.MyNetworkLeg, src => src.MyNetworkLeg)
.Map(dest => dest.MyReferralCode, src => src.MyReferralCode)
.Map(dest => dest.LastMember, src => src.LastMember);
config.NewConfig<LastMemberDto, ProtoDto.LastMemberModel>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.FullName, src => src.FullName)
.Map(dest => dest.Position, src => src.Position)
.Map(dest => dest.TotalChildren, src => src.TotalChildren);
// Response mappings - Position
config.NewConfig<GetMyNetworkPositionResponseDto, ProtoDto.GetMyNetworkPositionResponse>()
.Map(dest => dest.UserId, src => src.UserId)
.Map(dest => dest.ParentId, src => src.ParentId)
.Map(dest => dest.ParentName, src => src.ParentName)
.Map(dest => dest.Position, src => src.Position)
.Map(dest => dest.Level, src => src.Level)
.Map(dest => dest.ReferralCode, src => src.ReferralCode)
.Map(dest => dest.JoinedAt, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.JoinedAt, DateTimeKind.Utc)))
.Map(dest => dest.HasLeftChild, src => src.HasLeftChild)
.Map(dest => dest.HasRightChild, src => src.HasRightChild);
}
}

View File

@@ -31,5 +31,9 @@
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.UserAddress.Protobuf\FrontOffice.BFF.UserAddress.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.Package.Protobuf\FrontOffice.BFF.Package.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.UserOrder.Protobuf\FrontOffice.BFF.UserOrder.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.DiscountShop.Protobuf\FrontOffice.BFF.DiscountShop.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.Commission.Protobuf\FrontOffice.BFF.Commission.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.ClubMembership.Protobuf\FrontOffice.BFF.ClubMembership.Protobuf.csproj" />
<ProjectReference Include="..\Protobufs\FrontOffice.BFF.NetworkMembership.Protobuf\FrontOffice.BFF.NetworkMembership.Protobuf.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,35 @@
using FrontOffice.BFF.WebApi.Common.Services;
using FrontOffice.BFF.Application.ClubMembershipCQ.Queries.GetMyClubMembership;
using FrontOffice.BFF.Application.ClubMembershipCQ.Commands.ActivateMyClubMembership;
using FrontOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership;
namespace FrontOffice.BFF.WebApi.Services;
/// <summary>
/// سرویس عضویت باشگاه - برای کاربران FrontOffice
/// </summary>
public class ClubMembershipGrpcService : ClubMembershipContract.ClubMembershipContractBase
{
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
public ClubMembershipGrpcService(IDispatchRequestToCQRS dispatchRequestToCQRS)
{
_dispatchRequestToCQRS = dispatchRequestToCQRS;
}
/// <summary>
/// دریافت وضعیت عضویت باشگاه کاربر جاری
/// </summary>
public override async Task<GetMyClubMembershipResponse> GetMyClubMembership(Empty request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyClubMembershipQuery, GetMyClubMembershipResponse>(context);
}
/// <summary>
/// فعال‌سازی عضویت باشگاه (پرداخت 56M)
/// </summary>
public override async Task<ActivateMyClubMembershipResponse> ActivateMyClubMembership(ActivateMyClubMembershipRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<ActivateMyClubMembershipRequest, ActivateMyClubMembershipCommand, ActivateMyClubMembershipResponse>(request, context);
}
}

View File

@@ -1,6 +1,8 @@
using FrontOffice.BFF.WebApi.Common.Services;
using FrontOffice.BFF.Application.ClubMembershipCQ.Queries.GetMyClubMembership;
using FrontOffice.BFF.Application.ClubMembershipCQ.Commands.ActivateMyClubMembership;
using MediatR;
using System.Threading;
namespace FrontOffice.BFF.WebApi.Services;
@@ -11,19 +13,19 @@ namespace FrontOffice.BFF.WebApi.Services;
/// </summary>
public class ClubMembershipService
{
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
private readonly ISender _sender;
public ClubMembershipService(IDispatchRequestToCQRS dispatchRequestToCQRS)
public ClubMembershipService(ISender sender)
{
_dispatchRequestToCQRS = dispatchRequestToCQRS;
_sender = sender;
}
/// <summary>
/// دریافت وضعیت عضویت باشگاه کاربر جاری
/// </summary>
public async Task<GetMyClubMembershipResponseDto> GetMyClubMembership(Empty request, ServerCallContext context)
public async Task<GetMyClubMembershipResponseDto> GetMyClubMembership(CancellationToken cancellationToken = default)
{
return await _dispatchRequestToCQRS.Handle<GetMyClubMembershipQuery, GetMyClubMembershipResponseDto>(context);
return await _sender.Send(new GetMyClubMembershipQuery(), cancellationToken);
}
/// <summary>
@@ -31,8 +33,8 @@ public class ClubMembershipService
/// </summary>
public async Task<ActivateMyClubMembershipResponseDto> ActivateMyClubMembership(
ActivateMyClubMembershipCommand request,
ServerCallContext context)
CancellationToken cancellationToken = default)
{
return await _dispatchRequestToCQRS.Handle<ActivateMyClubMembershipCommand, ActivateMyClubMembershipResponseDto>(request, context);
return await _sender.Send(request, cancellationToken);
}
}

View File

@@ -0,0 +1,35 @@
using FrontOffice.BFF.WebApi.Common.Services;
using FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyCommissionPayouts;
using FrontOffice.BFF.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
using FrontOffice.BFF.Commission.Protobuf.Protos.Commission;
namespace FrontOffice.BFF.WebApi.Services;
/// <summary>
/// سرویس کمیسیون - برای کاربران FrontOffice
/// </summary>
public class CommissionService : CommissionContract.CommissionContractBase
{
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
public CommissionService(IDispatchRequestToCQRS dispatchRequestToCQRS)
{
_dispatchRequestToCQRS = dispatchRequestToCQRS;
}
/// <summary>
/// دریافت لیست پرداخت‌های کمیسیون کاربر
/// </summary>
public override async Task<GetMyCommissionPayoutsResponse> GetMyCommissionPayouts(GetMyCommissionPayoutsRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyCommissionPayoutsRequest, GetMyCommissionPayoutsQuery, GetMyCommissionPayoutsResponse>(request, context);
}
/// <summary>
/// دریافت لیست بالانس‌های هفتگی کاربر
/// </summary>
public override async Task<GetMyWeeklyBalancesResponse> GetMyWeeklyBalances(GetMyWeeklyBalancesRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyWeeklyBalancesRequest, GetMyWeeklyBalancesQuery, GetMyWeeklyBalancesResponse>(request, context);
}
}

View File

@@ -0,0 +1,80 @@
using FrontOffice.BFF.WebApi.Common.Services;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetDiscountProducts;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetDiscountCategories;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetMyDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Queries.GetMyDiscountOrders;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.AddToDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.RemoveFromDiscountCart;
using FrontOffice.BFF.Application.DiscountShopCQ.Commands.PlaceDiscountOrder;
using FrontOffice.BFF.DiscountShop.Protobuf.Protos.DiscountShop;
namespace FrontOffice.BFF.WebApi.Services;
/// <summary>
/// سرویس فروشگاه تخفیفی - برای کاربران عضو باشگاه
/// </summary>
public class DiscountShopService : DiscountShopContract.DiscountShopContractBase
{
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
public DiscountShopService(IDispatchRequestToCQRS dispatchRequestToCQRS)
{
_dispatchRequestToCQRS = dispatchRequestToCQRS;
}
/// <summary>
/// دریافت لیست محصولات تخفیفی
/// </summary>
public override async Task<GetDiscountProductsResponse> GetDiscountProducts(GetDiscountProductsRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetDiscountProductsRequest, GetDiscountProductsQuery, GetDiscountProductsResponse>(request, context);
}
/// <summary>
/// دریافت دسته‌بندی‌های فروشگاه تخفیفی
/// </summary>
public override async Task<GetDiscountCategoriesResponse> GetDiscountCategories(GetDiscountCategoriesRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetDiscountCategoriesRequest, GetDiscountCategoriesQuery, GetDiscountCategoriesResponse>(request, context);
}
/// <summary>
/// دریافت سبد خرید تخفیفی کاربر جاری
/// </summary>
public override async Task<GetMyDiscountCartResponse> GetMyDiscountCart(Empty request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyDiscountCartQuery, GetMyDiscountCartResponse>(context);
}
/// <summary>
/// افزودن محصول به سبد خرید تخفیفی
/// </summary>
public override async Task<Empty> AddToDiscountCart(AddToDiscountCartRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<AddToDiscountCartRequest, AddToDiscountCartCommand>(request, context);
}
/// <summary>
/// حذف محصول از سبد خرید تخفیفی
/// </summary>
public override async Task<Empty> RemoveFromDiscountCart(RemoveFromDiscountCartRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<RemoveFromDiscountCartRequest, RemoveFromDiscountCartCommand>(request, context);
}
/// <summary>
/// دریافت لیست سفارشات تخفیفی کاربر جاری
/// </summary>
public override async Task<GetMyDiscountOrdersResponse> GetMyDiscountOrders(GetMyDiscountOrdersRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyDiscountOrdersRequest, GetMyDiscountOrdersQuery, GetMyDiscountOrdersResponse>(request, context);
}
/// <summary>
/// ثبت سفارش تخفیفی
/// </summary>
public override async Task<PlaceDiscountOrderResponse> PlaceDiscountOrder(PlaceDiscountOrderRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<PlaceDiscountOrderRequest, PlaceDiscountOrderCommand, PlaceDiscountOrderResponse>(request, context);
}
}

View File

@@ -0,0 +1,44 @@
using FrontOffice.BFF.WebApi.Common.Services;
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkTree;
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkStatistics;
using FrontOffice.BFF.Application.NetworkMembershipCQ.Queries.GetMyNetworkPosition;
using FrontOffice.BFF.NetworkMembership.Protobuf.Protos.NetworkMembership;
namespace FrontOffice.BFF.WebApi.Services;
/// <summary>
/// سرویس عضویت شبکه‌ای - برای کاربران FrontOffice
/// </summary>
public class NetworkMembershipService : NetworkMembershipContract.NetworkMembershipContractBase
{
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
public NetworkMembershipService(IDispatchRequestToCQRS dispatchRequestToCQRS)
{
_dispatchRequestToCQRS = dispatchRequestToCQRS;
}
/// <summary>
/// دریافت درخت شبکه کاربر جاری
/// </summary>
public override async Task<GetMyNetworkTreeResponse> GetMyNetworkTree(GetMyNetworkTreeRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyNetworkTreeRequest, GetMyNetworkTreeQuery, GetMyNetworkTreeResponse>(request, context);
}
/// <summary>
/// دریافت آمار شبکه کاربر جاری
/// </summary>
public override async Task<GetMyNetworkStatisticsResponse> GetMyNetworkStatistics(Empty request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyNetworkStatisticsQuery, GetMyNetworkStatisticsResponse>(context);
}
/// <summary>
/// دریافت موقعیت کاربر در شبکه
/// </summary>
public override async Task<GetMyNetworkPositionResponse> GetMyNetworkPosition(Empty request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetMyNetworkPositionQuery, GetMyNetworkPositionResponse>(context);
}
}