public ActionResult SignUp(string plan, SignUpModel model) { if (ModelState.IsValid) { try { PlanSignUpRequest request = new PlanSignUpRequest { PlanName = Request.QueryString["plan"], SignUpModel = model }; PlanSignUpResponse response = _planService.PlanSignUp(request); if (response.HasError && response.ErrorCode == ErrorCode.PlanNotFound) { return(RedirectToAction("Pricing", "Plans")); } if (response.HasError && response.ErrorCode == ErrorCode.DomainAlreadyExists) { ModelState.AddModelError("Domain", "Domain already exists"); } var domainURL = "https://" + $"{model.Domain}{ConfigurationManager.AppSettings["HostnameBase"]}"; var emailTemplate = _emailTemplatesRepository.GetTemplateByName(Common.Helpers.Utilities.ToDescriptionString(EmailTemplateCode.SignUpGreeting)); model.PlanName = plan; emailTemplate = EmailTemplateFactory.ParseTemplate(emailTemplate, model); var mailMessage = MailMessageMapper.ConvertToMailMessage(emailTemplate); EmailServiceFactory.GetEmailService().SendMail(mailMessage); TempData["Domain"] = domainURL; return(RedirectToAction("thank-you")); } catch (Exception ex) { var errMsg = ex.Message; if (ex.InnerException != null && !string.IsNullOrWhiteSpace(ex.InnerException.Message)) { errMsg += ", " + ex.InnerException.Message; } LoggingFactory.GetLogger().Log(errMsg, EventLogSeverity.Error); ModelState.AddModelError("", errMsg); } } return(View(model)); }
/// <summary> /// Sign up a user to a plan /// </summary> /// <param name="request">Sign up request</param> public PlanSignUpResponse PlanSignUp(PlanSignUpRequest request) { try { // Begin transaction _unitOfWork.Begin("PlanSignUp"); var response = new PlanSignUpResponse(); var dbPlan = _planRepository.Query().FirstOrDefault(p => p.PlanCode.ToLower() == request.PlanName.ToLower()); if (dbPlan == null) { response.HasError = true; response.ErrorCode = ErrorCode.PlanNotFound; return(response); } if (request.SignUpModel.Domain != null) { if ( _customerRepository.Query().Any( t => t.Hostname.ToLower() == request.SignUpModel.Domain.ToLower())) { response.ErrorCode = ErrorCode.DomainAlreadyExists; response.HasError = true; return(response); } } // Customer var customer = new Customer(request.SignUpModel.FullName, request.SignUpModel.Domain, request.SignUpModel.Company); _customerRepository.Add(customer); // Role var role = new Role(customer, "Administrator", true, UserType.SystemUser); _roleRepository.Add(role); // Setup the User var user = new User(customer, request.SignUpModel.Email, request.SignUpModel.FirstName, request.SignUpModel.LastName, request.SignUpModel.Password); _userRepository.Add(user); role.AddUser(user); customer.UpdateAdminUser(user); // Security questions var referenceList = _referenceListRepository.Query().FirstOrDefault(l => l.SystemName == "Security Questions"); if (referenceList == null) { throw new NullReferenceException("Security questions reference list is null"); } foreach (var securityQuestion in SecurityQuestions.Questions) { referenceList.AddItem(customer, securityQuestion); } // User security questions user.AddSecurityQuestion("a", "a"); user.AddSecurityQuestion("b", "b"); user.AddSecurityQuestion("c", "c"); // Create customer in stripe var stripeCustomer = StripeFactory.GetStripeService().CreateCustomer(request.SignUpModel.FullName, request.SignUpModel.Email); customer.PaymentCustomerId = stripeCustomer.Id; // Associate plan var result = StripeFactory.GetStripeService().AssignCustomerPlan(customer.PaymentCustomerId, dbPlan.PlanCode, request.SignUpModel.CardNumber, request.SignUpModel.SecurityCode, int.Parse( request.SignUpModel.Expiration. Substring(0, 2)), int.Parse( request.SignUpModel.Expiration. Substring(3, 2))); if (result != "active") { throw new Exception($"Incorrect assigning plan result for Customer {customer.FullName}"); } customer.UpdatePlan(dbPlan); _customerRepository.Update(customer); // End transaction _unitOfWork.End(); // Send email var emailTemplate = _emailTemplatesRepository.GetTemplateByName( EmailTemplateCode.SignUpGreeting.ToDescriptionString()); emailTemplate = EmailTemplateFactory.ParseTemplate(emailTemplate, customer); var mailMessage = MailMessageMapper.ConvertToMailMessage(emailTemplate); var emailResult = EmailServiceFactory.GetEmailService().SendMail(mailMessage); if (!emailResult) { throw new Exception("Problem sending email"); } return(response); } catch (StripeException ex) { LoggingFactory.GetLogger().LogError(ex); throw new Exception("Assigning customer plan error", ex); } catch (Exception ex) { LoggingFactory.GetLogger().LogError(ex); throw; } }