feat(club-membership): enhance club membership history queries and responses
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 17m54s

- Added filtering capabilities to GetClubMembershipHistoryQuery, allowing optional filters for UserId, ClubMembershipId, Action, and date range.
- Updated GetClubMembershipHistoryQueryHandler to utilize the new filter structure.
- Enhanced GetAllClubMembershipsQueryHandler to include LastPackage details in the response.
- Introduced new properties in GetAllClubMembershipsResponseModel for PackageId and PackageName.
- Updated Protobuf definitions to reflect changes in club membership history queries and responses.
- Refactored mapping configurations to accommodate new DTOs and filters.
This commit is contained in:
masoodafar-web
2026-06-22 22:19:44 +03:30
parent 6395f63ab5
commit f8794bbb63
41 changed files with 1590 additions and 74 deletions
@@ -0,0 +1,81 @@
using CMSMicroservice.Application.ClubMembershipCycleHistoryCQ.Queries.GetAllClubMembershipCycleHistoryByFilter;
using CMSMicroservice.Protobuf.Protos.ClubMembershipCycleHistory;
using Google.Protobuf.WellKnownTypes;
using Mapster;
namespace CMSMicroservice.WebApi.Common.Mappings;
public class ClubMembershipCycleHistoryProfile : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.NewConfig<GetAllClubMembershipCycleHistoryByFilterRequest, GetAllClubMembershipCycleHistoryByFilterQuery>()
.MapWith(src => new GetAllClubMembershipCycleHistoryByFilterQuery
{
PaginationState = MapPagination(src.PaginationState),
SortBy = src.HasSortBy ? src.SortBy : null,
Filter = MapFilter(src.Filter)
});
config.NewConfig<GetAllClubMembershipCycleHistoryByFilterResponseDto, GetAllClubMembershipCycleHistoryByFilterResponse>()
.MapWith(src => new GetAllClubMembershipCycleHistoryByFilterResponse
{
MetaData = MapMeta(src.MetaData),
Models = { src.Models?.Select(MapModel) ?? [] }
});
}
private static GetAllClubMembershipCycleHistoryByFilterFilter? MapFilter(GetAllClubMembershipCycleHistoryByFilterFilter? src)
{
if (src == null) return null;
return new GetAllClubMembershipCycleHistoryByFilterFilter
{
UserId = src.HasUserId ? src.UserId : null,
ClubMembershipCycleId = src.HasClubMembershipCycleId ? src.ClubMembershipCycleId : null,
CycleNumber = src.HasCycleNumber ? src.CycleNumber : null,
Action = src.HasAction ? (Domain.Enums.ClubMembershipCycleAction)src.Action : null,
CreatedFrom = src.CreatedFrom?.ToDateTime(),
CreatedTo = src.CreatedTo?.ToDateTime()
};
}
private static ClubMembershipCycleHistoryModel MapModel(GetAllClubMembershipCycleHistoryByFilterResponseModel m) =>
new()
{
Id = m.Id,
ClubMembershipCycleId = m.ClubMembershipCycleId,
UserId = m.UserId,
UserName = m.UserName,
CycleNumber = m.CycleNumber,
OldIsCurrentCycle = m.OldIsCurrentCycle,
NewIsCurrentCycle = m.NewIsCurrentCycle,
OldMagicStartedAt = m.OldMagicStartedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.OldMagicStartedAt.Value, DateTimeKind.Utc)) : null,
NewMagicStartedAt = m.NewMagicStartedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.NewMagicStartedAt.Value, DateTimeKind.Utc)) : null,
OldMagicCompletedAt = m.OldMagicCompletedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.OldMagicCompletedAt.Value, DateTimeKind.Utc)) : null,
NewMagicCompletedAt = m.NewMagicCompletedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.NewMagicCompletedAt.Value, DateTimeKind.Utc)) : null,
Action = (int)m.Action,
PerformedBy = m.PerformedBy ?? string.Empty,
Reason = m.Reason ?? string.Empty,
CreatedAt = Timestamp.FromDateTimeOffset(m.Created)
};
private static Application.Common.Models.PaginationState? MapPagination(CMSMicroservice.Protobuf.Protos.PaginationState? ps) =>
ps == null ? null : new Application.Common.Models.PaginationState
{
PageNumber = ps.PageNumber > 0 ? ps.PageNumber : 1,
PageSize = ps.PageSize > 0 ? ps.PageSize : 20
};
private static CMSMicroservice.Protobuf.Protos.MetaData MapMeta(Application.Common.Models.MetaData meta) =>
new()
{
CurrentPage = meta.CurrentPage,
PageSize = meta.PageSize,
TotalCount = meta.TotalCount,
TotalPage = meta.TotalPage
};
}
@@ -0,0 +1,92 @@
using CMSMicroservice.Application.ClubMembershipCycleCQ.Queries.GetAllClubMembershipCycleByFilter;
using CMSMicroservice.Application.ClubMembershipCycleCQ.Queries.GetClubMembershipCycleSummary;
using CMSMicroservice.Protobuf.Protos.ClubMembershipCycle;
using Google.Protobuf.WellKnownTypes;
using Mapster;
namespace CMSMicroservice.WebApi.Common.Mappings;
public class ClubMembershipCycleProfile : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.NewConfig<GetAllClubMembershipCycleByFilterRequest, GetAllClubMembershipCycleByFilterQuery>()
.MapWith(src => new GetAllClubMembershipCycleByFilterQuery
{
PaginationState = MapPagination(src.PaginationState),
SortBy = src.HasSortBy ? src.SortBy : null,
Filter = MapFilter(src.Filter)
});
config.NewConfig<GetAllClubMembershipCycleByFilterResponseDto, GetAllClubMembershipCycleByFilterResponse>()
.MapWith(src => new GetAllClubMembershipCycleByFilterResponse
{
MetaData = MapMeta(src.MetaData),
Models = { src.Models?.Select(MapModel) ?? [] }
});
config.NewConfig<GetClubMembershipCycleSummaryRequest, GetClubMembershipCycleSummaryQuery>()
.MapWith(src => new GetClubMembershipCycleSummaryQuery { Filter = MapFilter(src.Filter) });
config.NewConfig<GetClubMembershipCycleSummaryResponseDto, GetClubMembershipCycleSummaryResponse>()
.MapWith(src => new GetClubMembershipCycleSummaryResponse
{
TotalCount = src.TotalCount,
CurrentCycleCount = src.CurrentCycleCount,
MagicActiveCount = src.MagicActiveCount
});
}
private static GetAllClubMembershipCycleByFilterFilter? MapFilter(GetAllClubMembershipCycleByFilterFilter? src)
{
if (src == null) return null;
return new GetAllClubMembershipCycleByFilterFilter
{
UserId = src.HasUserId ? src.UserId : null,
IsCurrentCycle = src.HasIsCurrentCycle ? src.IsCurrentCycle : null,
PackageId = src.HasPackageId ? src.PackageId : null,
CycleNumber = src.HasCycleNumber ? src.CycleNumber : null,
PurchaseMethod = src.HasPurchaseMethod ? (Domain.Enums.PackagePurchaseMethod)src.PurchaseMethod : null,
MagicState = src.HasMagicState ? src.MagicState : null,
PackagePurchasedFrom = src.PackagePurchasedFrom?.ToDateTime(),
PackagePurchasedTo = src.PackagePurchasedTo?.ToDateTime()
};
}
private static ClubMembershipCycleModel MapModel(GetAllClubMembershipCycleByFilterResponseModel m) =>
new()
{
Id = m.Id,
UserId = m.UserId,
UserName = m.UserName,
ClubMembershipId = m.ClubMembershipId,
CycleNumber = m.CycleNumber,
PackageId = m.PackageId,
PackageName = m.PackageName,
PackageAmount = m.PackageAmount,
PurchaseMethod = (int)m.PurchaseMethod,
PackagePurchasedAt = Timestamp.FromDateTime(DateTime.SpecifyKind(m.PackagePurchasedAt, DateTimeKind.Utc)),
MagicStartedAt = m.MagicStartedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.MagicStartedAt.Value, DateTimeKind.Utc)) : null,
MagicCompletedAt = m.MagicCompletedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(m.MagicCompletedAt.Value, DateTimeKind.Utc)) : null,
IsCurrentCycle = m.IsCurrentCycle,
CreatedAt = Timestamp.FromDateTimeOffset(m.Created)
};
private static Application.Common.Models.PaginationState? MapPagination(CMSMicroservice.Protobuf.Protos.PaginationState? ps) =>
ps == null ? null : new Application.Common.Models.PaginationState
{
PageNumber = ps.PageNumber > 0 ? ps.PageNumber : 1,
PageSize = ps.PageSize > 0 ? ps.PageSize : 20
};
private static CMSMicroservice.Protobuf.Protos.MetaData MapMeta(Application.Common.Models.MetaData meta) =>
new()
{
CurrentPage = meta.CurrentPage,
PageSize = meta.PageSize,
TotalCount = meta.TotalCount,
TotalPage = meta.TotalPage
};
}
@@ -1,5 +1,6 @@
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetAllClubMemberships;
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembershipHistory;
using CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubStatistics;
using CMSMicroservice.Protobuf.Protos.ClubMembership;
using Google.Protobuf.WellKnownTypes;
@@ -112,6 +113,55 @@ public class ClubMembershipProfile : IRegister
NetChange = t.NetChange
}) }
});
// GetClubMembershipHistory
config.NewConfig<GetClubMembershipHistoryRequest, GetClubMembershipHistoryQuery>()
.MapWith(src => new GetClubMembershipHistoryQuery
{
PaginationState = src.PaginationState != null
? new Application.Common.Models.PaginationState
{
PageNumber = src.PaginationState.PageNumber > 0 ? src.PaginationState.PageNumber : 1,
PageSize = src.PaginationState.PageSize > 0 ? src.PaginationState.PageSize : 20
}
: null,
SortBy = src.HasSortBy ? src.SortBy : null,
Filter = src.Filter != null ? new GetClubMembershipHistoryFilter
{
UserId = src.Filter.HasUserId ? src.Filter.UserId : null,
ClubMembershipId = src.Filter.HasClubMembershipId ? src.Filter.ClubMembershipId : null,
Action = src.Filter.HasAction ? (Domain.Enums.ClubMembershipAction)src.Filter.Action : null,
CreatedFrom = src.Filter.CreatedFrom?.ToDateTime(),
CreatedTo = src.Filter.CreatedTo?.ToDateTime()
} : null
});
config.NewConfig<GetClubMembershipHistoryResponseDto, GetClubMembershipHistoryResponse>()
.MapWith(src => new GetClubMembershipHistoryResponse
{
MetaData = new CMSMicroservice.Protobuf.Protos.MetaData
{
CurrentPage = src.MetaData.CurrentPage,
PageSize = src.MetaData.PageSize,
TotalCount = src.MetaData.TotalCount,
TotalPage = src.MetaData.TotalPage
},
Models = { src.Models.Select(m => new ClubMembershipHistoryModel
{
Id = m.Id,
ClubMembershipId = m.ClubMembershipId,
UserId = m.UserId,
UserName = m.UserName ?? string.Empty,
OldIsActive = m.OldIsActive,
NewIsActive = m.NewIsActive,
OldInitialContribution = m.OldInitialContribution,
NewInitialContribution = m.NewInitialContribution,
Action = (int)m.Action,
PerformedBy = m.PerformedBy ?? string.Empty,
Reason = m.Reason ?? string.Empty,
CreatedAt = Timestamp.FromDateTimeOffset(m.Created)
}) }
});
}
private static ClubMembershipModel MapToModel(GetAllClubMembershipsResponseModel src)
@@ -121,15 +171,15 @@ public class ClubMembershipProfile : IRegister
Id = src.Id,
UserId = src.UserId,
UserName = src.UserName ?? string.Empty,
PackageId = 0, // Not available in current entity
PackageName = string.Empty, // Not available in current entity
ActivationCode = string.Empty, // Not available in current entity
PackageId = src.PackageId,
PackageName = src.PackageName ?? string.Empty,
ActivationCode = string.Empty,
ActivatedAt = src.ActivatedAt.HasValue
? Timestamp.FromDateTime(DateTime.SpecifyKind(src.ActivatedAt.Value, DateTimeKind.Utc))
: null,
ExpiresAt = null, // Not available in current entity
ExpiresAt = null,
IsActive = src.IsActive,
IsExpired = false, // Calculate based on ExpiresAt if available
IsExpired = false,
Created = Timestamp.FromDateTime(src.Created.UtcDateTime)
};
}
@@ -0,0 +1,102 @@
using CMSMicroservice.Application.PaymentTransactionCQ.Queries.GetAllPaymentTransactionByFilter;
using CMSMicroservice.Application.PaymentTransactionCQ.Queries.GetPaymentTransactionSummary;
using CMSMicroservice.Protobuf.Protos.PaymentTransaction;
using Google.Protobuf.WellKnownTypes;
using Mapster;
namespace CMSMicroservice.WebApi.Common.Mappings;
public class PaymentTransactionProfile : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.NewConfig<GetAllPaymentTransactionByFilterRequest, GetAllPaymentTransactionByFilterQuery>()
.MapWith(MapListQuery);
config.NewConfig<GetAllPaymentTransactionByFilterResponseDto, GetAllPaymentTransactionByFilterResponse>()
.MapWith(MapListResponse);
config.NewConfig<GetPaymentTransactionSummaryRequest, GetPaymentTransactionSummaryQuery>()
.MapWith(src => new GetPaymentTransactionSummaryQuery
{
Filter = MapFilter(src.Filter)
});
config.NewConfig<GetPaymentTransactionSummaryResponseDto, GetPaymentTransactionSummaryResponse>()
.MapWith(src => new GetPaymentTransactionSummaryResponse
{
TotalCount = src.TotalCount,
TotalAmount = src.TotalAmount,
SuccessfulCount = src.SuccessfulCount,
PendingCount = src.PendingCount
});
}
private static GetAllPaymentTransactionByFilterQuery MapListQuery(GetAllPaymentTransactionByFilterRequest src) =>
new()
{
PaginationState = MapPagination(src.PaginationState),
SortBy = src.HasSortBy ? src.SortBy : null,
Filter = MapFilter(src.Filter)
};
private static GetAllPaymentTransactionByFilterResponse MapListResponse(GetAllPaymentTransactionByFilterResponseDto src) =>
new()
{
MetaData = MapMeta(src.MetaData),
Models = { src.Models?.Select(MapModel) ?? [] }
};
private static GetAllPaymentTransactionByFilterFilter? MapFilter(GetAllPaymentTransactionByFilterFilter? src)
{
if (src == null) return null;
return new GetAllPaymentTransactionByFilterFilter
{
UserId = src.HasUserId ? src.UserId : null,
Mobile = src.HasMobile ? src.Mobile : null,
GatewayProvider = src.HasGatewayProvider ? src.GatewayProvider : null,
PaymentStatus = src.HasPaymentStatus ? src.PaymentStatus : null,
Authority = src.HasAuthority ? src.Authority : null,
RefId = src.HasRefId ? src.RefId : null,
OrderId = src.HasOrderId ? src.OrderId : null,
CreatedFrom = src.CreatedFrom?.ToDateTime(),
CreatedTo = src.CreatedTo?.ToDateTime()
};
}
private static PaymentTransactionModel MapModel(GetAllPaymentTransactionByFilterResponseModel m) =>
new()
{
Id = m.Id,
UserId = m.UserId ?? 0,
Mobile = m.Mobile ?? string.Empty,
GatewayProvider = m.GatewayProvider,
Amount = m.Amount,
Authority = m.Authority ?? string.Empty,
PaymentStatus = m.PaymentStatus,
VerificationStatusCode = m.VerificationStatusCode,
VerificationStatusMessage = m.VerificationStatusMessage ?? string.Empty,
RefId = m.RefId ?? string.Empty,
CardPan = m.CardPan ?? string.Empty,
OrderId = m.OrderId ?? string.Empty,
TransactionId = m.TransactionId,
Description = m.Description ?? string.Empty,
CreatedAt = Timestamp.FromDateTimeOffset(m.Created)
};
private static Application.Common.Models.PaginationState? MapPagination(CMSMicroservice.Protobuf.Protos.PaginationState? ps) =>
ps == null ? null : new Application.Common.Models.PaginationState
{
PageNumber = ps.PageNumber > 0 ? ps.PageNumber : 1,
PageSize = ps.PageSize > 0 ? ps.PageSize : 20
};
private static CMSMicroservice.Protobuf.Protos.MetaData MapMeta(Application.Common.Models.MetaData meta) =>
new()
{
CurrentPage = meta.CurrentPage,
PageSize = meta.PageSize,
TotalCount = meta.TotalCount,
TotalPage = meta.TotalPage
};
}
@@ -0,0 +1,83 @@
using CMSMicroservice.Application.UserPackagePurchaseCQ.Queries.GetAllUserPackagePurchaseByFilter;
using CMSMicroservice.Application.UserPackagePurchaseCQ.Queries.GetUserPackagePurchaseSummary;
using CMSMicroservice.Protobuf.Protos.UserPackagePurchase;
using Google.Protobuf.WellKnownTypes;
using Mapster;
namespace CMSMicroservice.WebApi.Common.Mappings;
public class UserPackagePurchaseProfile : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.NewConfig<GetAllUserPackagePurchaseByFilterRequest, GetAllUserPackagePurchaseByFilterQuery>()
.MapWith(src => new GetAllUserPackagePurchaseByFilterQuery
{
PaginationState = MapPagination(src.PaginationState),
SortBy = src.HasSortBy ? src.SortBy : null,
Filter = MapFilter(src.Filter)
});
config.NewConfig<GetAllUserPackagePurchaseByFilterResponseDto, GetAllUserPackagePurchaseByFilterResponse>()
.MapWith(src => new GetAllUserPackagePurchaseByFilterResponse
{
MetaData = MapMeta(src.MetaData),
Models = { src.Models?.Select(m => new UserPackagePurchaseModel
{
Id = m.Id,
UserId = m.UserId,
UserName = m.UserName,
UserMobile = m.UserMobile,
PackageId = m.PackageId,
PackageName = m.PackageName,
PurchaseMethod = (int)m.PurchaseMethod,
PurchasedAt = Timestamp.FromDateTime(DateTime.SpecifyKind(m.PurchasedAt, DateTimeKind.Utc)),
Amount = m.Amount,
OrderId = m.OrderId,
TransactionId = m.TransactionId,
CreatedAt = Timestamp.FromDateTimeOffset(m.Created)
}) ?? [] }
});
config.NewConfig<GetUserPackagePurchaseSummaryRequest, GetUserPackagePurchaseSummaryQuery>()
.MapWith(src => new GetUserPackagePurchaseSummaryQuery { Filter = MapFilter(src.Filter) });
config.NewConfig<GetUserPackagePurchaseSummaryResponseDto, GetUserPackagePurchaseSummaryResponse>()
.MapWith(src => new GetUserPackagePurchaseSummaryResponse
{
TotalCount = src.TotalCount,
TotalAmount = src.TotalAmount
});
}
private static GetAllUserPackagePurchaseByFilterFilter? MapFilter(GetAllUserPackagePurchaseByFilterFilter? src)
{
if (src == null) return null;
return new GetAllUserPackagePurchaseByFilterFilter
{
UserId = src.HasUserId ? src.UserId : null,
PackageId = src.HasPackageId ? src.PackageId : null,
PurchaseMethod = src.HasPurchaseMethod ? (Domain.Enums.PackagePurchaseMethod)src.PurchaseMethod : null,
PurchasedFrom = src.PurchasedFrom?.ToDateTime(),
PurchasedTo = src.PurchasedTo?.ToDateTime(),
MinAmount = src.HasMinAmount ? src.MinAmount : null,
MaxAmount = src.HasMaxAmount ? src.MaxAmount : null
};
}
private static Application.Common.Models.PaginationState? MapPagination(CMSMicroservice.Protobuf.Protos.PaginationState? ps) =>
ps == null ? null : new Application.Common.Models.PaginationState
{
PageNumber = ps.PageNumber > 0 ? ps.PageNumber : 1,
PageSize = ps.PageSize > 0 ? ps.PageSize : 20
};
private static CMSMicroservice.Protobuf.Protos.MetaData MapMeta(Application.Common.Models.MetaData meta) =>
new()
{
CurrentPage = meta.CurrentPage,
PageSize = meta.PageSize,
TotalCount = meta.TotalCount,
TotalPage = meta.TotalPage
};
}