You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.3 KiB

using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using MediatR;
using CellularManagement.Domain.Entities;
using CellularManagement.Application.Features.Users.Queries.Dtos;
using Microsoft.EntityFrameworkCore;
using CellularManagement.Domain.Common;
using System.Threading.Tasks;
using System.Threading;
using System.Linq;
using System;
namespace CellularManagement.Application.Features.Users.Queries.GetAllUsers;
/// <summary>
/// 获取所有用户查询处理器
/// 处理获取系统中所有用户信息的业务逻辑
/// </summary>
public sealed class GetAllUsersQueryHandler : IRequestHandler<GetAllUsersQuery, OperationResult<GetAllUsersResponse>>
{
private readonly UserManager<AppUser> _userManager;
private readonly ILogger<GetAllUsersQueryHandler> _logger;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="userManager">用户管理器,用于管理用户身份</param>
/// <param name="logger">日志记录器</param>
public GetAllUsersQueryHandler(
UserManager<AppUser> userManager,
ILogger<GetAllUsersQueryHandler> logger)
{
_userManager = userManager;
_logger = logger;
}
/// <summary>
/// 处理获取所有用户命令
/// </summary>
/// <param name="request">查询命令</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>操作结果,包含所有用户信息列表</returns>
public async Task<OperationResult<GetAllUsersResponse>> Handle(
GetAllUsersQuery request,
CancellationToken cancellationToken)
{
try
{
// 构建基础查询
var query = _userManager.Users.AsQueryable();
// 应用条件过滤
if (!string.IsNullOrWhiteSpace(request.UserName))
{
query = query.Where(u => u.UserName.Contains(request.UserName));
}
if (!string.IsNullOrWhiteSpace(request.Email))
{
query = query.Where(u => u.Email.Contains(request.Email));
}
if (!string.IsNullOrWhiteSpace(request.PhoneNumber))
{
query = query.Where(u => u.PhoneNumber.Contains(request.PhoneNumber));
}
// 获取总记录数
var totalCount = await query.CountAsync(cancellationToken);
// 应用分页
var users = await query
.Skip((request.PageNumber - 1) * request.PageSize)
.Take(request.PageSize)
.ToListAsync(cancellationToken);
// 转换为DTO对象
var userDtos = users.Select(user => new UserDto(
user.Id,
user.UserName,
user.Email,
user.PhoneNumber)).ToList();
// 构建响应对象
var response = new GetAllUsersResponse(
userDtos,
totalCount,
request.PageNumber,
request.PageSize);
return OperationResult<GetAllUsersResponse>.CreateSuccess(response);
}
catch (Exception ex)
{
_logger.LogError(ex, "获取所有用户时发生错误");
return OperationResult<GetAllUsersResponse>.CreateFailure("获取用户列表失败");
}
}
}