Example #1
0
        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();
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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));
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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));
            }
        }