/// <summary> /// Takes CreateUserDto from controller, creates a user, creates roles if they don't exists, /// adds user to Player role, sends a notification to an admin user to approve their originally requested role and /// returns a UserLoggedInDto /// </summary> /// <param name="cud"></param> /// <returns>UserLoggedInDto</returns> public async Task <AuthResponseDto> CreateUser(CreateUserDto cud) { // Try to seed data if AspNetUsers table is empty await _repo.SeedUsers(); // Build IdentityRoles if (!await _roleManager.RoleExistsAsync(Roles.A)) { await _roleManager.CreateAsync(new IdentityRole(Roles.A)); await _roleManager.CreateAsync(new IdentityRole(Roles.LM)); await _roleManager.CreateAsync(new IdentityRole(Roles.HC)); await _roleManager.CreateAsync(new IdentityRole(Roles.AC)); await _roleManager.CreateAsync(new IdentityRole(Roles.PT)); await _roleManager.CreateAsync(new IdentityRole(Roles.PL)); await _roleManager.CreateAsync(new IdentityRole(Roles.UU)); } ApplicationUser user = new ApplicationUser { FullName = cud.FullName, PhoneNumber = cud.PhoneNumber, Email = cud.Email, SecurityStamp = Guid.NewGuid().ToString(), UserName = cud.UserName, RoleName = cud.RoleName }; if (cud.TeamID != null) { user.TeamID = (Guid)cud.TeamID; } // Create new User via UserManager var result = await _userManager.CreateAsync(user, cud.Password); if (!result.Succeeded) { return(new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = result.ToString() }); } // Send Email Confirmation token var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); var param = new Dictionary <string, string> { { "token", token }, { "email", user.Email } }; var callback = QueryHelpers.AddQueryString(cud.ClientURI, param); var message = new EmailMessage(new string[] { user.Email }, "Email Confirmation token", callback, null); using (var httpClient = new HttpClient()) { var response = await httpClient.PostAsJsonAsync($"http://*****:*****@GMAIL.COM") { await _userManager.AddToRoleAsync(user, Roles.A); } // Notify Admin of new League Manager request - reject if role filled if (leagueManager == null && cud.RoleName == "League Manager") { var adminMessage = new EmailMessage(new string[] { admin.Email }, "New League Manager to confirm", $"User {user.UserName} has been created and has asked for permissions to {cud.RoleName}. Log in to apply the role.", null); using var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync($"http://localhost:44348/api/Message/SendEmail", adminMessage); } else if (leagueManager != null) { return(new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = "This League already has a League Manager" }); } //Notify League Manager of Head Coach request - reject if role filled if (coach == null && cud.RoleName == "Head Coach") { var lmMessage = new EmailMessage(new string[] { leagueManager.Email }, "New Head Coach to confirm", $"User {user.UserName} has been created and has asked for permissions to {cud.RoleName}. Log in to apply the role.", null); using var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync($"http://20.185.100.57:80/api/Message/SendEmail", lmMessage); } else if (coach != null) { return(new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = "This team already has a Head Coach" }); } //Notify Head Coach of user registration and set as role with no priveleges if (cud.RoleName == "Parent" || cud.RoleName == "Player" || cud.RoleName == "Assistant Coach") { var coachMessage = new EmailMessage(new string[] { coach.Email }, "New user to confirm", $"User {user.UserName} has been created and has asked for permissions to {cud.RoleName}. Log in to apply a role.", null); using var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync($"http://20.185.100.57:80/api/Message/SendEmail", coachMessage); } await _userManager.AddToRoleAsync(user, Roles.UU); return(new AuthResponseDto { IsAuthSuccessful = true }); }