{"version":3,"file":"migrationHandler.mjs","sources":["../../../src/utils/migrationHandler.ts"],"sourcesContent":["import { type DataQueryRequest } from '@grafana/data';\nimport { type DataQuery } from '@grafana/schema';\n\nimport { config } from '../config';\nimport { getBackendSrv } from '../services';\n\nimport { DataSourceWithBackend } from './DataSourceWithBackend';\n\n/**\n * @alpha Experimental: Plugins implementing MigrationHandler interface will automatically have their queries migrated.\n */\nexport interface MigrationHandler {\n  hasBackendMigration: boolean;\n  shouldMigrate(query: DataQuery): boolean;\n}\n\nexport function isMigrationHandler(object: unknown): object is MigrationHandler {\n  return object instanceof DataSourceWithBackend && 'hasBackendMigration' in object && 'shouldMigrate' in object;\n}\n\nasync function postMigrateRequest<TQuery extends DataQuery>(queries: TQuery[]): Promise<TQuery[]> {\n  if (!(config.featureToggles.grafanaAPIServerWithExperimentalAPIs || config.featureToggles.datasourceAPIServers)) {\n    console.warn('migrateQuery is only available with the experimental API server');\n    return queries;\n  }\n\n  // Obtaining the GroupName from the plugin ID as done in the backend, this is temporary until we have a better way to obtain it\n  // https://github.com/grafana/grafana/blob/e013cd427cb0457177e11f19ebd30bc523b36c76/pkg/plugins/apiserver.go#L10\n  const dsnameURL = queries[0].datasource?.type?.replace(/^(grafana-)?(.*?)(-datasource)?$/, '$2');\n  const groupName = `${dsnameURL}.datasource.grafana.app`;\n  // Asuming apiVersion is v0alpha1, we'll need to obtain it from a trusted source\n  const apiVersion = 'v0alpha1';\n  const url = `/apis/${groupName}/${apiVersion}/namespaces/${config.namespace}/queryconvert`;\n  const request = {\n    queries: queries.map((query) => {\n      return {\n        ...query,\n        JSON: query, // JSON is not part of the type but it should be what holds the query\n      };\n    }),\n  };\n  const res = await getBackendSrv().post(url, request);\n  return res.queries.map((query: { JSON: TQuery }) => query.JSON);\n}\n\n/**\n * @alpha Experimental: Calls migration endpoint with one query. Requires grafanaAPIServerWithExperimentalAPIs or datasourceAPIServers feature toggle.\n */\nexport async function migrateQuery<TQuery extends DataQuery>(\n  datasource: MigrationHandler,\n  query: TQuery\n): Promise<TQuery> {\n  if (!datasource.hasBackendMigration || !datasource.shouldMigrate(query)) {\n    return query;\n  }\n  const res = await postMigrateRequest([query]);\n  return res[0];\n}\n\n/**\n * @alpha Experimental: Calls migration endpoint with multiple queries. Requires grafanaAPIServerWithExperimentalAPIs or datasourceAPIServers feature toggle.\n */\nexport async function migrateRequest<TQuery extends DataQuery>(\n  datasource: MigrationHandler,\n  request: DataQueryRequest<TQuery>\n): Promise<DataQueryRequest<TQuery>> {\n  if (!datasource.hasBackendMigration || !request.targets.some((query) => datasource.shouldMigrate(query))) {\n    return request;\n  }\n  const res = await postMigrateRequest(request.targets);\n  return { ...request, targets: res };\n}\n"],"names":[],"mappings":";;;;;;AAgBO,SAAS,mBAAmB,MAAA,EAA6C;AAC9E,EAAA,OAAO,MAAA,YAAkB,qBAAA,IAAyB,qBAAA,IAAyB,MAAA,IAAU,eAAA,IAAmB,MAAA;AAC1G;AAEA,eAAe,mBAA6C,OAAA,EAAsC;AApBlG,EAAA,IAAA,EAAA,EAAA,EAAA;AAqBE,EAAA,IAAI,EAAE,MAAA,CAAO,cAAA,CAAe,oCAAA,IAAwC,MAAA,CAAO,eAAe,oBAAA,CAAA,EAAuB;AAC/G,IAAA,OAAA,CAAQ,KAAK,iEAAiE,CAAA;AAC9E,IAAA,OAAO,OAAA;AAAA,EACT;AAIA,EAAA,MAAM,SAAA,GAAA,CAAY,mBAAQ,CAAC,CAAA,CAAE,eAAX,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,IAAA,KAAvB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA6B,OAAA,CAAQ,kCAAA,EAAoC,IAAA,CAAA;AAC3F,EAAA,MAAM,SAAA,GAAY,GAAG,SAAS,CAAA,uBAAA,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAa,UAAA;AACnB,EAAA,MAAM,MAAM,CAAA,MAAA,EAAS,SAAS,IAAI,UAAU,CAAA,YAAA,EAAe,OAAO,SAAS,CAAA,aAAA,CAAA;AAC3E,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAC9B,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,IACF,CAAC;AAAA,GACH;AACA,EAAA,MAAM,MAAM,MAAM,aAAA,EAAc,CAAE,IAAA,CAAK,KAAK,OAAO,CAAA;AACnD,EAAA,OAAO,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAA4B,MAAM,IAAI,CAAA;AAChE;AAKA,eAAsB,YAAA,CACpB,YACA,KAAA,EACiB;AACjB,EAAA,IAAI,CAAC,UAAA,CAAW,mBAAA,IAAuB,CAAC,UAAA,CAAW,aAAA,CAAc,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,CAAC,KAAK,CAAC,CAAA;AAC5C,EAAA,OAAO,IAAI,CAAC,CAAA;AACd;AAKA,eAAsB,cAAA,CACpB,YACA,OAAA,EACmC;AACnC,EAAA,IAAI,CAAC,UAAA,CAAW,mBAAA,IAAuB,CAAC,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,UAAA,CAAW,aAAA,CAAc,KAAK,CAAC,CAAA,EAAG;AACxG,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA;AACpD,EAAA,OAAO,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI;AACpC;;;;"}