diff --git a/server/data-migrations/1667076251897-BackfillDataSources.ts b/server/data-migrations/1667076251897-BackfillDataSources.ts index f6c9d0f334..31d7b29503 100644 --- a/server/data-migrations/1667076251897-BackfillDataSources.ts +++ b/server/data-migrations/1667076251897-BackfillDataSources.ts @@ -49,8 +49,8 @@ export class BackfillDataSources1667076251897 implements MigrationInterface { } async createDefaultVersionAndAttachQueries(entityManager: EntityManager, version: any) { - let runjsDS, restapiDS; - for (const kind of ['runjs', 'restapi']) { + let runjsDS, restapiDS, runpyDS; + for (const kind of ['runjs', 'restapi', 'runpy']) { const dataSourceResult = await entityManager.query( 'insert into data_sources (name, kind, app_version_id, app_id, type) values ($1, $2, $3, $4, $5) returning "id"', [`${kind}default`, kind, version.id, version.app_id, 'static'] @@ -58,6 +58,8 @@ export class BackfillDataSources1667076251897 implements MigrationInterface { if (kind === 'runjs') { runjsDS = dataSourceResult[0].id; + } else if (kind === 'runpy') { + runpyDS = dataSourceResult[0].id; } else { restapiDS = dataSourceResult[0].id; } @@ -72,7 +74,7 @@ export class BackfillDataSources1667076251897 implements MigrationInterface { await entityManager .createQueryBuilder() .update(DataQuery) - .set({ dataSourceId: dataQuery.kind === 'runjs' ? runjsDS : restapiDS }) + .set({ dataSourceId: dataQuery.kind === 'runjs' ? runjsDS : dataQuery.kind === 'runpy' ? runpyDS : restapiDS }) .where({ id: dataQuery.id }) .execute(); } diff --git a/server/data-migrations/1676545162064-BackfillRunpyDatasources.ts b/server/data-migrations/1676545162064-BackfillRunpyDatasources.ts new file mode 100644 index 0000000000..1e267b4c86 --- /dev/null +++ b/server/data-migrations/1676545162064-BackfillRunpyDatasources.ts @@ -0,0 +1,50 @@ +import { EntityManager, MigrationInterface, QueryRunner } from 'typeorm'; + +/** + * finds all the queries which are attached to restapi datasource with type static but have a non-null code option, which indicates that they are actually associated with a runpy data source. + * creates a new runpy data source and attaches all such queries to it. + */ + +export class BackfillRunpyDatasources1676545162064 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + const entityManager = queryRunner.manager; + + const allVersions = await entityManager + .createQueryBuilder() + .select() + .from('app_versions', 'app_versions') + .getRawMany(); + + for (const version of allVersions) { + await this.createDefaultVersionAndAttachQueries(entityManager, version); + } + } + + async createDefaultVersionAndAttachQueries(entityManager: EntityManager, version: any) { + const wronglyAttachedRunpyQueries = await entityManager.query( + "select data_queries.id from data_queries inner join data_sources on data_queries.data_source_id = data_sources.id where data_queries.options->> 'code' is not null and data_sources.kind = 'restapi' and data_sources.type = 'static' and data_sources.app_version_id = $1", + [version.id] + ); + + if (wronglyAttachedRunpyQueries.length > 0) { + let runpyDS = await entityManager.query( + "select data_sources.id from data_sources where data_sources.kind = 'runpy' and data_sources.type = 'static'" + ); + + if (runpyDS.length === 0) { + runpyDS = await entityManager.query( + 'insert into data_sources (name, kind, app_version_id, type) values ($1, $2, $3, $4) returning "id"', + ['runpydefault', 'runpy', version.id, 'static'] + ); + } + await entityManager.query( + `update data_queries set data_source_id = $1 where id in (${wronglyAttachedRunpyQueries + .map(({ id }) => `'${id}'`) + .join()})`, + [runpyDS[0].id] + ); + } + } + + public async down(queryRunner: QueryRunner): Promise {} +}