feat: Implement GetMyWeeklyBalances query and handler, enhance ClubMembership service with JWT userId handling
This commit is contained in:
+25
-1
@@ -3,14 +3,18 @@ namespace CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership
|
|||||||
public class GetClubMembershipQueryHandler : IRequestHandler<GetClubMembershipQuery, ClubMembershipDto?>
|
public class GetClubMembershipQueryHandler : IRequestHandler<GetClubMembershipQuery, ClubMembershipDto?>
|
||||||
{
|
{
|
||||||
private readonly IApplicationDbContext _context;
|
private readonly IApplicationDbContext _context;
|
||||||
|
private readonly ILogger<GetClubMembershipQueryHandler> _logger;
|
||||||
|
|
||||||
public GetClubMembershipQueryHandler(IApplicationDbContext context)
|
public GetClubMembershipQueryHandler(IApplicationDbContext context, ILogger<GetClubMembershipQueryHandler> logger)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ClubMembershipDto?> Handle(GetClubMembershipQuery request, CancellationToken cancellationToken)
|
public async Task<ClubMembershipDto?> Handle(GetClubMembershipQuery request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("GetClubMembership called for UserId: {UserId}", request.UserId);
|
||||||
|
|
||||||
var membership = await _context.ClubMemberships
|
var membership = await _context.ClubMemberships
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(x => x.UserId == request.UserId)
|
.Where(x => x.UserId == request.UserId)
|
||||||
@@ -27,6 +31,26 @@ public class GetClubMembershipQueryHandler : IRequestHandler<GetClubMembershipQu
|
|||||||
})
|
})
|
||||||
.FirstOrDefaultAsync(cancellationToken);
|
.FirstOrDefaultAsync(cancellationToken);
|
||||||
|
|
||||||
|
// اگر کاربر عضویت نداره، یک DTO با وضعیت غیرفعال برگردون
|
||||||
|
if (membership == null)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("No membership found for UserId: {UserId}, returning inactive status", request.UserId);
|
||||||
|
return new ClubMembershipDto
|
||||||
|
{
|
||||||
|
Id = 0,
|
||||||
|
UserId = request.UserId,
|
||||||
|
IsActive = false,
|
||||||
|
ActivatedAt = null,
|
||||||
|
InitialContribution = 0,
|
||||||
|
TotalEarned = 0,
|
||||||
|
Created = DateTimeOffset.UtcNow,
|
||||||
|
LastModified = null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("Membership found for UserId: {UserId}, IsActive: {IsActive}, Id: {Id}",
|
||||||
|
request.UserId, membership.IsActive, membership.Id);
|
||||||
|
|
||||||
return membership;
|
return membership;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
||||||
|
|
||||||
|
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query برای دریافت تعادلهای هفتگی کاربر جاری (از JWT)
|
||||||
|
/// </summary>
|
||||||
|
public record GetMyWeeklyBalancesQuery : IRequest<GetUserWeeklyBalancesResponseDto>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه تعریف هفته (اختیاری)
|
||||||
|
/// </summary>
|
||||||
|
public long? WeekDefinitionId { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// فقط موارد Expired نشده؟
|
||||||
|
/// </summary>
|
||||||
|
public bool OnlyActive { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pagination
|
||||||
|
/// </summary>
|
||||||
|
public PaginationState? PaginationState { get; init; }
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
||||||
|
|
||||||
|
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler برای دریافت تعادلهای هفتگی کاربر جاری
|
||||||
|
/// </summary>
|
||||||
|
public class GetMyWeeklyBalancesQueryHandler : IRequestHandler<GetMyWeeklyBalancesQuery, GetUserWeeklyBalancesResponseDto>
|
||||||
|
{
|
||||||
|
private readonly ICurrentUserService _currentUserService;
|
||||||
|
private readonly IMediator _mediator;
|
||||||
|
private readonly ILogger<GetMyWeeklyBalancesQueryHandler> _logger;
|
||||||
|
|
||||||
|
public GetMyWeeklyBalancesQueryHandler(
|
||||||
|
ICurrentUserService currentUserService,
|
||||||
|
IMediator mediator,
|
||||||
|
ILogger<GetMyWeeklyBalancesQueryHandler> logger)
|
||||||
|
{
|
||||||
|
_currentUserService = currentUserService;
|
||||||
|
_mediator = mediator;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<GetUserWeeklyBalancesResponseDto> Handle(GetMyWeeklyBalancesQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// دریافت UserId از JWT
|
||||||
|
if (!long.TryParse(_currentUserService.UserId, out var userId) || userId <= 0)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("GetMyWeeklyBalances called without valid user authentication");
|
||||||
|
throw new UnauthorizedAccessException("کاربر احراز هویت نشده است");
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("GetMyWeeklyBalances for UserId: {UserId}, WeekDefinitionId: {WeekDefinitionId}",
|
||||||
|
userId, request.WeekDefinitionId);
|
||||||
|
|
||||||
|
// فراخوانی GetUserWeeklyBalancesQuery با UserId از JWT
|
||||||
|
var query = new GetUserWeeklyBalancesQuery
|
||||||
|
{
|
||||||
|
UserId = userId,
|
||||||
|
WeekDefinitionId = request.WeekDefinitionId,
|
||||||
|
OnlyActive = request.OnlyActive,
|
||||||
|
PaginationState = request.PaginationState
|
||||||
|
};
|
||||||
|
|
||||||
|
return await _mediator.Send(query, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetAllClubMemberships;
|
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetAllClubMemberships;
|
||||||
|
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
|
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
|
||||||
using CMSMicroservice.Protobuf.Protos.ClubMembership;
|
using CMSMicroservice.Protobuf.Protos.ClubMembership;
|
||||||
using Google.Protobuf.WellKnownTypes;
|
using Google.Protobuf.WellKnownTypes;
|
||||||
@@ -11,6 +12,37 @@ public class ClubMembershipProfile : IRegister
|
|||||||
{
|
{
|
||||||
public void Register(TypeAdapterConfig config)
|
public void Register(TypeAdapterConfig config)
|
||||||
{
|
{
|
||||||
|
// =====================
|
||||||
|
// GetClubMembership
|
||||||
|
// =====================
|
||||||
|
|
||||||
|
// GetClubMembershipRequest -> GetClubMembershipQuery
|
||||||
|
config.NewConfig<GetClubMembershipRequest, GetClubMembershipQuery>()
|
||||||
|
.MapWith(src => new GetClubMembershipQuery
|
||||||
|
{
|
||||||
|
UserId = src.UserId
|
||||||
|
});
|
||||||
|
|
||||||
|
// ClubMembershipDto -> GetClubMembershipResponse
|
||||||
|
config.NewConfig<ClubMembershipDto, GetClubMembershipResponse>()
|
||||||
|
.MapWith(src => new GetClubMembershipResponse
|
||||||
|
{
|
||||||
|
Id = src.Id,
|
||||||
|
UserId = src.UserId,
|
||||||
|
PackageId = 0, // Not available
|
||||||
|
PackageName = string.Empty, // Not available
|
||||||
|
ActivationCode = string.Empty, // Not available
|
||||||
|
ActivatedAt = src.ActivatedAt.HasValue
|
||||||
|
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.ActivatedAt.Value, DateTimeKind.Utc))
|
||||||
|
: null,
|
||||||
|
ExpiresAt = null, // Not available
|
||||||
|
IsActive = src.IsActive,
|
||||||
|
Created = Timestamp.FromDateTimeOffset(src.Created),
|
||||||
|
Features = { }, // Empty for now
|
||||||
|
Status = src.IsActive ? "Active" : "Inactive",
|
||||||
|
DaysRemaining = 0 // Calculate if ExpiresAt is available
|
||||||
|
});
|
||||||
|
|
||||||
// =====================
|
// =====================
|
||||||
// GetAllClubMemberships
|
// GetAllClubMemberships
|
||||||
// =====================
|
// =====================
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
using System.Linq;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
||||||
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserCommissionPayouts;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserCommissionPayouts;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetMyCommissionPayouts;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetMyCommissionPayouts;
|
||||||
@@ -159,5 +161,44 @@ public class CommissionProfile : IRegister
|
|||||||
? Timestamp.FromDateTime(src.CalculatedDate.Value.ToUniversalTime())
|
? Timestamp.FromDateTime(src.CalculatedDate.Value.ToUniversalTime())
|
||||||
: null)
|
: null)
|
||||||
.Map(dest => dest.DatePersian, src => src.DatePersian);
|
.Map(dest => dest.DatePersian, src => src.DatePersian);
|
||||||
|
|
||||||
|
// GetMyWeeklyBalances Request Mapping
|
||||||
|
config.NewConfig<GetMyWeeklyBalancesRequest, GetMyWeeklyBalancesQuery>()
|
||||||
|
.Map(dest => dest.WeekDefinitionId, src => src.WeekDefinitionId != null ? src.WeekDefinitionId.Value : (long?)null)
|
||||||
|
.Map(dest => dest.OnlyActive, src => src.OnlyActive)
|
||||||
|
.Map(dest => dest.PaginationState, src => new PaginationState
|
||||||
|
{
|
||||||
|
PageNumber = src.PageNumber > 0 ? src.PageNumber : 1,
|
||||||
|
PageSize = src.PageSize > 0 ? src.PageSize : 10
|
||||||
|
});
|
||||||
|
|
||||||
|
// GetMyWeeklyBalances Response Mapping
|
||||||
|
config.NewConfig<GetUserWeeklyBalancesResponseDto, GetMyWeeklyBalancesResponse>()
|
||||||
|
.Map(dest => dest.MetaData, src => src.MetaData != null
|
||||||
|
? new CustomerMetaData { TotalCount = src.MetaData.TotalCount }
|
||||||
|
: new CustomerMetaData())
|
||||||
|
.Map(dest => dest.Balances, src => src.Models)
|
||||||
|
.Map(dest => dest.TotalLeftBalances, src => src.Models.Sum(m => m.LeftLegTotal))
|
||||||
|
.Map(dest => dest.TotalRightBalances, src => src.Models.Sum(m => m.RightLegTotal))
|
||||||
|
.Map(dest => dest.WeakerLeg, src =>
|
||||||
|
src.Models.Sum(m => m.LeftLegTotal) < src.Models.Sum(m => m.RightLegTotal)
|
||||||
|
? "Left"
|
||||||
|
: src.Models.Sum(m => m.LeftLegTotal) > src.Models.Sum(m => m.RightLegTotal)
|
||||||
|
? "Right"
|
||||||
|
: "Equal");
|
||||||
|
|
||||||
|
// CustomerWeeklyBalanceModel Mapping
|
||||||
|
config.NewConfig<GetUserWeeklyBalancesResponseModel, CustomerWeeklyBalanceModel>()
|
||||||
|
.Map(dest => dest.Id, src => src.Id)
|
||||||
|
.Map(dest => dest.WeekDefinitionId, src => src.WeekDefinitionId)
|
||||||
|
.Map(dest => dest.WeekDisplayName, src => src.WeekDisplayName)
|
||||||
|
.Map(dest => dest.LeftLegBalances, src => src.LeftLegTotal)
|
||||||
|
.Map(dest => dest.RightLegBalances, src => src.RightLegTotal)
|
||||||
|
.Map(dest => dest.TotalBalances, src => src.TotalBalances)
|
||||||
|
.Map(dest => dest.WeeklyPoolContribution, src => src.WeeklyPoolContribution)
|
||||||
|
.Map(dest => dest.IsExpired, src => src.IsExpired)
|
||||||
|
.Map(dest => dest.CalculatedAt, src => src.CalculatedAt.HasValue
|
||||||
|
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.CalculatedAt.Value, DateTimeKind.Utc))
|
||||||
|
: null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using CMSMicroservice.Application.Common.Interfaces;
|
||||||
using CMSMicroservice.Protobuf.Protos.ClubMembership;
|
using CMSMicroservice.Protobuf.Protos.ClubMembership;
|
||||||
using CMSMicroservice.WebApi.Common.Services;
|
using CMSMicroservice.WebApi.Common.Services;
|
||||||
using CMSMicroservice.Application.ClubMembershipCQ.Commands.ActivateClubMembership;
|
using CMSMicroservice.Application.ClubMembershipCQ.Commands.ActivateClubMembership;
|
||||||
@@ -10,16 +11,24 @@ using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembershipHist
|
|||||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
|
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
|
||||||
using CMSMicroservice.Application.ClubFeatureCQ.Queries.GetUserClubFeatures;
|
using CMSMicroservice.Application.ClubFeatureCQ.Queries.GetUserClubFeatures;
|
||||||
using CMSMicroservice.Application.ClubFeatureCQ.Commands.ToggleUserClubFeature;
|
using CMSMicroservice.Application.ClubFeatureCQ.Commands.ToggleUserClubFeature;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace CMSMicroservice.WebApi.Services;
|
namespace CMSMicroservice.WebApi.Services;
|
||||||
|
|
||||||
public class ClubMembershipService : ClubMembershipContract.ClubMembershipContractBase
|
public class ClubMembershipService : ClubMembershipContract.ClubMembershipContractBase
|
||||||
{
|
{
|
||||||
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
|
private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;
|
||||||
|
private readonly ICurrentUserService _currentUserService;
|
||||||
|
private readonly ILogger<ClubMembershipService> _logger;
|
||||||
|
|
||||||
public ClubMembershipService(IDispatchRequestToCQRS dispatchRequestToCQRS)
|
public ClubMembershipService(
|
||||||
|
IDispatchRequestToCQRS dispatchRequestToCQRS,
|
||||||
|
ICurrentUserService currentUserService,
|
||||||
|
ILogger<ClubMembershipService> logger)
|
||||||
{
|
{
|
||||||
_dispatchRequestToCQRS = dispatchRequestToCQRS;
|
_dispatchRequestToCQRS = dispatchRequestToCQRS;
|
||||||
|
_currentUserService = currentUserService;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<Empty> ActivateClubMembership(ActivateClubMembershipRequest request, ServerCallContext context)
|
public override async Task<Empty> ActivateClubMembership(ActivateClubMembershipRequest request, ServerCallContext context)
|
||||||
@@ -39,6 +48,25 @@ public class ClubMembershipService : ClubMembershipContract.ClubMembershipContra
|
|||||||
|
|
||||||
public override async Task<GetClubMembershipResponse> GetClubMembership(GetClubMembershipRequest request, ServerCallContext context)
|
public override async Task<GetClubMembershipResponse> GetClubMembership(GetClubMembershipRequest request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
|
// اگر UserId در request نیست یا صفر است، از JWT بخوان
|
||||||
|
if (request.UserId <= 0)
|
||||||
|
{
|
||||||
|
if (long.TryParse(_currentUserService.UserId, out var tokenUserId) && tokenUserId > 0)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("GetClubMembership: Reading UserId from JWT token: {UserId}", tokenUserId);
|
||||||
|
request = new GetClubMembershipRequest { UserId = tokenUserId };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.LogWarning("GetClubMembership: No valid UserId in request or JWT token");
|
||||||
|
throw new RpcException(new Status(StatusCode.Unauthenticated, "کاربر احراز هویت نشده است"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.LogInformation("GetClubMembership: Using UserId from request: {UserId}", request.UserId);
|
||||||
|
}
|
||||||
|
|
||||||
return await _dispatchRequestToCQRS.Handle<GetClubMembershipRequest, GetClubMembershipQuery, GetClubMembershipResponse>(request, context);
|
return await _dispatchRequestToCQRS.Handle<GetClubMembershipRequest, GetClubMembershipQuery, GetClubMembershipResponse>(request, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ using CMSMicroservice.Application.CommissionCQ.Queries.GetWeeklyCommissionPool;
|
|||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserCommissionPayouts;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserCommissionPayouts;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetCommissionPayoutHistory;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetCommissionPayoutHistory;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
||||||
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetMyWeeklyBalances;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAllWeeklyPools;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetAllWeeklyPools;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWithdrawalRequests;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetWithdrawalRequests;
|
||||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerStatus;
|
using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerStatus;
|
||||||
@@ -134,4 +135,9 @@ public class CommissionService : CommissionContract.CommissionContractBase
|
|||||||
{
|
{
|
||||||
return await _dispatchRequestToCQRS.Handle<GetWithdrawalReportsRequest, GetWithdrawalReportsQuery, GetWithdrawalReportsResponse>(request, context);
|
return await _dispatchRequestToCQRS.Handle<GetWithdrawalReportsRequest, GetWithdrawalReportsQuery, GetWithdrawalReportsResponse>(request, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override async Task<GetMyWeeklyBalancesResponse> GetMyWeeklyBalances(GetMyWeeklyBalancesRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return await _dispatchRequestToCQRS.Handle<GetMyWeeklyBalancesRequest, GetMyWeeklyBalancesQuery, GetMyWeeklyBalancesResponse>(request, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
|
using CMSMicroservice.Application.ClubFeatureCQ.Queries.GetUserClubFeatures;
|
||||||
|
using CMSMicroservice.Application.Common.Interfaces;
|
||||||
using CMSMicroservice.Domain.Common;
|
using CMSMicroservice.Domain.Common;
|
||||||
using CMSMicroservice.Protobuf.Protos.Configuration;
|
using CMSMicroservice.Protobuf.Protos.Configuration;
|
||||||
using Google.Protobuf.WellKnownTypes;
|
using Google.Protobuf.WellKnownTypes;
|
||||||
using Grpc.Core;
|
using Grpc.Core;
|
||||||
|
using MediatR;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace CMSMicroservice.WebApi.Services;
|
namespace CMSMicroservice.WebApi.Services;
|
||||||
@@ -12,10 +15,17 @@ namespace CMSMicroservice.WebApi.Services;
|
|||||||
public class ConfigurationService : ConfigurationContract.ConfigurationContractBase
|
public class ConfigurationService : ConfigurationContract.ConfigurationContractBase
|
||||||
{
|
{
|
||||||
private readonly ILogger<ConfigurationService> _logger;
|
private readonly ILogger<ConfigurationService> _logger;
|
||||||
|
private readonly ICurrentUserService _currentUserService;
|
||||||
|
private readonly IMediator _mediator;
|
||||||
|
|
||||||
public ConfigurationService(ILogger<ConfigurationService> logger)
|
public ConfigurationService(
|
||||||
|
ILogger<ConfigurationService> logger,
|
||||||
|
ICurrentUserService currentUserService,
|
||||||
|
IMediator mediator)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_currentUserService = currentUserService;
|
||||||
|
_mediator = mediator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -41,6 +51,61 @@ public class ConfigurationService : ConfigurationContract.ConfigurationContractB
|
|||||||
return Task.FromResult(response);
|
return Task.FromResult(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت تنظیمات باشگاه مشتریان
|
||||||
|
/// </summary>
|
||||||
|
public override Task<GetClubConfigurationResponse> GetClubConfiguration(Empty request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
var response = new GetClubConfigurationResponse
|
||||||
|
{
|
||||||
|
ActivationFee = SystemConstants.ClubActivationFee,
|
||||||
|
MembershipGiftValue = SystemConstants.ClubMembershipGiftValue
|
||||||
|
};
|
||||||
|
|
||||||
|
_logger.LogDebug("Club configuration requested: ActivationFee={ActivationFee}, GiftValue={GiftValue}",
|
||||||
|
response.ActivationFee, response.MembershipGiftValue);
|
||||||
|
|
||||||
|
return Task.FromResult(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت ویژگیهای باشگاه مشتریان برای کاربر جاری
|
||||||
|
/// </summary>
|
||||||
|
public override async Task<GetClubFeaturesResponse> GetClubFeatures(Empty request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
// دریافت UserId از JWT
|
||||||
|
if (!long.TryParse(_currentUserService.UserId, out var userId) || userId <= 0)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("GetClubFeatures called without valid user authentication");
|
||||||
|
return new GetClubFeaturesResponse(); // لیست خالی برای کاربران غیر احراز هویت شده
|
||||||
|
}
|
||||||
|
|
||||||
|
// فراخوانی GetUserClubFeatures از طریق MediatR (CQRS داخلی)
|
||||||
|
var query = new GetUserClubFeaturesQuery { UserId = userId };
|
||||||
|
var userFeatures = await _mediator.Send(query, context.CancellationToken);
|
||||||
|
|
||||||
|
// تبدیل به فرمت GetClubFeaturesResponse
|
||||||
|
var response = new GetClubFeaturesResponse();
|
||||||
|
foreach (var feature in userFeatures)
|
||||||
|
{
|
||||||
|
response.Features.Add(new ClubFeatureModel
|
||||||
|
{
|
||||||
|
Id = feature.ClubFeatureId,
|
||||||
|
Title = feature.FeatureTitle ?? string.Empty,
|
||||||
|
Description = feature.FeatureDescription ?? string.Empty,
|
||||||
|
IsEnabled = feature.IsActive,
|
||||||
|
DisplayOrder = feature.SortOrder,
|
||||||
|
GrantedAt = Timestamp.FromDateTime(DateTime.SpecifyKind(feature.GrantedAt, DateTimeKind.Utc)),
|
||||||
|
CreatedAt = Timestamp.FromDateTime(DateTime.SpecifyKind(feature.CreatedAt, DateTimeKind.Utc)),
|
||||||
|
Notes = feature.Notes ?? string.Empty
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug("Club features requested for user {UserId}: {Count} features returned", userId, response.Features.Count);
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// دریافت تمام تنظیمات
|
/// دریافت تمام تنظیمات
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user