/// <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
            });
        }
Beispiel #3
0
        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
                }));
            }
        }