private async Task RemoveTenantsWithoutCustomFolders() { var tenants = await _tenantsDbContext.Tenants.ToListAsync(); tenants.ForEach(tenant => { if (TenantsCustomFolderManager.DoesTenantHaveCustomFolder(_tenantsDirectory, tenant.Name) == false) { TenantsCustomFolderManager.DeleteTenantFromConfiguration(tenant.Name); _tenantsDbContext.Remove(tenant); } }); await _tenantsDbContext.SaveChangesAsync(); }
private void MigrateTenantsDatabases() { var connectionStrings = GetConnectionStrings(); foreach (var connectionString in connectionStrings) { var connectionStringValue = connectionString.Value; var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>(); var options = optionsBuilder.UseSqlServer(connectionStringValue).Options; var dbContext = new ApplicationDbContext(options); dbContext.Database.Migrate(); //Data.SeedData.Seed(dbContext); TenantsCustomFolderManager.CreateContentDirectoryIfItDoesNotExist(Directory.GetCurrentDirectory() + "/wwwroot/tenants/", connectionString.Key); } }
public async Task <IActionResult> CreateNewTenant(Tenant tenant) { try { if (tenant == null || string.IsNullOrWhiteSpace(tenant.Name) || string.IsNullOrWhiteSpace(tenant.ConnectionString)) { return(StatusCode((int)HttpStatusCode.UnprocessableEntity, "The tenant name and connection string must not be null")); } var tenantName = tenant.Name; var connectionString = Regex.Unescape(tenant.ConnectionString); var connectionStringBuilder = new SqlConnectionStringBuilder(connectionString); if (_tenantsDbContext.Tenants.Any(tenant => tenant.Name == tenantName)) { return(StatusCode((int)HttpStatusCode.InternalServerError, $"The tenant: {tenantName}. Is already in the tenants database.")); } var newTenant = new Tenant { Guid = Guid.NewGuid().ToString(), Name = tenantName, ConnectionString = connectionStringBuilder.ConnectionString }; _tenantsDbContext.Tenants.Add(newTenant); await _tenantsDbContext.SaveChangesAsync(); var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>(); var options = optionsBuilder.UseSqlServer(connectionStringBuilder.ConnectionString).Options; var dbContext = new ApplicationDbContext(options); dbContext.Database.Migrate(); //Data.SeedData.Seed(dbContext); if (TenantsCustomFolderManager.CreateContentDirectoryIfItDoesNotExist(_tenantsDirectory, tenantName)) { _logger.LogInformation($"Custom content folder created for: {tenantName}"); } TenantsCustomFolderManager.CreateTenantInConfiguration(tenantName, connectionStringBuilder.ConnectionString); return(Ok("Tenant Created")); } catch (Exception ex) { _logger.LogError(ex.Message); return(StatusCode((int)HttpStatusCode.InternalServerError, ex.Message)); } }
private void MigrateTenantsDatabases() { // Instead of using the connections.json file. Managing tenants from the TenantsDbContext will work too. // var tenants = new TenantsDbContext(options).Tenants.ToList(); var connectionStrings = GetConnectionStrings(); foreach (var connectionString in connectionStrings) { var connectionStringValue = connectionString.Value; var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>(); var options = optionsBuilder.UseSqlServer(connectionStringValue).Options; var dbContext = new ApplicationDbContext(options); dbContext.Database.Migrate(); IUserStore <IdentityUser> store = new UserStore <IdentityUser>(dbContext); var userManager = new UserManager <IdentityUser>(store, null, new PasswordHasher <IdentityUser>(), null, null, null, null, null, null); var roleManager = new RoleManager <IdentityRole>(new RoleStore <IdentityRole>(dbContext), null, null, null, null); Data.SeedData.Seed(dbContext, userManager, roleManager, new string[] { "admin" }).Wait(); TenantsCustomFolderManager.CreateContentDirectoryIfItDoesNotExist(Directory.GetCurrentDirectory() + "/wwwroot/tenants/", connectionString.Key); } }
public async Task <IActionResult> DeleteTenant(string tenantName) { try { if (string.IsNullOrWhiteSpace(tenantName)) { return(StatusCode((int)HttpStatusCode.UnprocessableEntity, "The tenant name cannot be empty")); } if (_configuration.GetValue <string>("DefaultTenant") == tenantName) { return(StatusCode((int)HttpStatusCode.InternalServerError, "You cannot delete the default tenant")); } var tenantToDelete = _tenantsDbContext.Tenants.FirstOrDefault(tenant => tenant.Name == tenantName); if (tenantToDelete != null) { TenantsCustomFolderManager.DeleteTenantsCustomFolder(_tenantsDirectory, tenantName); TenantsCustomFolderManager.DeleteTenantFromConfiguration(tenantToDelete.Name); CustomTenantsFileManager.RemoveCustomTenant(tenantToDelete.Name); _tenantsDbContext.Tenants.Remove(tenantToDelete); await _tenantsDbContext.SaveChangesAsync(); return(Ok($"Tenant: {tenantName} has been deleted")); } else { return(StatusCode((int)HttpStatusCode.InternalServerError, $"The tenant: {tenantName}. Does not exist.")); } } catch (Exception ex) { _logger.LogError(ex.Message); return(StatusCode((int)HttpStatusCode.InternalServerError, ex.Message)); } }