/// <summary> /// Service method to register a new user /// </summary> /// <param name="model"></param> /// <returns></returns> public async Task <(UserView user, string message)> RegisterUser(SignUp model) { var userExists = await _userrepo.FirstOrDefault(r => r.Username == model.Username || r.Email == model.Email); if (userExists != null) { return(user : null, message : $"User {userExists.Username} exists."); } // Validate Email-add in-app var(IsValid, Email) = AuthUtil.ValidateEmail(model.Email); if (IsValid == false || model.Password.Length == 0) { return(user : null, message : $"Email format incorrect. or Password not inputed"); } if (userExists == null) { AuthUtil.CreatePasswordHash(model.Password, out byte[] passwordHash, out byte[] passwordSalt); var userDetails = new FXUser { CreatedAt = DateTime.Now, PasswordHash = passwordHash, PasswordSalt = passwordSalt, Username = model.Username, Email = model.Email, Role = UserRoles.User }; //Send verification notification Random rand = new Random(); string digits = rand.Next(0, 999999).ToString("D6"); var prepMessageDetails = new EmailMessage(); prepMessageDetails.ToEmail = model.Email; prepMessageDetails.Subject = $"Verify your Email"; prepMessageDetails.Body = $"Your OTP is {digits}"; // TODO: Set expiry on OTP. userDetails.OTP = digits; var newuser = await _userrepo.Insert(userDetails); //send email to user var sendmail = await _mail.SendEmailAsync(prepMessageDetails); if (sendmail) { var returnView = new UserView { Username = newuser.Username, Email = newuser.Email, LastName = model.LastName, FirstName = model.FirstName, Message = $"An Email has been sent to {model.Email} for verification.", IsVerified = false }; return(user : returnView, message : $"User created successfully. Check email {model.Email} for an OTP."); } } return(user : null, message : $"Something went wrong."); }