@drodil/backstage-plugin-catalog-backend-module-qeta 3.35.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @internal/plugin-catalog-backend-module-qeta
2
+
3
+ The qeta backend module for the catalog plugin.
4
+
5
+ ## Installation
6
+
7
+ In your `packages/backend/src/index.ts` make the following changes:
8
+
9
+ ```diff
10
+ import { createBackend } from '@backstage/backend-defaults';
11
+ const backend = createBackend();
12
+ // ... other feature additions
13
+ + backend.add(import('@drodil/backstage-plugin-catalog-backend-module-qeta'));
14
+ backend.start();
15
+ ```
16
+
17
+ ## Processors
18
+
19
+ - `CatalogEntityLinkProcessor`: Adds `qeta` links in catalog entities.
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var module$1 = require('./module.cjs.js');
6
+
7
+
8
+
9
+ exports.default = module$1.catalogModuleQeta;
10
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,5 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+
3
+ declare const catalogModuleQeta: _backstage_backend_plugin_api.BackendFeature;
4
+
5
+ export { catalogModuleQeta as default };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var alpha = require('@backstage/plugin-catalog-node/alpha');
5
+ var CatalogEntityLinkProcessor = require('./processors/CatalogEntityLinkProcessor.cjs.js');
6
+
7
+ const catalogModuleQeta = backendPluginApi.createBackendModule({
8
+ pluginId: "catalog",
9
+ moduleId: "qeta",
10
+ register(reg) {
11
+ reg.registerInit({
12
+ deps: {
13
+ builder: alpha.catalogProcessingExtensionPoint,
14
+ cache: backendPluginApi.coreServices.cache,
15
+ auth: backendPluginApi.coreServices.auth,
16
+ logger: backendPluginApi.coreServices.logger,
17
+ discovery: backendPluginApi.coreServices.discovery
18
+ },
19
+ async init({ builder, cache, auth, logger, discovery }) {
20
+ builder.addProcessor(
21
+ new CatalogEntityLinkProcessor.CatalogEntityLinkProcessor(auth, cache, logger, discovery)
22
+ );
23
+ }
24
+ });
25
+ }
26
+ });
27
+
28
+ exports.catalogModuleQeta = catalogModuleQeta;
29
+ //# sourceMappingURL=module.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\nimport { CatalogEntityLinkProcessor } from './processors/CatalogEntityLinkProcessor.ts';\n\nexport const catalogModuleQeta = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'qeta',\n register(reg) {\n reg.registerInit({\n deps: {\n builder: catalogProcessingExtensionPoint,\n cache: coreServices.cache,\n auth: coreServices.auth,\n logger: coreServices.logger,\n discovery: coreServices.discovery,\n },\n async init({ builder, cache, auth, logger, discovery }) {\n builder.addProcessor(\n new CatalogEntityLinkProcessor(auth, cache, logger, discovery),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","CatalogEntityLinkProcessor"],"mappings":";;;;;;AAOO,MAAM,oBAAoBA,oCAAoB,CAAA;AAAA,EACnD,QAAU,EAAA,SAAA;AAAA,EACV,QAAU,EAAA,MAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,OAAOC,6BAAa,CAAA,KAAA;AAAA,QACpB,MAAMA,6BAAa,CAAA,IAAA;AAAA,QACnB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA;AAAA,OAC1B;AAAA,MACA,MAAM,KAAK,EAAE,OAAA,EAAS,OAAO,IAAM,EAAA,MAAA,EAAQ,WAAa,EAAA;AACtD,QAAQ,OAAA,CAAA,YAAA;AAAA,UACN,IAAIC,qDAAA,CAA2B,IAAM,EAAA,KAAA,EAAO,QAAQ,SAAS;AAAA,SAC/D;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var catalogModel = require('@backstage/catalog-model');
4
+ var backstagePluginQetaCommon = require('@drodil/backstage-plugin-qeta-common');
5
+
6
+ class CatalogEntityLinkProcessor {
7
+ constructor(auth, cache, logger, discovery) {
8
+ this.auth = auth;
9
+ this.cache = cache;
10
+ this.logger = logger;
11
+ this.client = new backstagePluginQetaCommon.QetaClient({ discoveryApi: discovery });
12
+ }
13
+ client;
14
+ getProcessorName() {
15
+ return "CatalogEntityLinkProcessor";
16
+ }
17
+ async postProcessEntity(entity) {
18
+ const entityRef = catalogModel.stringifyEntityRef(entity);
19
+ const entityLinks = await this.getEntityLinks();
20
+ const links = entityLinks.filter((link) => link.entityRef === entityRef).map((link) => link.links).flat();
21
+ if (!links || links.length === 0) {
22
+ return entity;
23
+ }
24
+ const existingLinks = entity.metadata.links ?? [];
25
+ const uniqueLinks = [...existingLinks].filter((link) => link.type !== "qeta");
26
+ for (const link of links) {
27
+ if (!existingLinks.find((l) => l.url === link.url)) {
28
+ uniqueLinks.push(link);
29
+ }
30
+ }
31
+ this.logger.debug(
32
+ `Adding total of ${uniqueLinks.length}, new ${uniqueLinks.length - existingLinks.length} links to entity ${entityRef}`
33
+ );
34
+ return {
35
+ ...entity,
36
+ metadata: {
37
+ ...entity.metadata,
38
+ links: uniqueLinks
39
+ }
40
+ };
41
+ }
42
+ async getEntityLinks() {
43
+ const cached = await this.cache.get("qeta-entity-links");
44
+ if (cached) {
45
+ try {
46
+ return JSON.parse(cached);
47
+ } catch (e) {
48
+ this.logger.warn(`Failed to parse cached entity links: ${e}`);
49
+ }
50
+ }
51
+ this.logger.info(`Fetching entity links from Qeta`);
52
+ const credentials = await this.auth.getOwnServiceCredentials();
53
+ const { token } = await this.auth.getPluginRequestToken({
54
+ onBehalfOf: credentials,
55
+ targetPluginId: "qeta"
56
+ });
57
+ const links = await this.client.getEntityLinks({ token });
58
+ await this.cache.set("qeta-entity-links", JSON.stringify(links), {
59
+ ttl: 60 * 60
60
+ // cache for 1 hour
61
+ });
62
+ return links;
63
+ }
64
+ }
65
+
66
+ exports.CatalogEntityLinkProcessor = CatalogEntityLinkProcessor;
67
+ //# sourceMappingURL=CatalogEntityLinkProcessor.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogEntityLinkProcessor.cjs.js","sources":["../../src/processors/CatalogEntityLinkProcessor.ts"],"sourcesContent":["import { CatalogProcessor } from '@backstage/plugin-catalog-node';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n AuthService,\n CacheService,\n DiscoveryService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n EntityLinks,\n QetaApi,\n QetaClient,\n} from '@drodil/backstage-plugin-qeta-common';\n\nexport class CatalogEntityLinkProcessor implements CatalogProcessor {\n private readonly client: QetaApi;\n\n constructor(\n private readonly auth: AuthService,\n private readonly cache: CacheService,\n private readonly logger: LoggerService,\n discovery: DiscoveryService,\n ) {\n this.client = new QetaClient({ discoveryApi: discovery });\n }\n\n getProcessorName(): string {\n return 'CatalogEntityLinkProcessor';\n }\n\n async postProcessEntity(entity: Entity): Promise<Entity> {\n const entityRef = stringifyEntityRef(entity);\n const entityLinks = await this.getEntityLinks();\n const links = entityLinks\n .filter(link => link.entityRef === entityRef)\n .map(link => link.links)\n .flat();\n if (!links || links.length === 0) {\n return entity;\n }\n\n const existingLinks = entity.metadata.links ?? [];\n const uniqueLinks = [...existingLinks].filter(link => link.type !== 'qeta');\n for (const link of links) {\n if (!existingLinks.find(l => l.url === link.url)) {\n uniqueLinks.push(link);\n }\n }\n\n this.logger.debug(\n `Adding total of ${uniqueLinks.length}, new ${\n uniqueLinks.length - existingLinks.length\n } links to entity ${entityRef}`,\n );\n\n return {\n ...entity,\n metadata: {\n ...entity.metadata,\n links: uniqueLinks,\n },\n };\n }\n\n private async getEntityLinks(): Promise<EntityLinks[]> {\n const cached = await this.cache.get<string>('qeta-entity-links');\n if (cached) {\n try {\n return JSON.parse(cached);\n } catch (e) {\n this.logger.warn(`Failed to parse cached entity links: ${e}`);\n }\n }\n\n this.logger.info(`Fetching entity links from Qeta`);\n const credentials = await this.auth.getOwnServiceCredentials();\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: credentials,\n targetPluginId: 'qeta',\n });\n const links = await this.client.getEntityLinks({ token });\n await this.cache.set('qeta-entity-links', JSON.stringify(links), {\n ttl: 60 * 60, // cache for 1 hour\n });\n return links;\n }\n}\n"],"names":["QetaClient","stringifyEntityRef"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@drodil/backstage-plugin-catalog-backend-module-qeta",
3
+ "version": "3.35.2",
4
+ "license": "MIT",
5
+ "description": "The qeta backend module for the catalog plugin.",
6
+ "keywords": [
7
+ "backstage",
8
+ "plugin",
9
+ "backend",
10
+ "backstage.io"
11
+ ],
12
+ "homepage": "https://github.com/drodil/backstage-plugin-qeta",
13
+ "prepublishOnly": "yarn tsc && yarn build",
14
+ "main": "dist/index.cjs.js",
15
+ "types": "dist/index.d.ts",
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "main": "dist/index.cjs.js",
19
+ "types": "dist/index.d.ts"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/drodil/backstage-plugin-qeta/issues"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/drodil/backstage-plugin-qeta.git"
27
+ },
28
+ "backstage": {
29
+ "role": "backend-plugin-module",
30
+ "pluginId": "catalog",
31
+ "pluginPackage": "@backstage/plugin-catalog-backend",
32
+ "features": {
33
+ ".": "@backstage/BackendFeature"
34
+ }
35
+ },
36
+ "scripts": {
37
+ "start": "backstage-cli package start",
38
+ "build": "backstage-cli package build",
39
+ "lint": "backstage-cli package lint",
40
+ "test": "backstage-cli package test",
41
+ "clean": "backstage-cli package clean",
42
+ "prepack": "backstage-cli package prepack",
43
+ "postpack": "backstage-cli package postpack",
44
+ "tsc": "tsc"
45
+ },
46
+ "dependencies": {
47
+ "@backstage/backend-plugin-api": "^1.4.3",
48
+ "@backstage/catalog-model": "^1.7.5",
49
+ "@backstage/plugin-catalog-node": "^1.19.0",
50
+ "@drodil/backstage-plugin-qeta-common": "^3.36.1"
51
+ },
52
+ "devDependencies": {
53
+ "@backstage/backend-test-utils": "^1.9.0",
54
+ "@backstage/cli": "^0.34.3"
55
+ },
56
+ "files": [
57
+ "dist"
58
+ ],
59
+ "typesVersions": {
60
+ "*": {
61
+ "package.json": [
62
+ "package.json"
63
+ ]
64
+ }
65
+ }
66
+ }