Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app-config.template-local.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ backend:
# replace these to match your environment
host: ${POSTGRES_HOST}
port: ${POSTGRES_PORT}
user: {POSTGRES_USER}
user: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}

## Uncomment the below github integrations config to add a PAT to try out
Expand Down Expand Up @@ -82,4 +82,4 @@ essentialLocations:
frequencyInMinutes: 120
locations:
- type: url
target: https://github.com/TIBCOSoftware/tibco-developer-hub/blob/main/tibco-examples/tibco-essentials.yaml
target: https://github.com/TIBCOSoftware/tibco-developer-hub/blob/main/tibco-examples/tibco-essentials.yaml
4 changes: 3 additions & 1 deletion packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
"global-agent": "^3.0.0",
"jwt-decode": "^3.1.2",
"keyv": "^5.5.0",
"knex": "^3.1.0",
"node-gyp": "^10.0.0",
"openid-client": "^5.5.0",
"pg": "^8.11.3",
Expand All @@ -75,7 +76,8 @@
"winston-daily-rotate-file": "^5.0.0"
},
"devDependencies": {
"@backstage/cli": "^0.33.1"
"@backstage/cli": "^0.33.1",
"@types/pg": "^8.11.3"
},
"files": [
"dist"
Expand Down
23 changes: 18 additions & 5 deletions packages/backend/src/cachePlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,29 @@
* Copyright (c) 2023-2025. Cloud Software Group, Inc. All Rights Reserved. Confidential & Proprietary
*/

import { createBackendPlugin } from '@backstage/backend-plugin-api';
import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';
import { KeyvStore } from './cacheService.ts';
import { Knex } from 'knex';

const PLUGIN_ID: string = 'tibco_hub_cache';

export default createBackendPlugin({
pluginId: 'tibco_hub_cache',
pluginId: PLUGIN_ID,
register(env) {
env.registerInit({
deps: {},
async init() {
KeyvStore.initialize();
deps: {
database: coreServices.database,
config: coreServices.rootConfig,
},
async init({ database, config }) {
const knex: Knex = await database.getClient();
const pluginDivisionMode: string =
config.getOptionalString('backend.database.pluginDivisionMode') ||
'database';
KeyvStore.initialize(knex, pluginDivisionMode, PLUGIN_ID);
await KeyvStore.keyv.clear();
},
});
Expand Down
52 changes: 29 additions & 23 deletions packages/backend/src/cacheService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,44 @@

import Keyv from 'keyv';
import KeyvPostgres from '@keyv/postgres';

const POSTGRES_HOST = process.env.POSTGRES_HOST;
const POSTGRES_PORT = process.env.POSTGRES_PORT;
const POSTGRES_USER = process.env.POSTGRES_USER;
const POSTGRES_PASSWORD = process.env.POSTGRES_PASSWORD;
const POSTGRES_DB =
process.env.POSTGRES_DB || 'backstage_plugin_tibco_hub_cache';
import { Knex } from 'knex';

export class KeyvStore {
public static keyv: Keyv;
public static keyvMemory: Keyv;
public static initialize() {
if (
!(
POSTGRES_HOST &&
POSTGRES_PORT &&
POSTGRES_USER &&
POSTGRES_PASSWORD &&
POSTGRES_DB
)
) {
throw new Error('Missing POSTGRES configurations required for Keyv');
public static initialize(
knex: Knex,
pluginDivisionMode: string,
PLUGIN_ID: string,
) {
if (knex.client.driverName === 'pg') {
const cfg = knex.client.config.connection;
const connectionString =
typeof cfg === 'string'
? cfg
: `postgres://${cfg.user}:${cfg.password}@${cfg.host}:${
cfg.port ?? 5432
}${cfg.database ? `/${cfg.database}` : ''}`;
let schema = 'public';
if (typeof cfg !== 'string' && pluginDivisionMode !== 'database') {
schema = PLUGIN_ID;
}
KeyvStore.keyv = new Keyv(
new KeyvPostgres({
uri: connectionString,
schema,
}),
);
} else {
KeyvStore.keyv = new Keyv();
}
KeyvStore.keyv = new Keyv(
new KeyvPostgres(
`postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}`,
),
);
KeyvStore.keyvMemory = new Keyv();
KeyvStore.keyv.on('error', err => {
throw new Error(`Error while initializing KeyvStore ${err as Error}`);
});
KeyvStore.keyv.on('error', err => {
throw new Error(`Error while initializing KeyvStore ${err as Error}`);
});
KeyvStore.keyvMemory.on('error', err => {
throw new Error(
`Error while initializing in memory KeyvStore ${err as Error}`,
Expand Down
17 changes: 15 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -15659,6 +15659,17 @@ __metadata:
languageName: node
linkType: hard

"@types/pg@npm:^8.11.3":
version: 8.15.6
resolution: "@types/pg@npm:8.15.6"
dependencies:
"@types/node": "npm:*"
pg-protocol: "npm:*"
pg-types: "npm:^2.2.0"
checksum: 10c0/7f93f83a4da0dc6133918f824d826fa34e78fb8cf86392d28a0e095c836c6910c014ced5d4b364d83e8485a65ce369adeb9663b14ba301241d4c0f80073007f3
languageName: node
linkType: hard

"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.3":
version: 15.7.15
resolution: "@types/prop-types@npm:15.7.15"
Expand Down Expand Up @@ -17671,6 +17682,7 @@ __metadata:
"@internal/plugin-scaffolder-backend-module-metrics-api": "workspace:^"
"@internal/plugin-scaffolder-backend-module-tibco-git-repositories": "workspace:^"
"@keyv/postgres": "npm:^2.1.7"
"@types/pg": "npm:^8.11.3"
app: "link:../app"
better-sqlite3: "npm:^9.0.0"
cookie-parser: "npm:^1.4.7"
Expand All @@ -17680,6 +17692,7 @@ __metadata:
global-agent: "npm:^3.0.0"
jwt-decode: "npm:^3.1.2"
keyv: "npm:^5.5.0"
knex: "npm:^3.1.0"
node-gyp: "npm:^10.0.0"
openid-client: "npm:^5.5.0"
pg: "npm:^8.11.3"
Expand Down Expand Up @@ -29803,14 +29816,14 @@ __metadata:
languageName: node
linkType: hard

"pg-protocol@npm:^1.10.3":
"pg-protocol@npm:*, pg-protocol@npm:^1.10.3":
version: 1.10.3
resolution: "pg-protocol@npm:1.10.3"
checksum: 10c0/f7ef54708c93ee6d271e37678296fc5097e4337fca91a88a3d99359b78633dbdbf6e983f0adb34b7cdd261b7ec7266deb20c3233bf3dfdb498b3e1098e8750b9
languageName: node
linkType: hard

"pg-types@npm:2.2.0":
"pg-types@npm:2.2.0, pg-types@npm:^2.2.0":
version: 2.2.0
resolution: "pg-types@npm:2.2.0"
dependencies:
Expand Down