using System; using System.Collections.Generic; using System.Threading.Tasks; using UserManagement.Data.Dto; using UserManagement.MediatR.Commands; using UserManagement.MediatR.Queries; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Hosting; using UserManagement.Data.Resources; using UserManagement.Repository; using UserManagement.Api.Helpers; using Microsoft.AspNetCore.Http; namespace UserManagement.API.Controllers { /// /// User /// /// /// User /// /// /// /// [Route("api/[controller]")] [ApiController] [Authorize] public class UserController( IMediator mediator, UserInfoToken userInfo, IWebHostEnvironment webHostEnvironment ) : BaseController { private readonly IMediator _mediator = mediator; private readonly IWebHostEnvironment _webHostEnvironment = webHostEnvironment; private readonly UserInfoToken _userInfo = userInfo; /// /// Create a User /// /// /// [HttpPost] [Produces("application/json", "application/xml", Type = typeof(UserDto))] [ClaimCheck("user_add")] public async Task AddUser(AddUserCommand addUserCommand) { var result = await _mediator.Send(addUserCommand); if (!result.Success) { return ReturnFormattedResponse(result); } return CreatedAtAction("GetUser", new { id = result.Data.Id }, result.Data); } /// /// Get All Users /// /// [HttpGet("GetAllUsers")] [Produces("application/json", "application/xml", Type = typeof(List))] [ClaimCheck("user_list", "user_role_edit")] public async Task GetAllUsers() { var getAllUserQuery = new GetAllUserQuery { }; var result = await _mediator.Send(getAllUserQuery); return Ok(result); } /// /// Get User By Id /// /// /// [HttpGet("{id}", Name = "GetUser")] [Produces("application/json", "application/xml", Type = typeof(UserDto))] [ClaimCheck("user_edit", "user_permission_edit")] public async Task GetUser(Guid id) { var getUserQuery = new GetUserQuery { Id = id }; var result = await _mediator.Send(getUserQuery); return ReturnFormattedResponse(result); } /// /// Get Users /// /// /// [HttpGet("GetUsers")] [Produces("application/json", "application/xml", Type = typeof(UserList))] [ClaimCheck("user_list")] public async Task GetUsers([FromQuery] UserResource userResource) { var getAllLoginAuditQuery = new GetUsersQuery { UserResource = userResource }; var result = await _mediator.Send(getAllLoginAuditQuery); var paginationMetadata = new { totalCount = result.TotalCount, pageSize = result.PageSize, skip = result.Skip, totalPages = result.TotalPages }; Response.Headers.Append("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata)); return Ok(result); } /// /// Get Recently Registered Users /// /// [HttpGet("GetRecentlyRegisteredUsers")] [Produces("application/json", "application/xml", Type = typeof(List))] [ClaimCheck("dashboard_list")] public async Task GetRecentlyRegisteredUsers() { var getRecentlyRegisteredUserQuery = new GetRecentlyRegisteredUserQuery { }; var result = await _mediator.Send(getRecentlyRegisteredUserQuery); return Ok(result); } /// /// User Login /// /// /// [HttpPost("login")] [AllowAnonymous] [Produces("application/json", "application/xml", Type = typeof(UserAuthDto))] public async Task UserLogin(UserLoginCommand userLoginCommand) { userLoginCommand.RemoteIp = Request.HttpContext.Connection.RemoteIpAddress.ToString(); var result = await _mediator.Send(userLoginCommand); if (!result.Success) { return ReturnFormattedResponse(result); } return Ok(new { result.Data.BearerToken }); } /// /// Update User By Id /// /// /// /// [HttpPut("{id}")] [Produces("application/json", "application/xml", Type = typeof(UserDto))] [ClaimCheck("user_edit")] public async Task UpdateUser(Guid id, UpdateUserCommand updateUserCommand) { updateUserCommand.Id = id; var result = await _mediator.Send(updateUserCommand); return ReturnFormattedResponse(result); } /// /// Update Profile /// /// /// [HttpPut("profile")] [Produces("application/json", "application/xml", Type = typeof(UserDto))] public async Task UpdateUserProfile(UpdateUserProfileCommand updateUserProfileCommand) { var result = await _mediator.Send(updateUserProfileCommand); return ReturnFormattedResponse(result); } /// /// Update Profile photo /// /// [HttpPost("UpdateUserProfilePhoto"), DisableRequestSizeLimit] [Produces("application/json", "application/xml", Type = typeof(UserDto))] public async Task UpdateUserProfilePhoto() { var updateUserProfilePhotoCommand = new UpdateUserProfilePhotoCommand() { FormFile = Request.Form.Files, RootPath = _webHostEnvironment.WebRootPath }; var result = await _mediator.Send(updateUserProfilePhotoCommand); return ReturnFormattedResponse(result); } /// /// Delete User By Id /// /// /// [HttpDelete("{Id}")] [ClaimCheck("user_delete", "user_edit")] public async Task DeleteUser(Guid Id) { var deleteUserCommand = new DeleteUserCommand { Id = Id }; var result = await _mediator.Send(deleteUserCommand); return StatusCode(result.StatusCode, result); } /// /// User Change Password /// /// /// [HttpPost("changepassword")] public async Task ChangePassword(ChangePasswordCommand resetPasswordCommand) { var result = await _mediator.Send(resetPasswordCommand); return ReturnFormattedResponse(result); } /// /// Reset Resetpassword /// /// /// [HttpPost("resetpassword")] [ClaimCheck("reset_password_edit")] public async Task ResetPassword(ResetPasswordCommand newPasswordCommand) { var result = await _mediator.Send(newPasswordCommand); return ReturnFormattedResponse(result); } /// /// Get User Profile /// /// [HttpGet("profile")] public async Task GetProfile() { var getUserQuery = new GetUserQuery { Id = Guid.Parse(_userInfo.Id) }; var result = await _mediator.Send(getUserQuery); if (!string.IsNullOrWhiteSpace(result.Data.ProfilePhoto)) { result.Data.ProfilePhoto = $"Users/{result.Data.ProfilePhoto}"; } return ReturnFormattedResponse(result); } [HttpGet("dropdown")] public async Task GetUserForDropdown() { var getUserQuery = new GetUsersForDropdownQuery(); var result = await _mediator.Send(getUserQuery); return Ok(result); } } }