@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 +19 -0
- package/dist/index.cjs.js +10 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/module.cjs.js +29 -0
- package/dist/module.cjs.js.map +1 -0
- package/dist/processors/CatalogEntityLinkProcessor.cjs.js +67 -0
- package/dist/processors/CatalogEntityLinkProcessor.cjs.js.map +1 -0
- package/package.json +66 -0
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|