using FlatRender.IdentitySvc.Application.Services.Interfaces; using FlatRender.IdentitySvc.Models.Requests; using FlatRender.IdentitySvc.Models.Responses; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace FlatRender.IdentitySvc.Controllers; [ApiController] [Route("v1/users")] [Authorize] public class UsersController(IUserService userService) : ControllerBase { [HttpGet("me")] [ProducesResponseType(typeof(UserResponse), 200)] public async Task GetMe() => Ok(await userService.GetMeAsync(GetUserId())); [HttpPatch("me")] [ProducesResponseType(typeof(UserResponse), 200)] public async Task UpdateMe([FromBody] UpdateUserRequest request) => Ok(await userService.UpdateMeAsync(GetUserId(), request)); [HttpGet("me/balance")] [ProducesResponseType(typeof(BalanceResponse), 200)] public async Task GetBalance() => Ok(await userService.GetBalanceAsync(GetUserId())); [HttpPost("me/avatar")] public async Task SetAvatar([FromBody] SetAvatarRequest request) { await userService.UpdateAvatarAsync(GetUserId(), request.AvatarId, request.AvatarUrl); return Ok(); } [HttpGet("{userId:guid}")] [ProducesResponseType(typeof(UserResponse), 200)] [ProducesResponseType(404)] public async Task GetById(Guid userId) => Ok(await userService.GetByIdAsync(userId)); [HttpGet] [Authorize(Roles = "Admin")] [ProducesResponseType(typeof(PagedResponse), 200)] public async Task Search( [FromQuery] string? q, [FromQuery] Guid? tenantId, [FromQuery] int page = 1, [FromQuery] int pageSize = 20) => Ok(await userService.SearchAsync(q, tenantId, page, pageSize)); [HttpPatch("{userId:guid}")] [Authorize(Roles = "Admin")] [ProducesResponseType(typeof(UserResponse), 200)] [ProducesResponseType(404)] public async Task UpdateUser(Guid userId, [FromBody] UpdateUserRequest request) => Ok(await userService.UpdateMeAsync(userId, request)); [HttpPost("{userId:guid}/avatar")] [Authorize(Roles = "Admin")] public async Task SetUserAvatar(Guid userId, [FromBody] SetAvatarRequest request) { await userService.UpdateAvatarAsync(userId, request.AvatarId, request.AvatarUrl); return Ok(); } [HttpPost("{userId:guid}/ban")] [Authorize(Roles = "Admin")] [ProducesResponseType(204)] public async Task Ban(Guid userId, [FromBody] BanUserRequest request) { await userService.BanAsync(userId, request.Reason, request.UnblockDate); return NoContent(); } private Guid GetUserId() => Guid.Parse(User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value ?? User.FindFirst("sub")?.Value ?? throw new UnauthorizedAccessException()); }