using e_suite.API.Common; using e_suite.API.Common.models; using e_suite.API.Common.models.@base; using e_suite.Database.Core.Models; using e_suite.Utilities.Pagination; using eSuite.API.Models; using eSuite.API.security; using eSuite.API.Utilities; using eSuite.Core.Miscellaneous; using eSuite.Core.Security; using Microsoft.AspNetCore.Mvc; using Moq; using static System.Runtime.InteropServices.JavaScript.JSType; using IRoleManager = e_suite.API.Common.IRoleManager; namespace eSuite.API.Controllers; /// /// User manage is responsible for managing users within e-suite. /// [Route("api/[controller]")] [ApiController] public class UserController : ESuiteControllerBase { private readonly IUserManager _userManager; private readonly IRoleManager _roleManager; /// /// Constructor for user controller /// /// /// public UserController(IUserManager userManager, IRoleManager roleManager) { _userManager = userManager; _roleManager = roleManager; } /// /// Get a list of the users /// /// /// /// [Route("users")] [AccessKey(SecurityAccess.ViewUser)] [HttpGet] public async Task GetUsers([FromQuery] Paging paging, CancellationToken cancellationToken = default!) { var result = await _userManager.GetUsersAsync(paging, cancellationToken); return Ok(result); } /// /// Get the details of a specific user /// /// /// /// [Route("user")] [HttpGet] [AccessKey(SecurityAccess.ViewUser)] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetUser( [FromQuery] GeneralIdRef generalIdRef, CancellationToken cancellationToken = default! ) { var user = await _userManager.GetUserAsync(generalIdRef, cancellationToken); return Ok(user); } /// /// Edit a user /// /// /// /// [Route("user")] [HttpPut] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [AccessKey(SecurityAccess.EditUser)] public async Task EditUser(EditUser user, CancellationToken cancellationToken = default!) { await _userManager.EditUser(AuditUserDetails, user, cancellationToken); return Ok(); } /// /// Patching is useful when you only want to update a few fields of the user rather than the whole object. /// /// /// /// [Route("user")] [HttpPatch] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [AccessKey(SecurityAccess.EditUser)] public async Task PatchUser([FromQuery] IGeneralIdRef userId, [FromBody] PatchUser patchUser, CancellationToken cancellationToken = default!) { await _userManager.PatchUser(AuditUserDetails, userId, patchUser, cancellationToken); return Ok(); } /// /// Create a new e-suite user /// /// Create a new user for e-suite. The minimum information needed is the email address, which forms the account user name. Once created the user will get an e-mail asking them to confirm the account. /// Contains the details that need to be supplied to create the user. /// /// [Route("user")] [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] [AccessKey(SecurityAccess.AddUser)] public async Task CreateUser( [FromBody] UserRegistration userRegistration, CancellationToken cancellationToken = default! ) { await _roleManager.CheckHasDomainAccess(AuditUserDetails.UserId, userRegistration.DomainId, SecurityAccess.AddUser, cancellationToken); await _userManager.CreateUser(AuditUserDetails, userRegistration, cancellationToken); return Ok(); } /// /// Use this to deactivate a user from being able to access e-suite. This will stop them from being able to log in. /// /// /// [Route("userByEmail")] [HttpDelete] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] [AccessKey(SecurityAccess.DeleteUser)] public async Task DeactivateUser( [FromBody] EmailAddress email, CancellationToken cancellationToken = default! ) { await _userManager.DeactivateUser(AuditUserDetails, email.Email, cancellationToken); return Ok(); } /// /// Use this to deactivate a user from being able to access e-suite. This will stop them from being able to log in. /// /// /// [Route("user")] [HttpDelete] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] [AccessKey(SecurityAccess.DeleteUser)] public async Task DeactivateUser( [FromBody] GeneralIdRef generalIdRef, CancellationToken cancellationToken = default! ) { await _userManager.DeactivateUser(AuditUserDetails, generalIdRef, cancellationToken); return Ok(); } /// /// User this to have the API resend the account confirmation e-mail to a given user. /// /// /// /// /// [Route("resendConfirmEmail")] [HttpPost] [AccessKey(SecurityAccess.ResendConfirmMail)] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] public async Task ResendConfirmEmail([FromBody] GeneralIdRef generalIdRef, CancellationToken cancellationToken = default!) { ArgumentNullException.ThrowIfNull(generalIdRef); await _userManager.ResendConfirmEmail(AuditUserDetails, generalIdRef, cancellationToken); return Ok(); } /// /// Intended for internal use, this allows you to retrieve the current email action url for a given user /// /// /// /// /// [Route("currentEmailUserActionUrl")] [HttpGet] [AccessKey(SecurityAccess.GetCurrentEmailActionUrl)] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ProblemDetails))] public async Task CurrentEmailUserActionUrl( string emailAddress, EmailUserActionType emailUserActionType, CancellationToken cancellationToken = default ) { var url = await _userManager.GetCurrentEmailActionUrl(emailAddress, emailUserActionType, cancellationToken); return Ok(url); } }