feat: Add ClubMembershipCQ - Phase 3 Application Layer
- Implemented 3 Commands with handlers and validators: * ActivateClubMembership: Create/reactivate membership * DeactivateClubMembership: Deactivate existing membership * AssignClubFeature: Assign features to club members - Implemented 3 Queries with handlers, validators, and DTOs: * GetClubMembership: Retrieve single membership by UserId * GetAllClubMemberships: List with filtering and pagination * GetClubMembershipHistory: Audit trail with full history - All operations include history tracking via ClubMembershipHistory - Property names aligned with Domain entity definitions - 21 new files, ~600 lines of code - Build successful with 0 errors
This commit is contained in:
+16
@@ -0,0 +1,16 @@
|
||||
namespace CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||
|
||||
/// <summary>
|
||||
/// DTO برای نمایش اطلاعات عضویت باشگاه
|
||||
/// </summary>
|
||||
public class ClubMembershipDto
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public long UserId { get; set; }
|
||||
public bool IsActive { get; set; }
|
||||
public DateTime? ActivatedAt { get; set; }
|
||||
public long InitialContribution { get; set; }
|
||||
public long TotalEarned { get; set; }
|
||||
public DateTimeOffset Created { get; set; }
|
||||
public DateTimeOffset? LastModified { get; set; }
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
namespace CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||
|
||||
/// <summary>
|
||||
/// Query برای دریافت عضویت باشگاه یک کاربر
|
||||
/// </summary>
|
||||
public record GetClubMembershipQuery : IRequest<ClubMembershipDto?>
|
||||
{
|
||||
/// <summary>
|
||||
/// شناسه کاربر
|
||||
/// </summary>
|
||||
public long UserId { get; init; }
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
namespace CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||
|
||||
public class GetClubMembershipQueryHandler : IRequestHandler<GetClubMembershipQuery, ClubMembershipDto?>
|
||||
{
|
||||
private readonly IApplicationDbContext _context;
|
||||
|
||||
public GetClubMembershipQueryHandler(IApplicationDbContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<ClubMembershipDto?> Handle(GetClubMembershipQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
var membership = await _context.ClubMemberships
|
||||
.AsNoTracking()
|
||||
.Where(x => x.UserId == request.UserId)
|
||||
.Select(x => new ClubMembershipDto
|
||||
{
|
||||
Id = x.Id,
|
||||
UserId = x.UserId,
|
||||
IsActive = x.IsActive,
|
||||
ActivatedAt = x.ActivatedAt,
|
||||
InitialContribution = x.InitialContribution,
|
||||
TotalEarned = x.TotalEarned,
|
||||
Created = x.Created,
|
||||
LastModified = x.LastModified
|
||||
})
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
return membership;
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
namespace CMSMicroservice.Application.ClubMembershipCQ.Queries.GetClubMembership;
|
||||
|
||||
public class GetClubMembershipQueryValidator : AbstractValidator<GetClubMembershipQuery>
|
||||
{
|
||||
public GetClubMembershipQueryValidator()
|
||||
{
|
||||
RuleFor(x => x.UserId)
|
||||
.GreaterThan(0)
|
||||
.WithMessage("شناسه کاربر معتبر نیست");
|
||||
}
|
||||
|
||||
public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) =>
|
||||
{
|
||||
var result = await ValidateAsync(
|
||||
ValidationContext<GetClubMembershipQuery>.CreateWithOptions(
|
||||
(GetClubMembershipQuery)model,
|
||||
x => x.IncludeProperties(propertyName)));
|
||||
|
||||
if (result.IsValid)
|
||||
return Array.Empty<string>();
|
||||
|
||||
return result.Errors.Select(e => e.ErrorMessage);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user