feat: 用户列表 API 支持搜索过滤

- GetUserListQuery 增加 Search 参数
- GET /users?search=xxx 按用户名或邮箱模糊搜索
This commit is contained in:
向宁 2026-05-17 17:50:40 +08:00
parent 88eccbc952
commit ac61ace37f
2 changed files with 20 additions and 5 deletions

View File

@ -5,7 +5,12 @@ using RAG.Application.Users.Queries;
namespace RAG.Api.Endpoints.Users;
public class GetUserListEndpoint(IMediator mediator) : EndpointWithoutRequest<List<UserDto>>
public record GetUserListRequest
{
public string? Search { get; init; }
}
public class GetUserListEndpoint(IMediator mediator) : Endpoint<GetUserListRequest, List<UserDto>>
{
public override void Configure()
{
@ -13,9 +18,9 @@ public class GetUserListEndpoint(IMediator mediator) : EndpointWithoutRequest<Li
Permissions("user:read");
}
public override async Task HandleAsync(CancellationToken ct)
public override async Task HandleAsync(GetUserListRequest req, CancellationToken ct)
{
var result = await mediator.Send(new GetUserListQuery(), ct);
var result = await mediator.Send(new GetUserListQuery(req.Search), ct);
await Send.OkAsync(result, ct);
}
}

View File

@ -5,14 +5,24 @@ using RAG.Infrastructure.Persistence;
namespace RAG.Application.Users.Queries;
public record GetUserListQuery : IRequest<List<UserDto>>;
public record GetUserListQuery(string? Search) : IRequest<List<UserDto>>;
public class GetUserListQueryHandler(RagDbContext db) : IRequestHandler<GetUserListQuery, List<UserDto>>
{
public async Task<List<UserDto>> Handle(GetUserListQuery request, CancellationToken ct)
{
return await db.Users
var query = db.Users
.Include(u => u.UserRoles).ThenInclude(ur => ur.Role)
.AsQueryable();
if (!string.IsNullOrWhiteSpace(request.Search))
{
var search = request.Search.ToLower();
query = query.Where(u => u.Username.ToLower().Contains(search)
|| u.Email.ToLower().Contains(search));
}
return await query
.Select(u => new UserDto(
u.Id, u.Username, u.Email, u.IsActive, u.CreatedAt,
u.UserRoles.Select(ur => ur.Role.Name).ToList()))