using Blazorcrud.Server.Authorization; using Blazorcrud.Server.Models; using Blazorcrud.Shared.Data; using Blazorcrud.Shared.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace Blazorcrud.Server.Controllers { [Authorize] [ApiController] [Route("api/[controller]")] public class UserController : ControllerBase { private readonly IUserRepository _userRepository; private readonly AppSettings _appSettings; public UserController(IUserRepository userRepository, IOptions<AppSettings> appSettings) { _userRepository = userRepository; _appSettings = appSettings.Value; } /// <summary> /// Authenticates a user and returns a JWT token and user details /// </summary> [AllowAnonymous] [HttpPost("authenticate", Name = "Authenticate")] public ActionResult Authenticate(AuthenticateRequest request) { return Ok(_userRepository.Authenticate(request)); } /// <summary> /// Returns a list of paginated users with a default page size of 5. /// </summary> [AllowAnonymous] [HttpGet(Name = "GetUsers")] public ActionResult GetUsers([FromQuery] string? name, int page, [FromServices]LinkGenerator linkGenerator) { var users = _userRepository.GetUsers(name, page); var userViewModels = users.Results.Select(x => { var viewModel = new UserViewModel { Id = x.Id, Username = x.Username, LastName = x.LastName, FirstName = x.FirstName, }; if (HttpContext.Items.ContainsKey("User") == false) { return viewModel; } viewModel.Operations.Add(new OperationViewModel("UpdateUser", linkGenerator.GetPathByName("UpdateUser"), "PUT")); if (x.Username != "admin") { viewModel.Operations.Add(new OperationViewModel("DeleteUser", linkGenerator.GetPathByName("DeleteUser", new { id = x.Id }), "DELETE")); } return viewModel; }); return Ok(new PagedResult<UserViewModel> { Results = userViewModels.ToList(), CurrentPage = users.CurrentPage, PageCount = users.PageCount, PageSize = users.PageSize, RowCount = users.RowCount }); } /// <summary> /// Gets a specific user by Id. /// </summary> [AllowAnonymous] [HttpGet("{id}", Name = "GetUser")] public async Task<ActionResult> GetUser(int id) { return Ok(await _userRepository.GetUser(id)); } /// <summary> /// Creates a user and hashes password. /// </summary> [HttpPost(Name = "AddUser")] public async Task<ActionResult> AddUser(User user) { return Ok(await _userRepository.AddUser(user)); } /// <summary> /// Updates a user with a specific Id, hashing password if updated. /// </summary> [HttpPut(Name = "UpdateUser")] public async Task<ActionResult> UpdateUser(User user) { return Ok(await _userRepository.UpdateUser(user)); } /// <summary> /// Deletes a user with a specific Id. /// </summary> [HttpDelete("{id}", Name = "DeleteUser")] public async Task<ActionResult> DeleteUser(int id) { return Ok(await _userRepository.DeleteUser(id)); } } }