feat: add IsActive field to UserClubFeatures for admin management
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
using CMSMicroservice.Application.ClubFeatureCQ.Commands.ToggleUserClubFeature;
|
||||
using CMSMicroservice.Application.ClubFeatureCQ.Queries.GetUserClubFeatures;
|
||||
using CMSMicroservice.Protobuf.Protos.ClubMembership;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Common.Mappings;
|
||||
|
||||
public class ClubFeatureProfile : IRegister
|
||||
{
|
||||
void IRegister.Register(TypeAdapterConfig config)
|
||||
{
|
||||
// GetUserClubFeaturesRequest → GetUserClubFeaturesQuery
|
||||
config.NewConfig<GetUserClubFeaturesRequest, GetUserClubFeaturesQuery>()
|
||||
.Map(dest => dest.UserId, src => src.UserId);
|
||||
|
||||
// UserClubFeatureDto → UserClubFeatureModel
|
||||
config.NewConfig<UserClubFeatureDto, UserClubFeatureModel>()
|
||||
.Map(dest => dest.Id, src => src.Id)
|
||||
.Map(dest => dest.UserId, src => src.UserId)
|
||||
.Map(dest => dest.ClubMembershipId, src => src.ClubMembershipId)
|
||||
.Map(dest => dest.ClubFeatureId, src => src.ClubFeatureId)
|
||||
.Map(dest => dest.FeatureTitle, src => src.FeatureTitle)
|
||||
.Map(dest => dest.FeatureDescription, src => src.FeatureDescription ?? "")
|
||||
.Map(dest => dest.IsActive, src => src.IsActive)
|
||||
.Map(dest => dest.GrantedAt, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.GrantedAt, DateTimeKind.Utc)))
|
||||
.Map(dest => dest.Notes, src => src.Notes ?? "");
|
||||
|
||||
// List<UserClubFeatureDto> → GetUserClubFeaturesResponse
|
||||
config.NewConfig<List<UserClubFeatureDto>, GetUserClubFeaturesResponse>()
|
||||
.Map(dest => dest.Features, src => src.Adapt<List<UserClubFeatureModel>>());
|
||||
|
||||
// ToggleUserClubFeatureRequest → ToggleUserClubFeatureCommand
|
||||
config.NewConfig<ToggleUserClubFeatureRequest, ToggleUserClubFeatureCommand>()
|
||||
.Map(dest => dest.UserId, src => src.UserId)
|
||||
.Map(dest => dest.ClubFeatureId, src => src.ClubFeatureId)
|
||||
.Map(dest => dest.IsActive, src => src.IsActive);
|
||||
|
||||
// ToggleUserClubFeatureResponse (App) → ToggleUserClubFeatureResponse (Proto)
|
||||
config.NewConfig<Application.ClubFeatureCQ.Commands.ToggleUserClubFeature.ToggleUserClubFeatureResponse, Protobuf.Protos.ClubMembership.ToggleUserClubFeatureResponse>()
|
||||
.Map(dest => dest.Success, src => src.Success)
|
||||
.Map(dest => dest.Message, src => src.Message)
|
||||
.Map(dest => dest.UserClubFeatureId, src => src.UserClubFeatureId.HasValue ? (long?)src.UserClubFeatureId.Value : null)
|
||||
.Map(dest => dest.IsActive, src => src.IsActive.HasValue ? (bool?)src.IsActive.Value : null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
||||
using CMSMicroservice.Protobuf.Protos.Commission;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Mapster;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Common.Mappings;
|
||||
|
||||
public class CommissionProfile : IRegister
|
||||
{
|
||||
public void Register(TypeAdapterConfig config)
|
||||
{
|
||||
// GetAvailableWeeks Request Mapping
|
||||
config.NewConfig<GetAvailableWeeksRequest, GetAvailableWeeksQuery>()
|
||||
.Map(dest => dest.FutureWeeksCount, src => src.FutureWeeksCount > 0 ? src.FutureWeeksCount : 4)
|
||||
.Map(dest => dest.PastWeeksCount, src => src.PastWeeksCount > 0 ? src.PastWeeksCount : 12);
|
||||
|
||||
// GetAvailableWeeks Response Mapping
|
||||
config.NewConfig<GetAvailableWeeksResponseDto, GetAvailableWeeksResponse>()
|
||||
.Map(dest => dest.CurrentWeek, src => src.CurrentWeek)
|
||||
.Map(dest => dest.CalculatedWeeks, src => src.CalculatedWeeks)
|
||||
.Map(dest => dest.PendingWeeks, src => src.PendingWeeks)
|
||||
.Map(dest => dest.FutureWeeks, src => src.FutureWeeks);
|
||||
|
||||
// WeekInfo Mapping
|
||||
config.NewConfig<WeekInfoDto, WeekInfo>()
|
||||
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
|
||||
.Map(dest => dest.StartDate, src => Timestamp.FromDateTime(src.StartDate.ToUniversalTime()))
|
||||
.Map(dest => dest.EndDate, src => Timestamp.FromDateTime(src.EndDate.ToUniversalTime()))
|
||||
.Map(dest => dest.IsCalculated, src => src.IsCalculated)
|
||||
.Map(dest => dest.CalculatedAt, src => src.CalculatedAt.HasValue
|
||||
? Timestamp.FromDateTime(src.CalculatedAt.Value.ToUniversalTime())
|
||||
: null)
|
||||
.Map(dest => dest.LastExecutionStatus, src => src.LastExecutionStatus ?? string.Empty)
|
||||
.Map(dest => dest.TotalPoolAmount, src => src.TotalPoolAmount ?? 0)
|
||||
.Map(dest => dest.EligibleUsersCount, src => src.EligibleUsersCount ?? 0)
|
||||
.Map(dest => dest.DisplayText, src => src.DisplayText);
|
||||
}
|
||||
}
|
||||
@@ -38,9 +38,9 @@ public class AdminController : ControllerBase
|
||||
{
|
||||
_logger.LogInformation("🔧 Manual trigger requested by admin for week: {WeekNumber}", weekNumber ?? "previous");
|
||||
|
||||
// Enqueue immediate job execution
|
||||
// Enqueue immediate job execution with specified week number
|
||||
var jobId = _backgroundJobClient.Enqueue<WeeklyCommissionJob>(
|
||||
job => job.ExecuteAsync(CancellationToken.None));
|
||||
job => job.ExecuteAsync(weekNumber, CancellationToken.None));
|
||||
|
||||
_logger.LogInformation("✅ Job enqueued with ID: {JobId}", jobId);
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ using (var scope = app.Services.CreateScope())
|
||||
// Weekly Commission Calculation: Every Sunday at 00:05 (UTC)
|
||||
recurringJobManager.AddOrUpdate<CMSMicroservice.Infrastructure.BackgroundJobs.WeeklyCommissionJob>(
|
||||
recurringJobId: "weekly-commission-calculation",
|
||||
methodCall: job => job.ExecuteAsync(CancellationToken.None),
|
||||
methodCall: job => job.ExecuteAsync(null, CancellationToken.None),
|
||||
cronExpression: "5 0 * * 0", // Sunday at 00:05
|
||||
options: new RecurringJobOptions
|
||||
{
|
||||
|
||||
@@ -7,6 +7,8 @@ using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetAllClubMemberships;
|
||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembershipHistory;
|
||||
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
|
||||
using CMSMicroservice.Application.ClubFeatureCQ.Queries.GetUserClubFeatures;
|
||||
using CMSMicroservice.Application.ClubFeatureCQ.Commands.ToggleUserClubFeature;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Services;
|
||||
|
||||
@@ -53,4 +55,14 @@ public class ClubMembershipService : ClubMembershipContract.ClubMembershipContra
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetClubStatisticsRequest, GetClubStatisticsQuery, GetClubStatisticsResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetUserClubFeaturesResponse> GetUserClubFeatures(GetUserClubFeaturesRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetUserClubFeaturesRequest, GetUserClubFeaturesQuery, GetUserClubFeaturesResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<Protobuf.Protos.ClubMembership.ToggleUserClubFeatureResponse> ToggleUserClubFeature(ToggleUserClubFeatureRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<ToggleUserClubFeatureRequest, ToggleUserClubFeatureCommand, Protobuf.Protos.ClubMembership.ToggleUserClubFeatureResponse>(request, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ using CMSMicroservice.Application.CommissionCQ.Queries.GetWithdrawalRequests;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerStatus;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerExecutionLogs;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWithdrawalReports;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Services;
|
||||
|
||||
@@ -112,6 +113,11 @@ public class CommissionService : CommissionContract.CommissionContractBase
|
||||
return await _dispatchRequestToCQRS.Handle<GetWorkerExecutionLogsRequest, GetWorkerExecutionLogsQuery, GetWorkerExecutionLogsResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetAvailableWeeksResponse> GetAvailableWeeks(GetAvailableWeeksRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetAvailableWeeksRequest, GetAvailableWeeksQuery, GetAvailableWeeksResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetWithdrawalReportsResponse> GetWithdrawalReports(GetWithdrawalReportsRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetWithdrawalReportsRequest, GetWithdrawalReportsQuery, GetWithdrawalReportsResponse>(request, context);
|
||||
|
||||
@@ -42,7 +42,6 @@ public class NetworkMembershipService : NetworkMembershipContract.NetworkMembers
|
||||
public override async Task<GetNetworkTreeResponse> GetNetworkTree(GetNetworkTreeRequest request, ServerCallContext context)
|
||||
{
|
||||
|
||||
var x=request.Adapt<GetNetworkTreeQuery>();
|
||||
return await _dispatchRequestToCQRS.Handle<GetNetworkTreeRequest, GetNetworkTreeQuery, GetNetworkTreeResponse>(request, context);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class DayaLoanCheckWorker
|
||||
[AutomaticRetry(Attempts = 3)]
|
||||
public async Task ExecuteAsync()
|
||||
{
|
||||
_logger.LogInformation("DayaLoanCheckWorker started at {Time}", DateTime.UtcNow);
|
||||
_logger.LogInformation("DayaLoanCheckWorker started at {Time}", DateTime.Now);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -114,7 +114,7 @@ public class DayaLoanCheckWorker
|
||||
recurringJobManager.AddOrUpdate<DayaLoanCheckWorker>(
|
||||
"daya-loan-check",
|
||||
worker => worker.ExecuteAsync(),
|
||||
"*/15 * * * *", // هر 15 دقیقه
|
||||
"*/01 * * * *", // هر 15 دقیقه
|
||||
TimeZoneInfo.Local
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user