public IActionResult Register([FromBody] AdministratorRegisterDto admin) { if (_service.IsUserExist(admin.UserName)) { ModelState.AddModelError("UserName", "Username already taken"); } if (!ModelState.IsValid) { return(BadRequest()); } var adminToCreate = new Administrator() { User = new User() { Name = admin.Name, Surname = admin.Surname, UserName = admin.UserName, Email = admin.Email } }; _service.Register(adminToCreate, admin.Password); // 201: Created Status return(StatusCode(201)); }
public async Task <IActionResult> AdministratorRegister([FromBody] AdministratorRegisterDto dto) { AdministratorRegisterDtoValidator validator = new AdministratorRegisterDtoValidator(); ValidationResult result = await validator.ValidateAsync(dto); if (result.IsValid) { #region 驗證重複 if (await _userManager.Users.AnyAsync(x => x.UserName == dto.UserName)) { result.Errors.Add(new ValidationFailure("userName", "使用者名稱已經被使用")); } if (await _userManager.Users.AnyAsync(x => x.Email == dto.Email)) { result.Errors.Add(new ValidationFailure("email", "電子郵件已經被使用")); } if (!string.IsNullOrEmpty(dto.PhoneNumber)) { if (await _userManager.Users.AnyAsync(x => x.PhoneNumber == dto.PhoneNumber)) { result.Errors.Add(new ValidationFailure("phoneNumber", "手機號碼已經被使用")); } } if (!string.IsNullOrEmpty(dto.NationalId)) { if (await _userManager.Users.AnyAsync(x => x.NationalId == dto.NationalId.ToUpper())) { result.Errors.Add(new ValidationFailure("nationalId", "身份證字號已經被使用")); } } if (!string.IsNullOrEmpty(dto.NetworkId)) { if (await _userManager.Users.AnyAsync(x => x.Administrator.NetworkId == dto.NetworkId.ToUpper() || x.Employee.NetworkId == dto.NetworkId.ToUpper() || x.Student.NetworkId == dto.NetworkId.ToUpper())) { result.Errors.Add(new ValidationFailure("networkId", "證號已經被使用")); } } #endregion if (result.IsValid) { var entity = _mapper.Map <ApplicationUser>(dto); await using (var transaction = await _dbContext.Database.BeginTransactionAsync()) { try { #region 建立使用者 if (await _userManager.CreateAsync(entity, dto.Password) != IdentityResult.Success) { throw new DbUpdateException(); } #endregion #region 添加 Claim var claims = new List <Claim> { new Claim(ClaimTypes.NameIdentifier, entity.Id), new Claim(ClaimTypes.Name, entity.UserName), new Claim(ClaimTypes.Email, entity.Email), new Claim(ClaimTypes.Sid, entity.SecurityStamp) }; if (await _userManager.AddClaimsAsync(entity, claims) != IdentityResult.Success) { throw new DbUpdateException(); } #endregion #region 添加角色 if (await _userManager.AddToRoleAsync(entity, "Administrator") != IdentityResult.Success) { throw new DbUpdateException(); } #endregion await transaction.CommitAsync(); } catch (DbUpdateException) { await transaction.RollbackAsync(); throw; } } #region 寄信 var link = $"{_configuration["FrontendUrl"]}/account/email/confirm" + $"?userId={Uri.EscapeDataString(entity.Id)}" + $"&token={Uri.EscapeDataString(await _userManager.GenerateEmailConfirmationTokenAsync(entity))}"; await _mailService.SendEmailConfirmAsync(entity.Email, entity.Email, link, true); #endregion var returnDto = _mapper.Map <AdministratorProfileDto>(entity); return(CreatedAtAction(nameof(AdministratorProfile), null, returnDto)); } } return(BadRequest(result.Errors)); }