using MAX.Framework.Security;
using MediatR;
using Microsoft.AspNetCore.Authorization;
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
{
/// 获取本人或授权范围内的用户信息,响应不包含密码。
public Task GetUser(string? userName, CancellationToken cancellationToken)
{
return users.GetUser(userName, cancellationToken);
}
/// 管理员分页查询所有用户。
public Task> GetAllUser(UserSearchRequest request, CancellationToken cancellationToken)
{
return users.Search(request, false, cancellationToken);
}
/// 分页查询当前主账号的直属子账号。
public Task> GetSubUser(UserSearchRequest request, CancellationToken cancellationToken)
{
return users.Search(request, true, cancellationToken);
}
/// 管理员创建主账号。
public Task AddUser(UserCreateRequest request, CancellationToken cancellationToken)
{
return users.Create(request, false, cancellationToken);
}
/// 主账号创建直属子账号。
public Task AddSubUser(UserCreateRequest request, CancellationToken cancellationToken)
{
return users.Create(request, true, cancellationToken);
}
/// 管理员修改账户资料,用户名不可变更。
public Task UpdateUser(UserUpdateRequest request, CancellationToken cancellationToken)
{
return users.Update(request.Id, request, false, cancellationToken);
}
/// 主账号修改直属子账号资料。
public Task UpdateSubUser(UserUpdateRequest request, CancellationToken cancellationToken)
{
return users.Update(request.Id, request, true, cancellationToken);
}
/// 删除无资金和业务关联的账户。
public async Task DelUser(int id, CancellationToken cancellationToken)
{
await users.Delete(id, cancellationToken);
return ApiResult.Ok();
}
/// 校验旧密码并修改本人密码,成功后需重新登录。
public async Task ChangePassword(ChangePasswordRequest request, CancellationToken cancellationToken)
{
await users.ChangePassword(request, cancellationToken);
return ApiResult.Ok();
}
/// 查询授权账户的积分流水。
public Task> GetUserPoints(UserRecordSearchRequest request, CancellationToken cancellationToken)
{
return users.Points(request.UserName, request, cancellationToken);
}
/// 查询授权账户的余额流水。
public Task> GetUserBalance(UserRecordSearchRequest request, CancellationToken cancellationToken)
{
return users.Balance(request.UserName, request, cancellationToken);
}
/// 管理员充值积分,或当前用户向其他账户转移自己的积分。
public Task UpdateUserPoints(UserFundsRequest request, CancellationToken cancellationToken)
{
return funds.Change(request, true, cancellationToken);
}
/// 管理员充值或扣减余额,自动记录审计流水。
public Task UpdateUserBalance(UserFundsRequest request, CancellationToken cancellationToken)
{
return funds.Change(request, false, cancellationToken);
}
/// 提交本人的充值备注。
public Task AddUserTopUpMsg(UserTopUpMessageRequest request, CancellationToken cancellationToken)
{
return users.AddTopUpMessage(request, cancellationToken);
}
/// 管理员填写充值备注的处理结果。
public async Task UpdateUserTopUpMsg(UserTopUpResultRequest request, CancellationToken cancellationToken)
{
await users.UpdateTopUpMessage(request, cancellationToken);
return ApiResult.Ok();
}
/// 分页查询充值备注。
public Task> GetUserTopUpMsg(UserSearchRequest request, CancellationToken cancellationToken)
{
return users.TopUpMessages(request, cancellationToken);
}
/// 管理员维护代理充值二维码。
public async Task UpdateTopUpQrcode(UserTopUpQrcodeRequest request, CancellationToken cancellationToken)
{
await users.UpdateTopUpQrcode(request, cancellationToken);
return ApiResult.Ok();
}
/// 获取代理充值二维码。
public Task GetTopUpQrcode(string agentCode, CancellationToken cancellationToken)
{
return users.GetTopUpQrcode(agentCode, cancellationToken);
}
/// 使用当前登录用户的积分为商铺续费。
public Task ShopRenew(ShopRenewRequest request, CancellationToken cancellationToken)
{
if (!currentUser.IsAuthenticated || string.IsNullOrWhiteSpace(currentUser.UserName))
{
throw new UnauthorizedAccessException();
}
return mediator.Send(new ShopRenewCommand(currentUser.UserName, request.ShopId, request.RenewDuration, request.Remark), cancellationToken);
}
}