/// <inheritdoc /> public async Task <Dto.GetDetailsAsync.ResponseDto> RegisterAsync(Dto.RegisterAsync.RequestDto dto) { if (string.IsNullOrWhiteSpace(dto.Password)) { throw new InvalidPasswordException(_l["Password is required."]); } var existingUser = await _db.Users.FirstOrDefaultAsync( x => x.Username == dto.Username || x.Email == dto.Email); if (existingUser?.Username == dto.Username) { throw new UsernameTakenException(string.Format(_l["Username '{0}' is already taken."], dto.Username)); } if (existingUser?.Email == dto.Email) { throw new EmailTakenException(string.Format(_l["Email '{0}' is already taken."], dto.Email)); } var(passwordHash, passwordSalt) = _passwordHelper.CreateHash(dto.Password); var user = new User { Id = Guid.NewGuid(), GivenName = dto.GivenName, FamilyName = dto.FamilyName, Username = dto.Username, IsActive = false // Email must be confirmed first. }; var emailSuccess = await ChangeEmailAsync(user, dto.Email); user.CreatedAt = DateTime.UtcNow; user.PasswordHash = passwordHash; user.PasswordSalt = passwordSalt; if (!emailSuccess) { throw new EmailNotSentException(_l["Sending of confirmation email failed."]); } await _db.Users.AddAsync(user); await _db.SaveChangesAsync(); return(new Dto.GetDetailsAsync.ResponseDto { Id = user.Id, Username = user.Username, GivenName = user.GivenName, FamilyName = user.FamilyName, Email = user.Email, CreatedAt = user.CreatedAt, UpdatedAt = user.UpdatedAt, LastLoginAt = user.LastLoginAt, IsActive = user.IsActive }); }
/// <inheritdoc /> public async Task <Dto.GetDetailsAsync.ResponseDto> CreateAsync(Guid userId, Dto.RegisterAsync.RequestDto dto) { if (string.IsNullOrWhiteSpace(dto.Password)) { throw new InvalidPasswordException(_l["Password is required."]); } var existingUser = await _db.Users.FirstOrDefaultAsync( x => x.Username == dto.Username || x.Email == dto.Email); if (existingUser?.Username == dto.Username) { throw new UsernameTakenException(string.Format(_l["Username '{0}' is already taken."], dto.Username)); } if (existingUser?.Email == dto.Email) { throw new EmailTakenException(string.Format(_l["Email '{0}' is already taken."], dto.Email)); } var(passwordHash, passwordSalt) = _passwordHelper.CreateHash(dto.Password); var user = new User { Id = Guid.NewGuid(), GivenName = dto.GivenName, FamilyName = dto.FamilyName, Username = dto.Username, IsActive = true, Email = dto.Email, CreatedById = userId, CreatedAt = DateTime.UtcNow, PasswordHash = passwordHash, PasswordSalt = passwordSalt }; await _db.Users.AddAsync(user); await _db.SaveChangesAsync(); return(new Dto.GetDetailsAsync.ResponseDto { Id = user.Id, Username = user.Username, GivenName = user.GivenName, FamilyName = user.FamilyName, Email = user.Email, CreatedAt = user.CreatedAt, UpdatedAt = user.UpdatedAt, LastLoginAt = user.LastLoginAt, IsActive = user.IsActive }); }
public async Task <ActionResult> RegisterAsync([FromBody] Dto.RegisterAsync.RequestDto dto) { try { var user = await _userService.RegisterAsync(dto); return(CreatedAtAction(nameof(GetDetailsAsync), new { id = user.Id }, user)); } catch (EmailNotSentException ex) { return(StatusCode((int)HttpStatusCode.BadGateway, new ResponseMessage { Message = ex.Message })); } catch (AppException ex) { return(BadRequest(new ResponseMessage { Message = ex.Message })); } }