@backstage/plugin-notifications-backend 0.1.0-next.0 → 0.1.0-next.1
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/CHANGELOG.md +23 -0
- package/dist/index.cjs.js +32 -20
- package/dist/index.cjs.js.map +1 -1
- package/package.json +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @backstage/plugin-notifications-backend
|
|
2
2
|
|
|
3
|
+
## 0.1.0-next.1
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 07abfe1: The NotificationsPage newly uses pagination implemented on the backend layer to avoid large dataset transfers
|
|
8
|
+
- daf85dc: BREAKING CHANGE: Migrates signals to use the `EventsService` and makes it mandatory
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- a790a3d: Move notification origin resolving to backend with new auth
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
- @backstage/config@1.2.0-next.1
|
|
15
|
+
- @backstage/plugin-notifications-common@0.0.2-next.1
|
|
16
|
+
- @backstage/plugin-notifications-node@0.1.0-next.1
|
|
17
|
+
- @backstage/plugin-signals-node@0.1.0-next.1
|
|
18
|
+
- @backstage/backend-common@0.21.4-next.1
|
|
19
|
+
- @backstage/backend-plugin-api@0.6.14-next.1
|
|
20
|
+
- @backstage/plugin-auth-node@0.4.9-next.1
|
|
21
|
+
- @backstage/catalog-client@1.6.1-next.0
|
|
22
|
+
- @backstage/catalog-model@1.4.5-next.0
|
|
23
|
+
- @backstage/errors@1.2.4-next.0
|
|
24
|
+
- @backstage/plugin-events-node@0.3.0-next.1
|
|
25
|
+
|
|
3
26
|
## 0.1.0-next.0
|
|
4
27
|
|
|
5
28
|
### Minor Changes
|
package/dist/index.cjs.js
CHANGED
|
@@ -142,6 +142,15 @@ class DatabaseNotificationsStore {
|
|
|
142
142
|
const notifications = await notificationQuery.select();
|
|
143
143
|
return this.mapToNotifications(notifications);
|
|
144
144
|
}
|
|
145
|
+
async getNotificationsCount(options) {
|
|
146
|
+
const countOptions = { ...options };
|
|
147
|
+
countOptions.limit = void 0;
|
|
148
|
+
countOptions.offset = void 0;
|
|
149
|
+
countOptions.sort = null;
|
|
150
|
+
const notificationQuery = this.getNotificationsBaseQuery(countOptions);
|
|
151
|
+
const response = await notificationQuery.count("* as CNT");
|
|
152
|
+
return Number(response[0].CNT);
|
|
153
|
+
}
|
|
145
154
|
async saveNotification(notification) {
|
|
146
155
|
await this.db.insert(this.mapNotificationToDbRow(notification)).into("notification");
|
|
147
156
|
}
|
|
@@ -208,7 +217,9 @@ async function createRouter(options) {
|
|
|
208
217
|
const {
|
|
209
218
|
logger,
|
|
210
219
|
database,
|
|
211
|
-
|
|
220
|
+
auth,
|
|
221
|
+
httpAuth,
|
|
222
|
+
userInfo,
|
|
212
223
|
discovery,
|
|
213
224
|
catalog,
|
|
214
225
|
processors,
|
|
@@ -216,13 +227,10 @@ async function createRouter(options) {
|
|
|
216
227
|
} = options;
|
|
217
228
|
const catalogClient$1 = catalog != null ? catalog : new catalogClient.CatalogClient({ discoveryApi: discovery });
|
|
218
229
|
const store = await DatabaseNotificationsStore.create({ database });
|
|
219
|
-
const { auth, httpAuth } = backendCommon.createLegacyAuthAdapters(options);
|
|
220
230
|
const getUser = async (req) => {
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
return user.identity.userEntityRef;
|
|
231
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
232
|
+
const info = await userInfo.getUserInfo(credentials);
|
|
233
|
+
return info.userEntityRef;
|
|
226
234
|
};
|
|
227
235
|
const getUsersForEntityRef = async (entityRef) => {
|
|
228
236
|
const { token } = await auth.getPluginRequestToken({
|
|
@@ -320,14 +328,20 @@ async function createRouter(options) {
|
|
|
320
328
|
opts.read = false;
|
|
321
329
|
}
|
|
322
330
|
if (req.query.created_after) {
|
|
323
|
-
const sinceEpoch = Date.parse(req.query.created_after
|
|
331
|
+
const sinceEpoch = Date.parse(String(req.query.created_after));
|
|
324
332
|
if (isNaN(sinceEpoch)) {
|
|
325
333
|
throw new errors.InputError("Unexpected date format");
|
|
326
334
|
}
|
|
327
335
|
opts.createdAfter = new Date(sinceEpoch);
|
|
328
336
|
}
|
|
329
|
-
const notifications = await
|
|
330
|
-
|
|
337
|
+
const [notifications, totalCount] = await Promise.all([
|
|
338
|
+
store.getNotifications(opts),
|
|
339
|
+
store.getNotificationsCount(opts)
|
|
340
|
+
]);
|
|
341
|
+
res.send({
|
|
342
|
+
totalCount,
|
|
343
|
+
notifications
|
|
344
|
+
});
|
|
331
345
|
});
|
|
332
346
|
router.get("/:id", async (req, res) => {
|
|
333
347
|
const user = await getUser(req);
|
|
@@ -383,12 +397,12 @@ async function createRouter(options) {
|
|
|
383
397
|
});
|
|
384
398
|
router.post("/", async (req, res) => {
|
|
385
399
|
var _a;
|
|
386
|
-
const { recipients,
|
|
400
|
+
const { recipients, payload } = req.body;
|
|
387
401
|
const notifications = [];
|
|
388
402
|
let users = [];
|
|
389
|
-
await httpAuth.credentials(req, { allow: ["service"] });
|
|
390
|
-
const { title,
|
|
391
|
-
if (!recipients || !title
|
|
403
|
+
const credentials = await httpAuth.credentials(req, { allow: ["service"] });
|
|
404
|
+
const { title, scope } = payload;
|
|
405
|
+
if (!recipients || !title) {
|
|
392
406
|
logger.error(`Invalid notification request received`);
|
|
393
407
|
throw new errors.InputError();
|
|
394
408
|
}
|
|
@@ -401,6 +415,7 @@ async function createRouter(options) {
|
|
|
401
415
|
} catch (e) {
|
|
402
416
|
throw new errors.InputError();
|
|
403
417
|
}
|
|
418
|
+
const origin = credentials.principal.subject;
|
|
404
419
|
const baseNotification = {
|
|
405
420
|
payload: {
|
|
406
421
|
...payload,
|
|
@@ -492,22 +507,20 @@ const notificationsPlugin = backendPluginApi.createBackendPlugin({
|
|
|
492
507
|
deps: {
|
|
493
508
|
auth: backendPluginApi.coreServices.auth,
|
|
494
509
|
httpAuth: backendPluginApi.coreServices.httpAuth,
|
|
510
|
+
userInfo: backendPluginApi.coreServices.userInfo,
|
|
495
511
|
httpRouter: backendPluginApi.coreServices.httpRouter,
|
|
496
512
|
logger: backendPluginApi.coreServices.logger,
|
|
497
|
-
identity: backendPluginApi.coreServices.identity,
|
|
498
513
|
database: backendPluginApi.coreServices.database,
|
|
499
|
-
tokenManager: backendPluginApi.coreServices.tokenManager,
|
|
500
514
|
discovery: backendPluginApi.coreServices.discovery,
|
|
501
515
|
signals: pluginSignalsNode.signalService
|
|
502
516
|
},
|
|
503
517
|
async init({
|
|
504
518
|
auth,
|
|
505
519
|
httpAuth,
|
|
520
|
+
userInfo,
|
|
506
521
|
httpRouter,
|
|
507
522
|
logger,
|
|
508
|
-
identity,
|
|
509
523
|
database,
|
|
510
|
-
tokenManager,
|
|
511
524
|
discovery,
|
|
512
525
|
signals
|
|
513
526
|
}) {
|
|
@@ -515,10 +528,9 @@ const notificationsPlugin = backendPluginApi.createBackendPlugin({
|
|
|
515
528
|
await createRouter({
|
|
516
529
|
auth,
|
|
517
530
|
httpAuth,
|
|
531
|
+
userInfo,
|
|
518
532
|
logger,
|
|
519
|
-
identity,
|
|
520
533
|
database,
|
|
521
|
-
tokenManager,
|
|
522
534
|
discovery,
|
|
523
535
|
signalService: signals,
|
|
524
536
|
processors: processingExtensions.processors
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/database/DatabaseNotificationsStore.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n PluginDatabaseManager,\n resolvePackagePath,\n} from '@backstage/backend-common';\nimport {\n NotificationGetOptions,\n NotificationModifyOptions,\n NotificationsStore,\n} from './NotificationsStore';\nimport { Notification } from '@backstage/plugin-notifications-common';\nimport { Knex } from 'knex';\n\nconst migrationsDir = resolvePackagePath(\n '@backstage/plugin-notifications-backend',\n 'migrations',\n);\n\n/** @internal */\nexport class DatabaseNotificationsStore implements NotificationsStore {\n private constructor(private readonly db: Knex) {}\n\n static async create({\n database,\n skipMigrations,\n }: {\n database: PluginDatabaseManager;\n skipMigrations?: boolean;\n }): Promise<DatabaseNotificationsStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseNotificationsStore(client);\n }\n\n private mapToInteger = (val: string | number | undefined): number => {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n };\n\n private mapToNotifications = (rows: any[]): Notification[] => {\n return rows.map(row => ({\n id: row.id,\n user: row.user,\n created: row.created,\n saved: row.saved,\n read: row.read,\n updated: row.updated,\n origin: row.origin,\n payload: {\n title: row.title,\n description: row.description,\n link: row.link,\n topic: row.topic,\n severity: row.severity,\n scope: row.scope,\n icon: row.icon,\n },\n }));\n };\n\n private mapNotificationToDbRow = (notification: Notification) => {\n return {\n id: notification.id,\n user: notification.user,\n origin: notification.origin,\n created: notification.created,\n topic: notification.payload?.topic,\n link: notification.payload?.link,\n title: notification.payload?.title,\n description: notification.payload?.description,\n severity: notification.payload?.severity,\n scope: notification.payload?.scope,\n saved: notification.saved,\n read: notification.read,\n };\n };\n\n private getNotificationsBaseQuery = (\n options: NotificationGetOptions | NotificationModifyOptions,\n ) => {\n const { user } = options;\n const isSQLite = this.db.client.config.client.includes('sqlite3');\n // const isPsql = this.db.client.config.client.includes('pg');\n\n const query = this.db('notification').where('user', user);\n\n if (options.sort !== undefined && options.sort !== null) {\n query.orderBy(options.sort, options.sortOrder ?? 'desc');\n } else if (options.sort !== null) {\n query.orderBy('created', options.sortOrder ?? 'desc');\n }\n\n if (options.createdAfter) {\n if (isSQLite) {\n query.where(\n 'notification.created',\n '>=',\n options.createdAfter.valueOf(),\n );\n } else {\n query.where(\n 'notification.created',\n '>=',\n options.createdAfter.toISOString(),\n );\n }\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n\n if (options.offset) {\n query.offset(options.offset);\n }\n\n if (options.search) {\n query.whereRaw(\n `(LOWER(notification.title) LIKE LOWER(?) OR LOWER(notification.description) LIKE LOWER(?))`,\n [`%${options.search}%`, `%${options.search}%`],\n );\n }\n\n if (options.ids) {\n query.whereIn('notification.id', options.ids);\n }\n\n if (options.read) {\n query.whereNotNull('notification.read');\n } else if (options.read === false) {\n query.whereNull('notification.read');\n } // or match both if undefined\n\n if (options.saved) {\n query.whereNotNull('notification.saved');\n } else if (options.saved === false) {\n query.whereNull('notification.saved');\n } // or match both if undefined\n\n return query;\n };\n\n async getNotifications(options: NotificationGetOptions) {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n const notifications = await notificationQuery.select();\n return this.mapToNotifications(notifications);\n }\n\n async saveNotification(notification: Notification) {\n await this.db\n .insert(this.mapNotificationToDbRow(notification))\n .into('notification');\n }\n\n async getStatus(options: NotificationGetOptions) {\n const notificationQuery = this.getNotificationsBaseQuery({\n ...options,\n sort: null,\n });\n const readSubQuery = notificationQuery\n .clone()\n .count('id')\n .whereNotNull('read')\n .as('READ');\n const unreadSubQuery = notificationQuery\n .clone()\n .count('id')\n .whereNull('read')\n .as('UNREAD');\n\n const query = await notificationQuery\n .select(readSubQuery, unreadSubQuery)\n .first();\n\n return {\n unread: this.mapToInteger((query as any)?.UNREAD),\n read: this.mapToInteger((query as any)?.READ),\n };\n }\n\n async getExistingScopeNotification(options: {\n user: string;\n scope: string;\n origin: string;\n }) {\n const query = this.db('notification')\n .where('user', options.user)\n .where('scope', options.scope)\n .where('origin', options.origin)\n .select()\n .limit(1);\n\n const rows = await query;\n if (!rows || rows.length === 0) {\n return null;\n }\n return rows[0] as Notification;\n }\n\n async restoreExistingNotification(options: {\n id: string;\n notification: Notification;\n }) {\n const query = this.db('notification')\n .where('id', options.id)\n .where('user', options.notification.user);\n\n await query.update({\n title: options.notification.payload.title,\n description: options.notification.payload.description,\n link: options.notification.payload.link,\n topic: options.notification.payload.topic,\n updated: new Date(),\n severity: options.notification.payload.severity,\n read: null,\n });\n\n return await this.getNotification(options);\n }\n\n async getNotification(options: { id: string }): Promise<Notification | null> {\n const rows = await this.db('notification')\n .where('id', options.id)\n .select()\n .limit(1);\n if (!rows || rows.length === 0) {\n return null;\n }\n return this.mapToNotifications(rows)[0];\n }\n\n async markRead(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ read: new Date() });\n }\n\n async markUnread(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ read: null });\n }\n\n async markSaved(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ saved: new Date() });\n }\n\n async markUnsaved(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ saved: null });\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createLegacyAuthAdapters,\n errorHandler,\n PluginDatabaseManager,\n TokenManager,\n} from '@backstage/backend-common';\nimport express, { Request } from 'express';\nimport Router from 'express-promise-router';\nimport { IdentityApi } from '@backstage/plugin-auth-node';\nimport {\n DatabaseNotificationsStore,\n NotificationGetOptions,\n} from '../database';\nimport { v4 as uuid } from 'uuid';\nimport { CatalogApi, CatalogClient } from '@backstage/catalog-client';\nimport {\n Entity,\n isGroupEntity,\n isUserEntity,\n RELATION_HAS_MEMBER,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { NotificationProcessor } from '@backstage/plugin-notifications-node';\nimport { AuthenticationError, InputError } from '@backstage/errors';\nimport {\n AuthService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport { SignalService } from '@backstage/plugin-signals-node';\nimport {\n NewNotificationSignal,\n Notification,\n NotificationReadSignal,\n} from '@backstage/plugin-notifications-common';\n\n/** @internal */\nexport interface RouterOptions {\n logger: LoggerService;\n identity: IdentityApi;\n database: PluginDatabaseManager;\n tokenManager: TokenManager;\n discovery: DiscoveryService;\n signalService?: SignalService;\n catalog?: CatalogApi;\n processors?: NotificationProcessor[];\n auth?: AuthService;\n httpAuth?: HttpAuthService;\n}\n\n/** @internal */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n database,\n identity,\n discovery,\n catalog,\n processors,\n signalService,\n } = options;\n\n const catalogClient =\n catalog ?? new CatalogClient({ discoveryApi: discovery });\n const store = await DatabaseNotificationsStore.create({ database });\n\n const { auth, httpAuth } = createLegacyAuthAdapters(options);\n\n const getUser = async (req: Request<unknown>) => {\n const user = await identity.getIdentity({ request: req });\n if (!user) {\n throw new AuthenticationError();\n }\n return user.identity.userEntityRef;\n };\n\n const getUsersForEntityRef = async (\n entityRef: string | string[] | null,\n ): Promise<string[]> => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n // TODO: Support for broadcast\n if (entityRef === null) {\n return [];\n }\n\n const refs = Array.isArray(entityRef) ? entityRef : [entityRef];\n const entities = await catalogClient.getEntitiesByRefs(\n {\n entityRefs: refs,\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n },\n { token },\n );\n const mapEntity = async (entity: Entity | undefined): Promise<string[]> => {\n if (!entity) {\n return [];\n }\n\n if (isUserEntity(entity)) {\n return [stringifyEntityRef(entity)];\n } else if (isGroupEntity(entity) && entity.relations) {\n const users = entity.relations\n .filter(\n relation =>\n relation.type === RELATION_HAS_MEMBER && relation.targetRef,\n )\n .map(r => r.targetRef);\n const childGroups = await catalogClient.getEntitiesByRefs(\n {\n entityRefs: entity.spec.children,\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n },\n { token },\n );\n const childGroupUsers = await Promise.all(\n childGroups.items.map(mapEntity),\n );\n return [...users, ...childGroupUsers.flat(2)];\n } else if (!isGroupEntity(entity) && entity.spec?.owner) {\n const owner = await catalogClient.getEntityByRef(\n entity.spec.owner as string,\n { token },\n );\n if (owner) {\n return mapEntity(owner);\n }\n }\n\n return [];\n };\n\n const users: string[] = [];\n for (const entity of entities.items) {\n const u = await mapEntity(entity);\n users.push(...u);\n }\n return users;\n };\n\n const decorateNotification = async (notification: Notification) => {\n let ret: Notification = notification;\n for (const processor of processors ?? []) {\n ret = processor.decorate ? await processor.decorate(ret) : ret;\n }\n return ret;\n };\n\n const processorSendNotification = async (notification: Notification) => {\n for (const processor of processors ?? []) {\n if (processor.send) {\n processor.send(notification);\n }\n }\n };\n\n // TODO: Move to use OpenAPI router instead\n const router = Router();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n router.get('/', async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = {\n user: user,\n };\n if (req.query.offset) {\n opts.offset = Number.parseInt(req.query.offset.toString(), 10);\n }\n if (req.query.limit) {\n opts.limit = Number.parseInt(req.query.limit.toString(), 10);\n }\n if (req.query.search) {\n opts.search = req.query.search.toString();\n }\n if (req.query.read === 'true') {\n opts.read = true;\n } else if (req.query.read === 'false') {\n opts.read = false;\n // or keep undefined\n }\n if (req.query.created_after) {\n const sinceEpoch = Date.parse(req.query.created_after.toString());\n if (isNaN(sinceEpoch)) {\n throw new InputError('Unexpected date format');\n }\n opts.createdAfter = new Date(sinceEpoch);\n }\n\n const notifications = await store.getNotifications(opts);\n res.send(notifications);\n });\n\n router.get('/:id', async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = {\n user: user,\n limit: 1,\n ids: [req.params.id],\n };\n const notifications = await store.getNotifications(opts);\n if (notifications.length !== 1) {\n res.status(404).send({ error: 'Not found' });\n return;\n }\n res.send(notifications[0]);\n });\n\n router.get('/status', async (req, res) => {\n const user = await getUser(req);\n const status = await store.getStatus({ user });\n res.send(status);\n });\n\n router.post('/update', async (req, res) => {\n const user = await getUser(req);\n const { ids, read, saved } = req.body;\n if (!ids || !Array.isArray(ids)) {\n throw new InputError();\n }\n\n if (read === true) {\n await store.markRead({ user, ids });\n\n if (signalService) {\n await signalService.publish<NotificationReadSignal>({\n recipients: [user],\n message: { action: 'notification_read', notification_ids: ids },\n channel: 'notifications',\n });\n }\n } else if (read === false) {\n await store.markUnread({ user: user, ids });\n\n if (signalService) {\n await signalService.publish<NotificationReadSignal>({\n recipients: [user],\n message: { action: 'notification_unread', notification_ids: ids },\n channel: 'notifications',\n });\n }\n }\n\n if (saved === true) {\n await store.markSaved({ user: user, ids });\n } else if (saved === false) {\n await store.markUnsaved({ user: user, ids });\n }\n\n const notifications = await store.getNotifications({ ids, user: user });\n res.status(200).send(notifications);\n });\n\n // Add new notification\n // Allowed only for service-to-service authentication, uses `getUsersForEntityRef` to retrieve recipients for\n // specific entity reference\n router.post('/', async (req, res) => {\n const { recipients, origin, payload } = req.body;\n const notifications = [];\n let users = [];\n\n await httpAuth.credentials(req, { allow: ['service'] });\n\n const { title, link, scope } = payload;\n\n if (!recipients || !title || !origin || !link) {\n logger.error(`Invalid notification request received`);\n throw new InputError();\n }\n\n let entityRef = null;\n // TODO: Support for broadcast notifications\n if (recipients.entityRef && recipients.type === 'entity') {\n entityRef = recipients.entityRef;\n }\n\n try {\n users = await getUsersForEntityRef(entityRef);\n } catch (e) {\n throw new InputError();\n }\n\n const baseNotification: Omit<Notification, 'id' | 'user'> = {\n payload: {\n ...payload,\n severity: payload.severity ?? 'normal',\n },\n origin,\n created: new Date(),\n };\n\n const uniqueUsers = [...new Set(users)];\n for (const user of uniqueUsers) {\n const userNotification = {\n ...baseNotification,\n id: uuid(),\n user,\n };\n const notification = await decorateNotification(userNotification);\n\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeNotification({\n user,\n scope,\n origin,\n });\n }\n\n let ret = notification;\n if (existingNotification) {\n const restored = await store.restoreExistingNotification({\n id: existingNotification.id,\n notification,\n });\n ret = restored ?? notification;\n } else {\n await store.saveNotification(notification);\n }\n\n processorSendNotification(ret);\n notifications.push(ret);\n\n if (signalService) {\n await signalService.publish<NewNotificationSignal>({\n recipients: user,\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n }\n\n res.json(notifications);\n });\n\n router.use(errorHandler());\n return router;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { signalService } from '@backstage/plugin-signals-node';\nimport {\n NotificationProcessor,\n notificationsProcessingExtensionPoint,\n NotificationsProcessingExtensionPoint,\n} from '@backstage/plugin-notifications-node';\n\nclass NotificationsProcessingExtensionPointImpl\n implements NotificationsProcessingExtensionPoint\n{\n #processors = new Array<NotificationProcessor>();\n\n addProcessor(\n ...processors: Array<NotificationProcessor | Array<NotificationProcessor>>\n ): void {\n this.#processors.push(...processors.flat());\n }\n\n get processors() {\n return this.#processors;\n }\n}\n\n/**\n * Notifications backend plugin\n *\n * @public\n */\nexport const notificationsPlugin = createBackendPlugin({\n pluginId: 'notifications',\n register(env) {\n const processingExtensions =\n new NotificationsProcessingExtensionPointImpl();\n env.registerExtensionPoint(\n notificationsProcessingExtensionPoint,\n processingExtensions,\n );\n\n env.registerInit({\n deps: {\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n identity: coreServices.identity,\n database: coreServices.database,\n tokenManager: coreServices.tokenManager,\n discovery: coreServices.discovery,\n signals: signalService,\n },\n async init({\n auth,\n httpAuth,\n httpRouter,\n logger,\n identity,\n database,\n tokenManager,\n discovery,\n signals,\n }) {\n httpRouter.use(\n await createRouter({\n auth,\n httpAuth,\n logger,\n identity,\n database,\n tokenManager,\n discovery,\n signalService: signals,\n processors: processingExtensions.processors,\n }),\n );\n },\n });\n },\n});\n"],"names":["resolvePackagePath","catalogClient","CatalogClient","createLegacyAuthAdapters","AuthenticationError","isUserEntity","stringifyEntityRef","isGroupEntity","users","RELATION_HAS_MEMBER","Router","express","InputError","uuid","errorHandler","createBackendPlugin","notificationsProcessingExtensionPoint","coreServices","signalService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/database/DatabaseNotificationsStore.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n PluginDatabaseManager,\n resolvePackagePath,\n} from '@backstage/backend-common';\nimport {\n NotificationGetOptions,\n NotificationModifyOptions,\n NotificationsStore,\n} from './NotificationsStore';\nimport { Notification } from '@backstage/plugin-notifications-common';\nimport { Knex } from 'knex';\n\nconst migrationsDir = resolvePackagePath(\n '@backstage/plugin-notifications-backend',\n 'migrations',\n);\n\n/** @internal */\nexport class DatabaseNotificationsStore implements NotificationsStore {\n private constructor(private readonly db: Knex) {}\n\n static async create({\n database,\n skipMigrations,\n }: {\n database: PluginDatabaseManager;\n skipMigrations?: boolean;\n }): Promise<DatabaseNotificationsStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseNotificationsStore(client);\n }\n\n private mapToInteger = (val: string | number | undefined): number => {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n };\n\n private mapToNotifications = (rows: any[]): Notification[] => {\n return rows.map(row => ({\n id: row.id,\n user: row.user,\n created: row.created,\n saved: row.saved,\n read: row.read,\n updated: row.updated,\n origin: row.origin,\n payload: {\n title: row.title,\n description: row.description,\n link: row.link,\n topic: row.topic,\n severity: row.severity,\n scope: row.scope,\n icon: row.icon,\n },\n }));\n };\n\n private mapNotificationToDbRow = (notification: Notification) => {\n return {\n id: notification.id,\n user: notification.user,\n origin: notification.origin,\n created: notification.created,\n topic: notification.payload?.topic,\n link: notification.payload?.link,\n title: notification.payload?.title,\n description: notification.payload?.description,\n severity: notification.payload?.severity,\n scope: notification.payload?.scope,\n saved: notification.saved,\n read: notification.read,\n };\n };\n\n private getNotificationsBaseQuery = (\n options: NotificationGetOptions | NotificationModifyOptions,\n ) => {\n const { user } = options;\n const isSQLite = this.db.client.config.client.includes('sqlite3');\n\n const query = this.db('notification').where('user', user);\n\n if (options.sort !== undefined && options.sort !== null) {\n query.orderBy(options.sort, options.sortOrder ?? 'desc');\n } else if (options.sort !== null) {\n query.orderBy('created', options.sortOrder ?? 'desc');\n }\n\n if (options.createdAfter) {\n if (isSQLite) {\n query.where(\n 'notification.created',\n '>=',\n options.createdAfter.valueOf(),\n );\n } else {\n query.where(\n 'notification.created',\n '>=',\n options.createdAfter.toISOString(),\n );\n }\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n\n if (options.offset) {\n query.offset(options.offset);\n }\n\n if (options.search) {\n query.whereRaw(\n `(LOWER(notification.title) LIKE LOWER(?) OR LOWER(notification.description) LIKE LOWER(?))`,\n [`%${options.search}%`, `%${options.search}%`],\n );\n }\n\n if (options.ids) {\n query.whereIn('notification.id', options.ids);\n }\n\n if (options.read) {\n query.whereNotNull('notification.read');\n } else if (options.read === false) {\n query.whereNull('notification.read');\n } // or match both if undefined\n\n if (options.saved) {\n query.whereNotNull('notification.saved');\n } else if (options.saved === false) {\n query.whereNull('notification.saved');\n } // or match both if undefined\n\n return query;\n };\n\n async getNotifications(options: NotificationGetOptions) {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n const notifications = await notificationQuery.select();\n return this.mapToNotifications(notifications);\n }\n\n async getNotificationsCount(options: NotificationGetOptions) {\n const countOptions: NotificationGetOptions = { ...options };\n countOptions.limit = undefined;\n countOptions.offset = undefined;\n countOptions.sort = null;\n const notificationQuery = this.getNotificationsBaseQuery(countOptions);\n const response = await notificationQuery.count('* as CNT');\n return Number(response[0].CNT);\n }\n\n async saveNotification(notification: Notification) {\n await this.db\n .insert(this.mapNotificationToDbRow(notification))\n .into('notification');\n }\n\n async getStatus(options: NotificationGetOptions) {\n const notificationQuery = this.getNotificationsBaseQuery({\n ...options,\n sort: null,\n });\n const readSubQuery = notificationQuery\n .clone()\n .count('id')\n .whereNotNull('read')\n .as('READ');\n const unreadSubQuery = notificationQuery\n .clone()\n .count('id')\n .whereNull('read')\n .as('UNREAD');\n\n const query = await notificationQuery\n .select(readSubQuery, unreadSubQuery)\n .first();\n\n return {\n unread: this.mapToInteger((query as any)?.UNREAD),\n read: this.mapToInteger((query as any)?.READ),\n };\n }\n\n async getExistingScopeNotification(options: {\n user: string;\n scope: string;\n origin: string;\n }) {\n const query = this.db('notification')\n .where('user', options.user)\n .where('scope', options.scope)\n .where('origin', options.origin)\n .select()\n .limit(1);\n\n const rows = await query;\n if (!rows || rows.length === 0) {\n return null;\n }\n return rows[0] as Notification;\n }\n\n async restoreExistingNotification(options: {\n id: string;\n notification: Notification;\n }) {\n const query = this.db('notification')\n .where('id', options.id)\n .where('user', options.notification.user);\n\n await query.update({\n title: options.notification.payload.title,\n description: options.notification.payload.description,\n link: options.notification.payload.link,\n topic: options.notification.payload.topic,\n updated: new Date(),\n severity: options.notification.payload.severity,\n read: null,\n });\n\n return await this.getNotification(options);\n }\n\n async getNotification(options: { id: string }): Promise<Notification | null> {\n const rows = await this.db('notification')\n .where('id', options.id)\n .select()\n .limit(1);\n if (!rows || rows.length === 0) {\n return null;\n }\n return this.mapToNotifications(rows)[0];\n }\n\n async markRead(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ read: new Date() });\n }\n\n async markUnread(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ read: null });\n }\n\n async markSaved(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ saved: new Date() });\n }\n\n async markUnsaved(options: NotificationModifyOptions): Promise<void> {\n const notificationQuery = this.getNotificationsBaseQuery(options);\n await notificationQuery.update({ saved: null });\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { errorHandler, PluginDatabaseManager } from '@backstage/backend-common';\nimport express, { Request } from 'express';\nimport Router from 'express-promise-router';\nimport {\n DatabaseNotificationsStore,\n NotificationGetOptions,\n} from '../database';\nimport { v4 as uuid } from 'uuid';\nimport { CatalogApi, CatalogClient } from '@backstage/catalog-client';\nimport {\n Entity,\n isGroupEntity,\n isUserEntity,\n RELATION_HAS_MEMBER,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { NotificationProcessor } from '@backstage/plugin-notifications-node';\nimport { InputError } from '@backstage/errors';\nimport {\n AuthService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { SignalService } from '@backstage/plugin-signals-node';\nimport {\n NewNotificationSignal,\n Notification,\n NotificationReadSignal,\n} from '@backstage/plugin-notifications-common';\n\n/** @internal */\nexport interface RouterOptions {\n logger: LoggerService;\n database: PluginDatabaseManager;\n discovery: DiscoveryService;\n auth: AuthService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n signalService?: SignalService;\n catalog?: CatalogApi;\n processors?: NotificationProcessor[];\n}\n\n/** @internal */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n database,\n auth,\n httpAuth,\n userInfo,\n discovery,\n catalog,\n processors,\n signalService,\n } = options;\n\n const catalogClient =\n catalog ?? new CatalogClient({ discoveryApi: discovery });\n const store = await DatabaseNotificationsStore.create({ database });\n\n const getUser = async (req: Request<unknown>) => {\n const credentials = await httpAuth.credentials(req, { allow: ['user'] });\n const info = await userInfo.getUserInfo(credentials);\n return info.userEntityRef;\n };\n\n const getUsersForEntityRef = async (\n entityRef: string | string[] | null,\n ): Promise<string[]> => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n // TODO: Support for broadcast\n if (entityRef === null) {\n return [];\n }\n\n const refs = Array.isArray(entityRef) ? entityRef : [entityRef];\n const entities = await catalogClient.getEntitiesByRefs(\n {\n entityRefs: refs,\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n },\n { token },\n );\n const mapEntity = async (entity: Entity | undefined): Promise<string[]> => {\n if (!entity) {\n return [];\n }\n\n if (isUserEntity(entity)) {\n return [stringifyEntityRef(entity)];\n } else if (isGroupEntity(entity) && entity.relations) {\n const users = entity.relations\n .filter(\n relation =>\n relation.type === RELATION_HAS_MEMBER && relation.targetRef,\n )\n .map(r => r.targetRef);\n const childGroups = await catalogClient.getEntitiesByRefs(\n {\n entityRefs: entity.spec.children,\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n },\n { token },\n );\n const childGroupUsers = await Promise.all(\n childGroups.items.map(mapEntity),\n );\n return [...users, ...childGroupUsers.flat(2)];\n } else if (!isGroupEntity(entity) && entity.spec?.owner) {\n const owner = await catalogClient.getEntityByRef(\n entity.spec.owner as string,\n { token },\n );\n if (owner) {\n return mapEntity(owner);\n }\n }\n\n return [];\n };\n\n const users: string[] = [];\n for (const entity of entities.items) {\n const u = await mapEntity(entity);\n users.push(...u);\n }\n return users;\n };\n\n const decorateNotification = async (notification: Notification) => {\n let ret: Notification = notification;\n for (const processor of processors ?? []) {\n ret = processor.decorate ? await processor.decorate(ret) : ret;\n }\n return ret;\n };\n\n const processorSendNotification = async (notification: Notification) => {\n for (const processor of processors ?? []) {\n if (processor.send) {\n processor.send(notification);\n }\n }\n };\n\n // TODO: Move to use OpenAPI router instead\n const router = Router();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n router.get('/', async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = {\n user: user,\n };\n if (req.query.offset) {\n opts.offset = Number.parseInt(req.query.offset.toString(), 10);\n }\n if (req.query.limit) {\n opts.limit = Number.parseInt(req.query.limit.toString(), 10);\n }\n if (req.query.search) {\n opts.search = req.query.search.toString();\n }\n if (req.query.read === 'true') {\n opts.read = true;\n } else if (req.query.read === 'false') {\n opts.read = false;\n // or keep undefined\n }\n if (req.query.created_after) {\n const sinceEpoch = Date.parse(String(req.query.created_after));\n if (isNaN(sinceEpoch)) {\n throw new InputError('Unexpected date format');\n }\n opts.createdAfter = new Date(sinceEpoch);\n }\n\n const [notifications, totalCount] = await Promise.all([\n store.getNotifications(opts),\n store.getNotificationsCount(opts),\n ]);\n res.send({\n totalCount,\n notifications,\n });\n });\n\n router.get('/:id', async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = {\n user: user,\n limit: 1,\n ids: [req.params.id],\n };\n const notifications = await store.getNotifications(opts);\n if (notifications.length !== 1) {\n res.status(404).send({ error: 'Not found' });\n return;\n }\n res.send(notifications[0]);\n });\n\n router.get('/status', async (req, res) => {\n const user = await getUser(req);\n const status = await store.getStatus({ user });\n res.send(status);\n });\n\n router.post('/update', async (req, res) => {\n const user = await getUser(req);\n const { ids, read, saved } = req.body;\n if (!ids || !Array.isArray(ids)) {\n throw new InputError();\n }\n\n if (read === true) {\n await store.markRead({ user, ids });\n\n if (signalService) {\n await signalService.publish<NotificationReadSignal>({\n recipients: [user],\n message: { action: 'notification_read', notification_ids: ids },\n channel: 'notifications',\n });\n }\n } else if (read === false) {\n await store.markUnread({ user: user, ids });\n\n if (signalService) {\n await signalService.publish<NotificationReadSignal>({\n recipients: [user],\n message: { action: 'notification_unread', notification_ids: ids },\n channel: 'notifications',\n });\n }\n }\n\n if (saved === true) {\n await store.markSaved({ user: user, ids });\n } else if (saved === false) {\n await store.markUnsaved({ user: user, ids });\n }\n\n const notifications = await store.getNotifications({ ids, user: user });\n res.status(200).send(notifications);\n });\n\n // Add new notification\n router.post('/', async (req, res) => {\n const { recipients, payload } = req.body;\n const notifications = [];\n let users = [];\n\n const credentials = await httpAuth.credentials(req, { allow: ['service'] });\n\n const { title, scope } = payload;\n\n if (!recipients || !title) {\n logger.error(`Invalid notification request received`);\n throw new InputError();\n }\n\n let entityRef = null;\n // TODO: Support for broadcast notifications\n if (recipients.entityRef && recipients.type === 'entity') {\n entityRef = recipients.entityRef;\n }\n\n try {\n users = await getUsersForEntityRef(entityRef);\n } catch (e) {\n throw new InputError();\n }\n\n const origin = credentials.principal.subject;\n const baseNotification: Omit<Notification, 'id' | 'user'> = {\n payload: {\n ...payload,\n severity: payload.severity ?? 'normal',\n },\n origin,\n created: new Date(),\n };\n\n const uniqueUsers = [...new Set(users)];\n for (const user of uniqueUsers) {\n const userNotification = {\n ...baseNotification,\n id: uuid(),\n user,\n };\n const notification = await decorateNotification(userNotification);\n\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeNotification({\n user,\n scope,\n origin,\n });\n }\n\n let ret = notification;\n if (existingNotification) {\n const restored = await store.restoreExistingNotification({\n id: existingNotification.id,\n notification,\n });\n ret = restored ?? notification;\n } else {\n await store.saveNotification(notification);\n }\n\n processorSendNotification(ret);\n notifications.push(ret);\n\n if (signalService) {\n await signalService.publish<NewNotificationSignal>({\n recipients: user,\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n }\n\n res.json(notifications);\n });\n\n router.use(errorHandler());\n return router;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { signalService } from '@backstage/plugin-signals-node';\nimport {\n NotificationProcessor,\n notificationsProcessingExtensionPoint,\n NotificationsProcessingExtensionPoint,\n} from '@backstage/plugin-notifications-node';\n\nclass NotificationsProcessingExtensionPointImpl\n implements NotificationsProcessingExtensionPoint\n{\n #processors = new Array<NotificationProcessor>();\n\n addProcessor(\n ...processors: Array<NotificationProcessor | Array<NotificationProcessor>>\n ): void {\n this.#processors.push(...processors.flat());\n }\n\n get processors() {\n return this.#processors;\n }\n}\n\n/**\n * Notifications backend plugin\n *\n * @public\n */\nexport const notificationsPlugin = createBackendPlugin({\n pluginId: 'notifications',\n register(env) {\n const processingExtensions =\n new NotificationsProcessingExtensionPointImpl();\n env.registerExtensionPoint(\n notificationsProcessingExtensionPoint,\n processingExtensions,\n );\n\n env.registerInit({\n deps: {\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n userInfo: coreServices.userInfo,\n httpRouter: coreServices.httpRouter,\n logger: coreServices.logger,\n database: coreServices.database,\n discovery: coreServices.discovery,\n signals: signalService,\n },\n async init({\n auth,\n httpAuth,\n userInfo,\n httpRouter,\n logger,\n database,\n discovery,\n signals,\n }) {\n httpRouter.use(\n await createRouter({\n auth,\n httpAuth,\n userInfo,\n logger,\n database,\n discovery,\n signalService: signals,\n processors: processingExtensions.processors,\n }),\n );\n },\n });\n },\n});\n"],"names":["resolvePackagePath","catalogClient","CatalogClient","isUserEntity","stringifyEntityRef","isGroupEntity","users","RELATION_HAS_MEMBER","Router","express","InputError","uuid","errorHandler","createBackendPlugin","notificationsProcessingExtensionPoint","coreServices","signalService"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-notifications-backend",
|
|
3
|
-
"version": "0.1.0-next.
|
|
3
|
+
"version": "0.1.0-next.1",
|
|
4
4
|
"backstage": {
|
|
5
5
|
"role": "backend-plugin"
|
|
6
6
|
},
|
|
@@ -30,17 +30,17 @@
|
|
|
30
30
|
"test": "backstage-cli package test"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@backstage/backend-common": "^0.21.
|
|
34
|
-
"@backstage/backend-plugin-api": "^0.6.
|
|
33
|
+
"@backstage/backend-common": "^0.21.4-next.1",
|
|
34
|
+
"@backstage/backend-plugin-api": "^0.6.14-next.1",
|
|
35
35
|
"@backstage/catalog-client": "^1.6.1-next.0",
|
|
36
36
|
"@backstage/catalog-model": "^1.4.5-next.0",
|
|
37
|
-
"@backstage/config": "^1.
|
|
37
|
+
"@backstage/config": "^1.2.0-next.1",
|
|
38
38
|
"@backstage/errors": "^1.2.4-next.0",
|
|
39
|
-
"@backstage/plugin-auth-node": "^0.4.
|
|
40
|
-
"@backstage/plugin-events-node": "^0.3.0-next.
|
|
41
|
-
"@backstage/plugin-notifications-common": "^0.0.2-next.
|
|
42
|
-
"@backstage/plugin-notifications-node": "^0.1.0-next.
|
|
43
|
-
"@backstage/plugin-signals-node": "^0.0
|
|
39
|
+
"@backstage/plugin-auth-node": "^0.4.9-next.1",
|
|
40
|
+
"@backstage/plugin-events-node": "^0.3.0-next.1",
|
|
41
|
+
"@backstage/plugin-notifications-common": "^0.0.2-next.1",
|
|
42
|
+
"@backstage/plugin-notifications-node": "^0.1.0-next.1",
|
|
43
|
+
"@backstage/plugin-signals-node": "^0.1.0-next.1",
|
|
44
44
|
"express": "^4.17.1",
|
|
45
45
|
"express-promise-router": "^4.1.0",
|
|
46
46
|
"knex": "^3.0.0",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"yn": "^4.0.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@backstage/backend-test-utils": "^0.3.
|
|
54
|
-
"@backstage/cli": "^0.25.3-next.
|
|
53
|
+
"@backstage/backend-test-utils": "^0.3.4-next.1",
|
|
54
|
+
"@backstage/cli": "^0.25.3-next.1",
|
|
55
55
|
"@types/express": "^4.17.6",
|
|
56
56
|
"@types/supertest": "^2.0.8",
|
|
57
57
|
"msw": "^1.0.0",
|