using MAX.Framework.Security; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Store.Users.Commands; using Store.Users.Contracts.Dtos; using Store.Users.Dtos; using Store.Users.Entities; using Store.Users.Services; using MAX.Framework.Dtos; using MAX.Framework.Conventions; namespace Store.Users.Controllers; /// 用户模块接口;所有管理操作均以当前 JWT 对应的数据库账户进行授权。 [ApiController] [DefaultHttpPost] [Authorize] [Route("v{version:apiVersion}/user/[action]")] public class UserController(UserManagementService users, UserFundsService funds, IMediator mediator, ICurrentUser currentUser) : ControllerBase { /// 获取本人或授权范围内的用户信息,响应不包含密码。 [EndpointSummary("获取用户信息")] public Task GetUser(string? userName, CancellationToken cancellationToken) { return users.GetUser(userName, cancellationToken); } /// 管理员查询全部用户;普通主账号仅查询本人及直属子账号。 [EndpointSummary("分页查询所有用户")] public Task> GetAllUser(UserSearchRequest request, CancellationToken cancellationToken) { return users.Search(request, false, cancellationToken); } /// 管理员可查询所有账号的子账号,普通主账号只能查询自己的直属子账号。 /// 管理员可通过 ParentUserName 筛选指定父账号;普通主账号仅可指定自己。 /// 请求取消标记。 [EndpointSummary("分页查询子账号")] [EndpointDescription("管理员不传 ParentUserName 时查询全部子账号,传入时按指定父账号筛选;普通主账号只能查询自己的子账号。")] public Task> GetSubUser(UserSearchRequest request, CancellationToken cancellationToken) { return users.Search(request, true, cancellationToken); } /// 管理员创建主账号。 [EndpointSummary("创建主账号")] public Task AddUser(UserCreateRequest request, CancellationToken cancellationToken) { return users.Create(request, false, cancellationToken); } /// 管理员可为指定主账号创建子账号,普通主账号仅可为自己创建子账号。 [EndpointSummary("创建直属子账号")] public Task AddSubUser(UserCreateRequest request, CancellationToken cancellationToken) { return users.Create(request, true, cancellationToken); } /// 管理员修改任意账户;普通主账号仅修改本人及直属子账号,用户名不可变更。 [EndpointSummary("修改用户资料")] public Task UpdateUser(UserUpdateRequest request, CancellationToken cancellationToken) { return users.Update(request.Id, request, false, cancellationToken); } /// 管理员修改任意子账号,普通主账号仅修改直属子账号。 [EndpointSummary("修改直属子账号资料")] public Task UpdateSubUser(UserUpdateRequest request, CancellationToken cancellationToken) { return users.Update(request.Id, request, true, cancellationToken); } /// 删除无资金和业务关联的账户。 [EndpointSummary("删除用户")] public async Task DelUser(int id, CancellationToken cancellationToken) { await users.Delete(id, cancellationToken); return ApiResult.Ok(); } /// 本人改密校验原密码;管理员或主账号可为管理范围内的其他账户重置密码。 [EndpointSummary("修改或重置用户密码")] public async Task ChangePassword(ChangePasswordRequest request, CancellationToken cancellationToken) { await users.ChangePassword(request, cancellationToken); return ApiResult.Ok(); } /// 查询授权账户的积分流水。 [EndpointSummary("查询用户积分流水")] public Task> GetUserPoints(UserRecordSearchRequest request, CancellationToken cancellationToken) { return users.Points(request.UserName, request, cancellationToken); } /// 查询授权账户的余额流水。 [EndpointSummary("查询用户余额流水")] public Task> GetUserBalance(UserRecordSearchRequest request, CancellationToken cancellationToken) { return users.Balance(request.UserName, request, cancellationToken); } /// 管理员充值积分,或当前用户向其他账户转移自己的积分。 [EndpointSummary("充值或转移用户积分")] public Task UpdateUserPoints(UserFundsRequest request, CancellationToken cancellationToken) { return funds.Change(request, true, cancellationToken); } /// 管理员充值或扣减余额,自动记录审计流水。 [EndpointSummary("充值或扣减用户余额")] public Task UpdateUserBalance(UserFundsRequest request, CancellationToken cancellationToken) { return funds.Change(request, false, cancellationToken); } /// 提交本人或管理范围内账户的充值备注。 [EndpointSummary("提交充值备注")] public Task AddUserTopUpMsg(UserTopUpMessageRequest request, CancellationToken cancellationToken) { return users.AddTopUpMessage(request, cancellationToken); } /// 管理员可处理所有充值备注,普通主账号仅处理本人及直属子账号备注,不自动充值。 [EndpointSummary("处理充值备注")] public async Task UpdateUserTopUpMsg(UserTopUpResultRequest request, CancellationToken cancellationToken) { await users.UpdateTopUpMessage(request, cancellationToken); return ApiResult.Ok(); } /// 按管理员、主账号或子账号的授权范围分页查询充值备注。 [EndpointSummary("分页查询充值备注")] public Task> GetUserTopUpMsg(UserSearchRequest request, CancellationToken cancellationToken) { return users.TopUpMessages(request, cancellationToken); } /// 管理员维护代理充值二维码。 [EndpointSummary("维护代理充值二维码")] public async Task UpdateTopUpQrcode(UserTopUpQrcodeRequest request, CancellationToken cancellationToken) { await users.UpdateTopUpQrcode(request, cancellationToken); return ApiResult.Ok(); } /// 获取代理充值二维码。 [EndpointSummary("获取代理充值二维码")] public Task GetTopUpQrcode(string agentCode, CancellationToken cancellationToken) { return users.GetTopUpQrcode(agentCode, cancellationToken); } /// 管理员或主账号为授权账户的商铺续费,扣除店铺所属账户积分并记录实际操作者。 [EndpointSummary("使用积分为商铺续费")] public async Task ShopRenew(ShopRenewRequest request, CancellationToken cancellationToken) { if (!currentUser.IsAuthenticated || string.IsNullOrWhiteSpace(currentUser.UserName)) { throw new UnauthorizedAccessException(); } var targetName = await users.GetManagedUserName(request.UserName, cancellationToken); return await mediator.Send(new ShopRenewCommand(targetName, request.ShopId, request.RenewDuration, request.Remark, currentUser.UserName), cancellationToken); } }