public override async Task <TenantDto> Create(CreateTenantDto input) { CheckCreatePermission(); //Create tenant var tenant = ObjectMapper.Map <Tenant>(input); tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty() ? null : SimpleStringCipher.Instance.Encrypt(input.ConnectionString); var defaultEdition = await _editionManager.FindByNameAsync(EditionManager.DefaultEditionName); if (defaultEdition != null) { tenant.EditionId = defaultEdition.Id; } await _tenantManager.CreateAsync(tenant); await CurrentUnitOfWork.SaveChangesAsync(); //To get new tenant's id. //Create tenant database _dbMigrator.CreateOrMigrateForTenant(tenant); //We are working entities of new tenant, so changing tenant filter using (CurrentUnitOfWork.SetTenantId(tenant.Id)) { //Create static roles for new tenant CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id)); await CurrentUnitOfWork.SaveChangesAsync(); //To get static role ids //grant all permissions to admin role var adminRole = _roleManager.Roles.Single(r => r.Name == StaticRoleNames.Tenants.Admin); await _roleManager.GrantAllPermissionsAsync(adminRole); //Create admin user for the tenant var adminUser = User.CreateTenantAdminUser(tenant.Id, input.AdminEmailAddress, CoreConsts.DefaultAdminUserName, CoreConsts.DefaultAdminPassword); CheckErrors(await _userManager.CreateAsync(adminUser)); await CurrentUnitOfWork.SaveChangesAsync(); //To get admin user's id //Assign admin user to role! CheckErrors(await _userManager.AddToRoleAsync(adminUser.Id, adminRole.Name)); await CurrentUnitOfWork.SaveChangesAsync(); } return(MapToEntityDto(tenant)); }
public void Run(bool skipConnVerification) { var hostConnStr = _connectionStringResolver.GetNameOrConnectionString(new ConnectionStringResolveArgs(MultiTenancySides.Host)); if (hostConnStr.IsNullOrWhiteSpace()) { Log.Write("Configuration file should contain a connection string named 'Default'"); return; } Log.Write("Host database: " + hostConnStr); if (!skipConnVerification) { Log.Write("Continue to migration for this host database and all tenants..? (Y/N): "); var command = Console.ReadLine(); if (!command.IsIn("Y", "y")) { Log.Write("Migration canceled."); return; } } Log.Write("HOST database migration started..."); try { _migrator.CreateOrMigrateForHost(); } catch (Exception ex) { Log.Write("An error occured during migration of host database:"); Log.Write(ex.ToString()); Log.Write("Canceled migrations."); return; } Log.Write("HOST database migration completed."); Log.Write("--------------------------------------------------------"); var migratedDatabases = new HashSet <string>(); var tenants = _tenantRepository.GetAllList(t => t.ConnectionString != null && t.ConnectionString != ""); for (int i = 0; i < tenants.Count; i++) { var tenant = tenants[i]; Log.Write(string.Format("Tenant database migration started... ({0} / {1})", (i + 1), tenants.Count)); Log.Write("Name : " + tenant.Name); Log.Write("TenancyName : " + tenant.TenancyName); Log.Write("Tenant Id : " + tenant.Id); Log.Write("Connection string : " + SimpleStringCipher.Instance.Decrypt(tenant.ConnectionString)); if (!migratedDatabases.Contains(tenant.ConnectionString)) { try { _migrator.CreateOrMigrateForTenant(tenant); } catch (Exception ex) { Log.Write("An error occured during migration of tenant database:"); Log.Write(ex.ToString()); Log.Write("Skipped this tenant and will continue for others..."); } migratedDatabases.Add(tenant.ConnectionString); } else { Log.Write("This database has already migrated before (you have more than one tenant in same database). Skipping it...."); } Log.Write(string.Format("Tenant database migration completed. ({0} / {1})", (i + 1), tenants.Count)); Log.Write("--------------------------------------------------------"); } Log.Write("All databases have been migrated."); }