feat: refactor week number handling to use WeekDefinitionId across multiple entities and queries
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserWeeklyBalances;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetUserCommissionPayouts;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions;
|
||||
using CMSMicroservice.Application.Common.Models;
|
||||
using CMSMicroservice.Protobuf.Protos.Commission;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Mapster;
|
||||
using AppWeekFilter = CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions.GetWeekDefinitionsFilter;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Common.Mappings;
|
||||
|
||||
@@ -24,7 +28,8 @@ public class CommissionProfile : IRegister
|
||||
|
||||
// WeekInfo Mapping
|
||||
config.NewConfig<WeekInfoDto, WeekInfo>()
|
||||
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
|
||||
.Map(dest => dest.WeekDefinitionId, src => src.WeekDefinitionId)
|
||||
.Map(dest => dest.DisplayName, src => src.DisplayName)
|
||||
.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)
|
||||
@@ -40,9 +45,10 @@ public class CommissionProfile : IRegister
|
||||
// GetUserCommissionPayouts Response Model Mapping
|
||||
config.NewConfig<GetUserCommissionPayoutsResponseModel, UserCommissionPayoutModel>()
|
||||
.Map(dest => dest.Id, src => src.Id)
|
||||
.Map(dest => dest.WeekDefinitionId, src => src.WeekDefinitionId)
|
||||
.Map(dest => dest.UserId, src => src.UserId)
|
||||
.Map(dest => dest.UserName, src => $"{src.FirstName} {src.LastName}")
|
||||
.Map(dest => dest.WeekNumber, src => src.WeekNumber)
|
||||
.Map(dest => dest.WeekDisplayName, src => src.WeekDisplayName)
|
||||
.Map(dest => dest.WeeklyPoolId, src => src.WeeklyPoolId)
|
||||
.Map(dest => dest.BalancesEarned, src => src.BalancesEarned)
|
||||
.Map(dest => dest.ValuePerBalance, src => src.ValuePerBalance)
|
||||
@@ -59,5 +65,58 @@ public class CommissionProfile : IRegister
|
||||
? Timestamp.FromDateTime(src.WithdrawnAt.Value.ToUniversalTime())
|
||||
: null)
|
||||
.Map(dest => dest.Created, src => Timestamp.FromDateTimeOffset(src.Created));
|
||||
|
||||
// GetWeekDefinitions Request Mapping
|
||||
config.NewConfig<GetWeekDefinitionsRequest, GetWeekDefinitionsQuery>()
|
||||
.Map(dest => dest.PaginationState, src => src.PaginationState != null
|
||||
? new PaginationState { PageNumber = src.PaginationState.PageNumber, PageSize = src.PaginationState.PageSize }
|
||||
: null)
|
||||
.Map(dest => dest.SortBy, src => src.SortBy)
|
||||
.Map(dest => dest.Filter, src => src.Filter != null
|
||||
? new AppWeekFilter
|
||||
{
|
||||
SearchText = src.Filter.SearchText,
|
||||
WeekOrder = src.Filter.WeekOrder,
|
||||
GregorianWeekNumber = src.Filter.GregorianWeekNumber,
|
||||
PersianWeekNumber = src.Filter.PersianWeekNumber,
|
||||
GregorianYear = src.Filter.GregorianYear,
|
||||
PersianYear = src.Filter.PersianYear,
|
||||
IsActive = src.Filter.IsActive
|
||||
}
|
||||
: null);
|
||||
|
||||
// GetWeekDefinitions Response Mapping
|
||||
config.NewConfig<GetWeekDefinitionsResponseDto, GetWeekDefinitionsResponse>()
|
||||
.Map(dest => dest.TotalCount, src => src.TotalCount)
|
||||
.Map(dest => dest.Data, src => src.Data);
|
||||
|
||||
// WeekDefinitionItem Mapping
|
||||
config.NewConfig<WeekDefinitionItemDto, WeekDefinitionItem>()
|
||||
.Map(dest => dest.WeekOrder, src => src.WeekOrder)
|
||||
.Map(dest => dest.DisplayName, src => src.DisplayName)
|
||||
.Map(dest => dest.GregorianWeekNumber, src => src.GregorianWeekNumber)
|
||||
.Map(dest => dest.PersianWeekNumber, src => src.PersianWeekNumber)
|
||||
.Map(dest => dest.StartDate, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.StartDate, DateTimeKind.Utc)))
|
||||
.Map(dest => dest.EndDate, src => Timestamp.FromDateTime(DateTime.SpecifyKind(src.EndDate, DateTimeKind.Utc)))
|
||||
.Map(dest => dest.GregorianYear, src => src.GregorianYear)
|
||||
.Map(dest => dest.PersianYear, src => src.PersianYear)
|
||||
.Map(dest => dest.IsActive, src => src.IsActive)
|
||||
.Map(dest => dest.IsCurrentWeek, src => src.IsCurrentWeek);
|
||||
|
||||
// GetUserWeeklyBalances Response Model Mapping
|
||||
config.NewConfig<GetUserWeeklyBalancesResponseModel, UserWeeklyBalanceModel>()
|
||||
.Map(dest => dest.Id, src => src.Id)
|
||||
.Map(dest => dest.UserId, src => src.UserId)
|
||||
.Map(dest => dest.WeekDefinitionId, src => src.WeekDefinitionId)
|
||||
.Map(dest => dest.WeekDisplayName, src => src.WeekDisplayName)
|
||||
.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.CalculatedAt, src => src.CalculatedAt.HasValue
|
||||
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.CalculatedAt.Value, DateTimeKind.Utc))
|
||||
: null)
|
||||
.Map(dest => dest.IsExpired, src => src.IsExpired)
|
||||
.Map(dest => dest.Created, src => Timestamp.FromDateTimeOffset(src.Created));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,13 +34,13 @@ public class AdminController : ControllerBase
|
||||
/// <param name="weekNumber">Week number in YYYY-Www format (e.g., 2025-W48). If null, uses previous week.</param>
|
||||
/// <returns>Job ID for tracking</returns>
|
||||
[HttpPost("trigger-weekly-calculation")]
|
||||
public IActionResult TriggerWeeklyCalculation([FromQuery] string? weekNumber = null)
|
||||
public IActionResult TriggerWeeklyCalculation([FromQuery] long? weekDefinitionId = null)
|
||||
{
|
||||
_logger.LogInformation("🔧 Manual trigger requested by admin for week: {WeekNumber}", weekNumber ?? "previous");
|
||||
_logger.LogInformation("🔧 Manual trigger requested by admin for WeekDefinitionId: {WeekDefinitionId}", weekDefinitionId?.ToString() ?? "previous");
|
||||
|
||||
// Enqueue immediate job execution with specified week number
|
||||
// Enqueue immediate job execution with specified week
|
||||
var jobId = _backgroundJobClient.Enqueue<WeeklyCommissionJob>(
|
||||
job => job.ExecuteAsync(weekNumber, CancellationToken.None));
|
||||
job => job.ExecuteAsync(weekDefinitionId, CancellationToken.None));
|
||||
|
||||
_logger.LogInformation("✅ Job enqueued with ID: {JobId}", jobId);
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using CMSMicroservice.Infrastructure.Persistence;
|
||||
using CMSMicroservice.Infrastructure.Data.Seeding;
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.WebApi.Hubs;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
@@ -144,6 +145,11 @@ if (app.Environment.IsDevelopment())
|
||||
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
|
||||
var migrationSeeder = new NetworkParentIdMigrationSeeder(dbContext, migrationLogger);
|
||||
await migrationSeeder.SeedAsync();
|
||||
|
||||
// Seed WeekDefinitions (هفتهها)
|
||||
var weekSeederLogger = scope.ServiceProvider.GetRequiredService<ILogger<WeekDefinitionSeeder>>();
|
||||
var weekSeeder = new WeekDefinitionSeeder(dbContext, weekSeederLogger);
|
||||
await weekSeeder.SeedAsync();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -152,6 +158,10 @@ else
|
||||
app.UseHsts();
|
||||
}
|
||||
|
||||
// Load WeekDefinition cache (برای هر دو محیط Development و Production)
|
||||
var weekDefinitionRepository = app.Services.GetRequiredService<IWeekDefinitionRepository>();
|
||||
await weekDefinitionRepository.ReloadCacheAsync();
|
||||
|
||||
|
||||
app.UseRouting();
|
||||
app.UseCors("AllowAll");
|
||||
|
||||
@@ -18,6 +18,7 @@ using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerStatus;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWorkerExecutionLogs;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWithdrawalReports;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetAvailableWeeks;
|
||||
using CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions;
|
||||
|
||||
namespace CMSMicroservice.WebApi.Services;
|
||||
|
||||
@@ -118,6 +119,11 @@ public class CommissionService : CommissionContract.CommissionContractBase
|
||||
return await _dispatchRequestToCQRS.Handle<GetAvailableWeeksRequest, GetAvailableWeeksQuery, GetAvailableWeeksResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetWeekDefinitionsResponse> GetWeekDefinitions(GetWeekDefinitionsRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetWeekDefinitionsRequest, GetWeekDefinitionsQuery, GetWeekDefinitionsResponse>(request, context);
|
||||
}
|
||||
|
||||
public override async Task<GetWithdrawalReportsResponse> GetWithdrawalReports(GetWithdrawalReportsRequest request, ServerCallContext context)
|
||||
{
|
||||
return await _dispatchRequestToCQRS.Handle<GetWithdrawalReportsRequest, GetWithdrawalReportsQuery, GetWithdrawalReportsResponse>(request, context);
|
||||
|
||||
Reference in New Issue
Block a user