public async Task <IActionResult> RegisterCompany([FromBody] RegisterCompanyViewmodel model)
        {
            try
            {
                // As opposed to generating a signed JWT token, just parse
                // the model to a base64 string and inject it into the token.

                // Convert model to json.
                var modelJson = JsonSerializer.Serialize(model);
                // Get bytes of json string.
                var bytes = Encoding.UTF8.GetBytes(modelJson);
                // Get base64 of bytes.
                var model64 = Convert.ToBase64String(bytes);

                var key      = config["Sys:Key"];
                var issuer   = config["Sys:Issuer"];
                var audience = config["Sys:Audience"];

                var token = TokenHelper.JwtTokenGenerator(model64, key, issuer, audience);

                await SendRegisterCompanyEmail(model, model.User.Name, token);

                return(Ok());
            }
            catch (Exception ex)
            {
                _logger.LogError("Unable to register company user", ex);
                return(BadRequest(ex.ToString()));
            }
        }
        public async Task <IActionResult> ConfirmCompany([FromBody] RegisterCompanyViewmodel model)
        {
            try
            {
                // Create the company.
                var company = new Company
                {
                    Address = model.Company.Address,
                    Name    = model.Company.Name
                };
                await context.Companies.AddAsync(company);

                await context.SaveChangesAsync();

                // Register the user account.
                var user = new IdentityUser
                {
                    Email          = model.User.Email,
                    UserName       = model.User.Email,
                    EmailConfirmed = true
                };
                var result = await userManager.CreateAsync(user, model.User.Password);

                if (!result.Succeeded)
                {
                    return(BadRequest(result));
                }

                // Assign user to role.
                var companyRoleName = nameof(SystemRoles.Company);
                if (!await roleManager.RoleExistsAsync(companyRoleName))
                {
                    await roleManager.CreateAsync(new IdentityRole(companyRoleName));
                }
                await userManager.AddToRoleAsync(user, companyRoleName);

                // Create a link associating the the user with the company.
                await context.CompanyUsers.AddAsync(new CompanyUsers
                {
                    Company = company,
                    User    = user
                });

                await context.SaveChangesAsync();

                return(Ok());
            }
            catch (Exception ex)
            {
                _logger.LogError($"Unable to register new company", ex);
                return(BadRequest(ex.ToString()));
            }
        }
Exemple #3
0
        public async Task OnPost()
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (UserInput.ConfirmPassword == UserInput.Password)
                    {
                        // As opposed to generating a signed JWT token, just parse
                        // the model to a base64 string and inject it into the token.
                        var model = new RegisterCompanyViewmodel
                        {
                            Company = CompanyInput,
                            User    = new RegisterUserViewmodel
                            {
                                Email     = UserInput.Email,
                                IsCompany = true,
                                Name      = UserInput.Name,
                                Password  = UserInput.Password
                            }
                        };

                        // Convert model to json.
                        var modelJson = JsonSerializer.Serialize(model);
                        // Get bytes of json string.
                        var bytes = Encoding.UTF8.GetBytes(modelJson);
                        // Get base64 of bytes.
                        var model64 = Convert.ToBase64String(bytes);

                        var key      = config["Sys:Key"];
                        var issuer   = config["Sys:Issuer"];
                        var audience = config["Sys:Audience"];

                        var token = TokenHelper.JwtTokenGenerator(model64, key, issuer, audience);

                        await SendRegisterCompanyEmail(UserInput.Email, UserInput.Name, token);
                    }
                    else
                    {
                        ModelState.AddModelError(nameof(UserInput.ConfirmPassword), "Passwords don't match");
                    }
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Please ensure that you've filled in all the required fields.");
                }
            }
            catch (Exception ex)
            {
                logger.LogError($"Unable to register new company: {ex}", ex);
            }
        }
        private async Task SendRegisterCompanyEmail(RegisterCompanyViewmodel model, string name, string token)
        {
            var filePath = Path.Combine(environment.ContentRootPath, EmailTemplateConstants.USER_REGISTRATION_PATH);

            using var reader = new StreamReader(filePath);
            var mailText = await reader.ReadToEndAsync();

            var appBase = config["Sys:AppBase"];

            _ = mailText.Replace("{name}", name);
            _ = mailText.Replace("{username}", $"{model.User.Email}");

            // Link is the page on the web app, not the api endpoint.
            var link = $"{appBase}companies/confirm/?token={Uri.EscapeDataString(token)}";

            mailText = mailText.Replace("{link}", link);

            await emailService.SendAsync(model.User.Email, mailText, "Please confirm your registration - HealthImpact Appointments Portal", emailOptions.Value);
        }