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");