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));
        }