import { DataSource } from 'typeorm'; import debug from 'debug'; import path from 'path'; import { User } from '../src/entity/User'; import { Organization } from '../src/entity/Organization'; import { Project } from '../src/entity/Project'; import { UserOrganization } from '../src/entity/UserOrganization'; import { EnvironmentVariable } from '../src/entity/EnvironmentVariable'; import { Domain } from '../src/entity/Domain'; import { ProjectMember } from '../src/entity/ProjectMember'; import { Deployment } from '../src/entity/Deployment'; import { checkFileExists, getConfig, getEntities, loadAndSaveData } from '../src/utils'; import { Config } from '../src/config'; import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants'; const log = debug('snowball:initialize-database'); const USER_DATA_PATH = './fixtures/users.json'; const PROJECT_DATA_PATH = './fixtures/projects.json'; const ORGANIZATION_DATA_PATH = './fixtures/organizations.json'; const USER_ORGANIZATION_DATA_PATH = './fixtures/user-organizations.json'; const PROJECT_MEMBER_DATA_PATH = './fixtures/project-members.json'; const PRIMARY_DOMAIN_DATA_PATH = './fixtures/primary-domains.json'; const DEPLOYMENT_DATA_PATH = './fixtures/deployments.json'; const ENVIRONMENT_VARIABLE_DATA_PATH = './fixtures/environment-variables.json'; const REDIRECTED_DOMAIN_DATA_PATH = './fixtures/redirected-domains.json'; const generateTestData = async (dataSource: DataSource) => { const userEntities = await getEntities(path.resolve(__dirname, USER_DATA_PATH)); const savedUsers = await loadAndSaveData(User, dataSource, userEntities); const orgEntities = await getEntities(path.resolve(__dirname, ORGANIZATION_DATA_PATH)); const savedOrgs = await loadAndSaveData(Organization, dataSource, orgEntities); const projectRelations = { owner: savedUsers, organization: savedOrgs }; const projectEntities = await getEntities(path.resolve(__dirname, PROJECT_DATA_PATH)); const savedProjects = await loadAndSaveData(Project, dataSource, projectEntities, projectRelations); const domainRepository = dataSource.getRepository(Domain); const domainPrimaryRelations = { project: savedProjects }; const primaryDomainsEntities = await getEntities(path.resolve(__dirname, PRIMARY_DOMAIN_DATA_PATH)); const savedPrimaryDomains = await loadAndSaveData(Domain, dataSource, primaryDomainsEntities, domainPrimaryRelations); const domainRedirectedRelations = { project: savedProjects, redirectTo: savedPrimaryDomains }; const redirectDomainsEntities = await getEntities(path.resolve(__dirname, REDIRECTED_DOMAIN_DATA_PATH)); await loadAndSaveData(Domain, dataSource, redirectDomainsEntities, domainRedirectedRelations); const savedDomains = await domainRepository.find(); const userOrganizationRelations = { member: savedUsers, organization: savedOrgs }; const userOrganizationsEntities = await getEntities(path.resolve(__dirname, USER_ORGANIZATION_DATA_PATH)); await loadAndSaveData(UserOrganization, dataSource, userOrganizationsEntities, userOrganizationRelations); const projectMemberRelations = { member: savedUsers, project: savedProjects }; const projectMembersEntities = await getEntities(path.resolve(__dirname, PROJECT_MEMBER_DATA_PATH)); await loadAndSaveData(ProjectMember, dataSource, projectMembersEntities, projectMemberRelations); const deploymentRelations = { project: savedProjects, domain: savedDomains, createdBy: savedUsers }; const deploymentsEntities = await getEntities(path.resolve(__dirname, DEPLOYMENT_DATA_PATH)); await loadAndSaveData(Deployment, dataSource, deploymentsEntities, deploymentRelations); const environmentVariableRelations = { project: savedProjects }; const environmentVariablesEntities = await getEntities(path.resolve(__dirname, ENVIRONMENT_VARIABLE_DATA_PATH)); await loadAndSaveData(EnvironmentVariable, dataSource, environmentVariablesEntities, environmentVariableRelations); }; const main = async () => { const config = await getConfig(DEFAULT_CONFIG_FILE_PATH); const isDbPresent = await checkFileExists(config.database.dbPath); if (!isDbPresent) { const dataSource = new DataSource({ type: 'better-sqlite3', database: config.database.dbPath, synchronize: true, logging: true, entities: [path.join(__dirname, '../src/entity/*')] }); await dataSource.initialize(); await generateTestData(dataSource); log('Data loaded successfully'); } else { log('WARNING: Database already exists'); } }; main().catch((err) => { log(err); });