mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-21 21:47:17 +00:00
* added all pending cloud migration * restrict cloud migrations * added cloud data-migrations * Added cloud entities * keep tables across all * cloud licensing initial changes * fix * payments module * license counts updates * update * Added all pending cloud migration to pre-release + Payments module (#13006) * added all pending cloud migration * restrict cloud migrations * added cloud data-migrations * Added cloud entities * keep tables across all * payments module * license counts updates * update * migration fixes * pass orgId * movement * added cloud instance settings * org id to license terms * before merge * dockerfile changes for cloud * migration fixes * subscription * merge main * posthog-js package * fix * selhostcustomer migration timestamp update * fix * fixes * fix * fix * Adding cloud dockerfile changes * migration fix * fix * fix * fix * fixes * added migration progress * fix * added migration files for cloud * fix * added migrations for cloud * add organizationId for pages controller * fixes for plugins script * fix * final * added cloud licensing envs * UI WRAPPER BUG * fix * orgId groups fix * lint check fixes * Refactor Dockerfiles to use dynamic branch names for builds * Feature/promote release permission management (#13020) * migration and entity changes * removed extra migration * added default group permissions * basic ui changes * added promote and release permissions * fixed tooltips for promote and release buttons * fix * fixed app promote ability check * ce compatibility ui change * ui fixes * removed console.log * removed comments * updated ee-preview.Dockerile * using base img node:22.15.1-bullseye * fix for ce render * Update ce-preview.Dockerfile * Update ee-preview.Dockerfile * ui fix * fix * fixes * fixes * fixes * fixes * minor fixes * fix --------- Co-authored-by: Souvik <psouvik260@gmail.com> Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com> * Bugfix/git sync pre release (#13098) * bugfixes * ui fixes for disabled states in version creation * minor fixes * removed unused imports * fixes * removed comments * module file fixes * module fixes * white-labelling fixes * login-configs * fix for migration for ce * Fix for app count guard (#13131) * fix for app count guard * added check * for debug * license key * Modules : Platform Functionality (#12994) * init * mod * app import-export * licensing and UI * review and permissions * update * updates * update * update * fix breadcrumb * fix app builder error * remove launch button for modules * fixed homepage * fix permission check --------- Co-authored-by: platform-ops123 <platformops545@gmail.com> Co-authored-by: gsmithun4 <gsmithun4@gmail.com> * reverted logs * tjdb guard and dark mode (#13137) * ui fixes * added modules module * removed unused imports * fix * fix * Cypress fix * fixes for cloud instance level licensing (#13146) --------- Co-authored-by: platform-ops123 <platformops545@gmail.com> Co-authored-by: Rudra deep Biswas <rudra21ultra@gmail.com> Co-authored-by: Adish M <adish.madhu@gmail.com> Co-authored-by: Rudhra Deep Biswas <98055396+rudeUltra@users.noreply.github.com> Co-authored-by: Vijaykant Yadav <vjy239@gmail.com> Co-authored-by: Rohan Lahori <64496391+rohanlahori@users.noreply.github.com> Co-authored-by: Souvik <psouvik260@gmail.com> Co-authored-by: Adish M <44204658+adishM98@users.noreply.github.com> Co-authored-by: rohanlahori <rohanlahori99@gmail.com> Co-authored-by: ajith-k-v <ajith.jaban@gmail.com>
119 lines
4.1 KiB
TypeScript
119 lines
4.1 KiB
TypeScript
import { AppVersion } from '@entities/app_version.entity';
|
|
import { DataSourceOptions } from '@entities/data_source_options.entity';
|
|
import { EntityManager, MigrationInterface, QueryRunner } from 'typeorm';
|
|
import { defaultAppEnvironments } from '@helpers/utils.helper';
|
|
import { NestFactory } from '@nestjs/core';
|
|
import { EncryptionService } from '@modules/encryption/service';
|
|
import { Credential } from '@entities/credential.entity';
|
|
import { AppModule } from '@modules/app/module';
|
|
|
|
export class moveDataSourceOptionsToEnvironment1669054493160 implements MigrationInterface {
|
|
private nestApp;
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
// Create default environment for all apps
|
|
const entityManager = queryRunner.manager;
|
|
const appVersions = await entityManager.find(AppVersion);
|
|
if (!appVersions?.length) {
|
|
console.log('No app versions found, skipping migration.');
|
|
return;
|
|
}
|
|
if (appVersions?.length) {
|
|
this.nestApp = await NestFactory.createApplicationContext(await AppModule.register({ IS_GET_CONTEXT: true }));
|
|
for (const appVersion of appVersions) {
|
|
await this.associateDataQueriesAndSources(entityManager, appVersion);
|
|
}
|
|
}
|
|
await this.nestApp.close();
|
|
}
|
|
|
|
private async associateDataQueriesAndSources(entityManager: EntityManager, appVersion: AppVersion) {
|
|
const encryptionService = this.nestApp.get(EncryptionService);
|
|
|
|
for (const { name, isDefault } of defaultAppEnvironments) {
|
|
const environment = await entityManager.query(
|
|
'insert into app_environments (name, "default", app_version_id, created_at, updated_at) values ($1, $2, $3, $4, $4) returning *',
|
|
[name, isDefault, appVersion.id, new Date()]
|
|
);
|
|
|
|
// Get all data sources under app version
|
|
const dataSources = await entityManager.query('select * from data_sources where app_version_id = $1', [
|
|
appVersion.id,
|
|
]);
|
|
|
|
if (dataSources?.length) {
|
|
for (const dataSource of dataSources) {
|
|
const options = !environment[0].default
|
|
? await this.filterEncryptedFromOptions(dataSource.options, encryptionService, entityManager)
|
|
: dataSource.options;
|
|
await entityManager.save(
|
|
entityManager.create(DataSourceOptions, {
|
|
dataSourceId: dataSource.id,
|
|
environmentId: environment[0].id,
|
|
options,
|
|
})
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private convertToArrayOfKeyValuePairs(options): Array<object> {
|
|
if (!options) return;
|
|
return Object.keys(options).map((key) => {
|
|
return {
|
|
key: key,
|
|
value: options[key]['value'],
|
|
encrypted: options[key]['encrypted'],
|
|
credential_id: options[key]['credential_id'],
|
|
};
|
|
});
|
|
}
|
|
|
|
private async filterEncryptedFromOptions(
|
|
options: Array<object>,
|
|
encryptionService: EncryptionService,
|
|
entityManager: EntityManager
|
|
) {
|
|
const kvOptions = this.convertToArrayOfKeyValuePairs(options);
|
|
|
|
if (!kvOptions) return;
|
|
|
|
const parsedOptions = {};
|
|
|
|
for (const option of kvOptions) {
|
|
if (option['encrypted']) {
|
|
const credential = await this.createCredential('', encryptionService, entityManager);
|
|
|
|
parsedOptions[option['key']] = {
|
|
credential_id: credential.id,
|
|
encrypted: option['encrypted'],
|
|
};
|
|
} else {
|
|
parsedOptions[option['key']] = {
|
|
value: option['value'],
|
|
encrypted: false,
|
|
};
|
|
}
|
|
}
|
|
|
|
return parsedOptions;
|
|
}
|
|
|
|
async createCredential(
|
|
value: string,
|
|
encryptionService: EncryptionService,
|
|
entityManager: EntityManager
|
|
): Promise<Credential> {
|
|
const credentialRepository = entityManager.getRepository(Credential);
|
|
const newCredential = credentialRepository.create({
|
|
valueCiphertext: await encryptionService.encryptColumnValue('credentials', 'value', value),
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
});
|
|
const credential = await credentialRepository.save(newCredential);
|
|
return credential;
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<void> {}
|
|
}
|