Newer
Older
hypermedia-blazorcrud / Blazorcrud.Server / Controllers / UserController.cs
@Derek Comartin Derek Comartin on 12 Jul 3 KB Init
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));
        }
    }
}