public CreateUserResponse CreateUser(CreateUserRequest request) // Done in new API { Stopwatch stopwatch = Stopwatch.StartNew(); CreateUserResponse response = new CreateUserResponse(); try { if (!Patterns.EmailRegex.IsMatch(request.Email)) return Error(response, ResultCode.InvalidParameter, "The email address is invalid."); if (!Patterns.PasswordRegex.IsMatch(request.Password)) return Error(response, ResultCode.InvalidParameter, "The password is invalid."); if (!Patterns.DisplayNameRegex.IsMatch(request.DisplayName)) return Error(response, ResultCode.InvalidParameter, "The display name is invalid."); if (!Patterns.LegalNameRegex.IsMatch(request.FirstName)) return Error(response, ResultCode.InvalidParameter, "The first name is invalid."); if (!Patterns.LegalNameRegex.IsMatch(request.LastName)) return Error(response, ResultCode.InvalidParameter, "The last name is invalid."); if (request.LocationID <= 0) return Error(response, ResultCode.InvalidParameter, "The location id is invalid."); if (!Patterns.SMSNumberRegex.IsMatch(request.SMSNumber)) return Error(response, ResultCode.InvalidParameter, "The sms number is invalid."); using (ReliableSqlConnection fundamintDatabase = Common.FundamintDatabase) { ClientData clientData = null; if (!Common.ValidateClientAuthorization(fundamintDatabase, request, response, ref clientData)) return response; Guid userID = Guid.NewGuid(); Guid passwordSalt = Guid.NewGuid(); string passwordHash = Common.HashStrings(passwordSalt.ToSimpleString(), request.Password); Guid emailVerifier = Guid.NewGuid(); string smsVerifier = Common.GenerateSMSVerifier(); LocationData locationData = null; if (fundamintDatabase.ExecuteScalar(null, "SELECT COUNT(*) FROM [User] WHERE [Email]=@0 OR [EmailVerifying]=@0", request.Email) != 0) return Error(response, ResultCode.UnavailableEmail, "The email address is already in use."); if (fundamintDatabase.ExecuteScalar(null, "SELECT COUNT(*) FROM [User] WHERE [DisplayName]=@0", request.DisplayName) != 0) return Error(response, ResultCode.UnavailableName, "The display name is already in use."); if (fundamintDatabase.ExecuteScalar(null, "SELECT COUNT(*) FROM [User] WHERE [SMSNumber]=@0", request.SMSNumber) != 0) return Error(response, ResultCode.UnavailableSMSNumber, "The sms number is already in use."); if ((locationData = StaticCache.GetLocationDataByID(request.LocationID)) == null) return Error(response, ResultCode.UnknownLocation, "The location is unknown."); fundamintDatabase.Execute(null, "INSERT INTO [User]([UserID],[EmailVerifying],[EmailVerifier],[EmailExpirationDate],[PasswordSalt],[PasswordHash],[DisplayName],[FirstName],[LastName],[LocationID],[ContactDetails],[SMSNumber],[SMSVerifier],[PreferredTimezone],[Focus]) " + "VALUES(@0,@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14)", userID, request.Email, emailVerifier, DateTime.UtcNow.AddHours(1), passwordSalt, passwordHash, request.DisplayName, request.FirstName, request.LastName, request.LocationID, request.ContactDetails, request.SMSNumber, smsVerifier, locationData.LocationTimezoneID, request.Focus); CloudStorageManager.CopyBlob(Common.FundamintStorageAccountName, Common.FundamintStorageAccountKey, Common.PublicBlobStorageUserContainer, "default/150x150.jpg", userID.ToSimpleString().ToLower() + "/150x150.jpg"); //string smtpMessage = "Someone (hopefully you) is attempting to register a new account with " + clientData.Name + ", using this email address.
\n" + // "If you did not request this registration, please ignore this email.
\n" + // "Otherwise, please click the link below and enter the additional required SMS verifier which you should have received by now.

\n\n" + // "Proceed to Verification
\n"; TransmissionData transmissionData = Common.GetTransmission(fundamintDatabase, request.ClientAuthorization.ClientID, TransmissionType.CreateUser); Dictionary variableSubstitutions = new Dictionary(); variableSubstitutions.Add("{ClientName}", clientData.Name); variableSubstitutions.Add("{UserEmailVerifier}", emailVerifier.ToSimpleString()); variableSubstitutions.Add("{UserDisplayName}", request.DisplayName); variableSubstitutions.Add("{UserEmail}", request.Email); variableSubstitutions.Add("{UserFirstName}", request.FirstName); variableSubstitutions.Add("{UserLastName}", request.LastName); variableSubstitutions.Add("{VerificationUrl}", request.SMTPVerifyUserUrl + emailVerifier.ToSimpleString()); string smtpMessage = BBCodeConverter.ConvertToHTML(transmissionData.Template, variableSubstitutions); Common.QueueSMSMessage(request.SMSNumber, clientData.Name + " SMS Verifier: " + smsVerifier); Common.QueueSMTPMessage(clientData.SMTPFromAddress, clientData.SMTPFromDisplay, request.Email, request.DisplayName, clientData.Name + " Registration", smtpMessage); BackgroundWorker.ForceExecution(); } } catch (Exception exc) { Error(response, ResultCode.ServiceException, Environment.NewLine + exc.ToString()); } finally { stopwatch.Stop(); response.ExecutionMilliseconds = stopwatch.ElapsedMilliseconds; } return response; }