public async Task <IActionResult> Post([FromBody] UiUserDetails userDetails) { if (userDetails == null || !ModelState.IsValid || userDetails.Id != "new") { return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input."))); } var errorList = new List <UiResponseMessage>(); var userWithTheSameName = await _userManager.FindByNameAsync(userDetails.UserName); if (userWithTheSameName != null) { errorList.Add(new UiResponseMessage { Code = "duplicate_name", Message = "User with the same name is already exists." }); } var userWithTheSameEmail = await _userManager.FindByEmailAsync(userDetails.Email); if (userWithTheSameEmail != null) { errorList.Add(new UiResponseMessage { Code = "duplicate_email", Message = "User with the same email is already exists." }); } if (errorList.Count > 0) { return(BadRequest(new UiResponse(false, errorList))); } if (userDetails.Id == "new") { userDetails.Id = Guid.NewGuid().ToString(); } var applicationUser = _mapper.Map <ApplicationUser>(userDetails); var userCreationResult = await _userManager.CreateAsync(applicationUser, userDetails.Password); if (!userCreationResult.Succeeded) { foreach (var identityError in userCreationResult.Errors) { errorList.Add(new UiResponseMessage { Code = "identity_error", Message = identityError.Description }); } return(BadRequest(new UiResponse(false, errorList))); } await _userManager.AddToRolesAsync(applicationUser, userDetails.Roles.Select(x => x.Name)); return(Ok(new UiResponse(true, "user_created", "User created successfully."))); }
public async Task <IActionResult> Put(string id, [FromBody] UiUserDetails userDetails) { if (!User.IsInRole("Admin") && id != User.FindFirstValue(ClaimTypes.NameIdentifier)) { return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input."))); } if (userDetails == null || !ModelState.IsValid || userDetails.Id != id || string.IsNullOrWhiteSpace(userDetails.Id)) { return(BadRequest(new UiResponse(false, "invalid_input", "Invalid input."))); } var errorList = new List <UiResponseMessage>(); var userWithTheSameName = await _userManager.FindByNameAsync(userDetails.UserName); if (userWithTheSameName != null && userWithTheSameName.Id != id) { errorList.Add(new UiResponseMessage { Code = "duplicate_name", Message = "User with the same name is already exists." }); } var userWithTheSameEmail = await _userManager.FindByEmailAsync(userDetails.Email); if (userWithTheSameEmail != null && userWithTheSameEmail.Id != id) { errorList.Add(new UiResponseMessage { Code = "duplicate_email", Message = "User with the same email is already exists." }); } var user = await _userManager.FindByIdAsync(id); if (user == null) { errorList.Add(new UiResponseMessage { Code = "internal_error", Message = "User is not available for editing." }); } if (errorList.Count > 0) { return(BadRequest(new UiResponse(false, errorList))); } user.Email = userDetails.Email; user.PhoneNumber = userDetails.PhoneNumber; user.UserName = userDetails.UserName; var updateUserResult = await _userManager.UpdateAsync(user); errorList.AddRange(IdentityResultToResponseMessages(updateUserResult)); if (errorList.Count > 0) { return(BadRequest(new UiResponse(false, errorList))); } if (!string.IsNullOrWhiteSpace(userDetails.Password) && userDetails.Password == userDetails.Password2) { if (await _userManager.HasPasswordAsync(user)) { await _userManager.RemovePasswordAsync(user); } var updatePasswordResult = await _userManager.AddPasswordAsync(user, userDetails.Password); if (!updatePasswordResult.Succeeded) { errorList.AddRange(IdentityResultToResponseMessages(updatePasswordResult)); return(BadRequest(new UiResponse(false, errorList))); } } if (User.IsInRole("Admin")) { var roles = await _userManager.GetRolesAsync(user); await _userManager.RemoveFromRolesAsync(user, roles); await _userManager.AddToRolesAsync(user, userDetails.Roles.Select(x => x.Name)); } return(Ok(new UiResponse(true, "user_updated", "User updated successfully."))); }