using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Model; using Services; namespace API.Controllers.Admin; /// /// WARNING: This controller does not requires the requester to be authenticated, see https://codefirst.iut.uca.fr/git/IQBall/Server-Panel/issues/2 /// /// [ApiController] public class UsersAdminController(IUserService service, ILogger logger) : ControllerBase { public record CountUsersResponse(int Value); [HttpGet("/admin/users/count&search={search}")] public async Task CountUsers( [MaxLength(256, ErrorMessage = "Search string is too wide")] string search ) { logger.LogTrace("Counting Users"); return new CountUsersResponse(await service.UsersCount(search)); } [HttpGet("/admin/users/count")] public async Task CountUsers() { logger.LogTrace("Counting Users"); return new CountUsersResponse(await service.UsersCount()); } [HttpGet("/admin/users")] public async Task> ListUsers( [Range(0, int.MaxValue, ErrorMessage = "Only positive number allowed")] int start, [Range(0, int.MaxValue, ErrorMessage = "Only positive number allowed")] int n, [MaxLength(256, ErrorMessage = "Search string is too wide")] string? search ) { logger.LogTrace("Listing Users"); var result = await service.ListUsers(start, n, search); return result; } [HttpGet("/admin/users/{id:int}")] public async Task GetUser( [Range(1, int.MaxValue, ErrorMessage = "Only positive number allowed")] int id ) { logger.LogTrace("Getting a specific User ({})", id); var result = await service.GetUser(id); if (result == null) return NotFound(); return Ok(result); } public record AddUserRequest( [MaxLength(256, ErrorMessage = "Username is too wide")] string Username, [Range(4, 256, ErrorMessage = "Password must length be between 4 and 256")] string Password, [MaxLength(256, ErrorMessage = "Email is too wide")] [EmailAddress] string Email, bool IsAdmin = false ); [HttpPost("/admin/users")] public Task AddUser([FromBody] AddUserRequest req) { logger.LogTrace("Adding a User"); return service.CreateUser(req.Username, req.Email, req.Password, UsersController.DefaultProfilePicture, req.IsAdmin); } public record RemoveUsersRequest(int[] Identifiers); [HttpPost("/admin/users/remove-all")] public async Task RemoveUsers([FromBody] RemoveUsersRequest req) { logger.LogTrace("Removing Users"); await service.RemoveUsers(req.Identifiers); return Ok(); } public record UpdateUserRequest( [MaxLength(256, ErrorMessage = "Username is too wide")] string Username, [MaxLength(256, ErrorMessage = "Email is too wide")] [EmailAddress] string Email, bool IsAdmin ); [HttpPut("/admin/users/{id:int}")] public async Task UpdateUser( int id, [FromBody] UpdateUserRequest req ) { try { logger.LogTrace("Updating Users"); await service.UpdateUser(new User(id, req.Username, req.Email, UsersController.DefaultProfilePicture, req.IsAdmin)); return Ok(); } catch (ServiceException e) { return BadRequest(e.FailuresMessages()); } } }