diff --git a/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQuery.cs b/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQuery.cs index 6271e4d8..4accd2e4 100644 --- a/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQuery.cs +++ b/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQuery.cs @@ -31,4 +31,5 @@ public record RoleDto( string Name, string? Description, bool IsSystemRole, - DateTime CreatedAt); + DateTime CreatedAt, + int UserCount = 0); diff --git a/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQueryHandler.cs b/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQueryHandler.cs index 55d2c033..492be883 100644 --- a/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQueryHandler.cs +++ b/services/iam-service-net/src/IamService.API/Application/Queries/Roles/GetRolesQueryHandler.cs @@ -2,23 +2,27 @@ using MediatR; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using IamService.Domain.AggregatesModel.RoleAggregate; +using IamService.Infrastructure; namespace IamService.API.Application.Queries.Roles; /// -/// EN: Handler for GetRolesQuery. -/// VI: Handler cho GetRolesQuery. +/// EN: Handler for GetRolesQuery — includes user count per role via DB join. +/// VI: Handler cho GetRolesQuery — bao gồm số user mỗi role qua DB join. /// public class GetRolesQueryHandler : IRequestHandler { private readonly RoleManager _roleManager; + private readonly IamServiceContext _dbContext; private readonly ILogger _logger; public GetRolesQueryHandler( RoleManager roleManager, + IamServiceContext dbContext, ILogger logger) { _roleManager = roleManager; + _dbContext = dbContext; _logger = logger; } @@ -27,19 +31,25 @@ public class GetRolesQueryHandler : IRequestHandler r.Name) .Skip((request.PageNumber - 1) * request.PageSize) .Take(request.PageSize) - .Select(r => new RoleDto( - r.Id, - r.Name!, - r.Description, - r.IsSystemRole, - r.CreatedAt)) + .GroupJoin( + _dbContext.UserRoles, + role => role.Id, + userRole => userRole.RoleId, + (role, userRoles) => new RoleDto( + role.Id, + role.Name!, + role.Description, + role.IsSystemRole, + role.CreatedAt, + userRoles.Count())) .ToListAsync(cancellationToken); return new GetRolesQueryResult( diff --git a/services/iam-service-net/src/IamService.API/Controllers/RolesController.cs b/services/iam-service-net/src/IamService.API/Controllers/RolesController.cs index e2fd70b6..bda7cd73 100644 --- a/services/iam-service-net/src/IamService.API/Controllers/RolesController.cs +++ b/services/iam-service-net/src/IamService.API/Controllers/RolesController.cs @@ -67,7 +67,8 @@ public class RolesController : ControllerBase Name = r.Name, Description = r.Description, IsSystemRole = r.IsSystemRole, - CreatedAt = r.CreatedAt + CreatedAt = r.CreatedAt, + UserCount = r.UserCount }), Pagination = new PaginationInfo { @@ -435,6 +436,12 @@ public class RoleResponse /// VI: Thời gian tạo. /// public DateTime CreatedAt { get; set; } + + /// + /// EN: Number of users assigned this role. + /// VI: Số lượng người dùng được gán role này. + /// + public int UserCount { get; set; } } #endregion diff --git a/services/iam-service-net/src/IamService.Infrastructure/IamServiceContext.cs b/services/iam-service-net/src/IamService.Infrastructure/IamServiceContext.cs index eb11a8f9..93bad5af 100644 --- a/services/iam-service-net/src/IamService.Infrastructure/IamServiceContext.cs +++ b/services/iam-service-net/src/IamService.Infrastructure/IamServiceContext.cs @@ -196,7 +196,17 @@ public class IamServiceContext : IdentityDbContext u.LastLoginAt); b.Ignore(u => u.DomainEvents); }); - modelBuilder.Entity().ToTable("roles"); + modelBuilder.Entity(b => + { + b.ToTable("roles"); + b.Property("_description").HasColumnName("description"); + b.Property("_isSystemRole").HasColumnName("is_system_role"); + b.Property("_createdAt").HasColumnName("created_at"); + b.Ignore(r => r.Description); + b.Ignore(r => r.IsSystemRole); + b.Ignore(r => r.CreatedAt); + b.Ignore(r => r.DomainEvents); + }); modelBuilder.Entity>().ToTable("user_roles"); modelBuilder.Entity>().ToTable("user_claims"); modelBuilder.Entity>().ToTable("user_logins");