@backstage/plugin-notifications-backend 0.6.5-next.1 → 0.6.6-next.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.cjs.js","sources":["../../../../src/schema/openapi/generated/router.ts"],"sourcesContent":["/*\n * Copyright 2026 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\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouterFromGeneratedEndpointMap } from '@backstage/backend-openapi-utils';\nimport { EndpointMap } from './apis';\n\nexport const spec = {\n openapi: '3.1.0',\n info: {\n title: 'notifications',\n version: '1',\n description: 'The Backstage backend plugin that powers user notifications.',\n license: {\n name: 'Apache-2.0',\n url: 'http://www.apache.org/licenses/LICENSE-2.0.html',\n },\n contact: {},\n },\n servers: [\n {\n url: '/',\n },\n ],\n components: {\n examples: {},\n headers: {},\n parameters: {\n notificationId: {\n name: 'id',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n },\n offset: {\n name: 'offset',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n limit: {\n name: 'limit',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'integer',\n minimum: 0,\n },\n },\n orderField: {\n name: 'orderField',\n in: 'query',\n required: false,\n allowReserved: true,\n description:\n 'One or more \"field,direction\" pairs. Direction is \"asc\" or \"desc\". Pass multiple to express compound sorts.',\n schema: {\n $ref: '#/components/schemas/OrderField',\n },\n },\n topic: {\n name: 'topic',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'string',\n },\n },\n search: {\n name: 'search',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'string',\n },\n },\n read: {\n name: 'read',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'string',\n enum: ['true', 'false'],\n },\n },\n saved: {\n name: 'saved',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n type: 'string',\n enum: ['true', 'false'],\n },\n },\n createdAfter: {\n name: 'createdAfter',\n in: 'query',\n required: false,\n allowReserved: true,\n description: 'ISO 8601 date-time string. Validated by the handler.',\n schema: {\n type: 'string',\n },\n },\n minimumSeverity: {\n name: 'minimumSeverity',\n in: 'query',\n required: false,\n allowReserved: true,\n schema: {\n $ref: '#/components/schemas/NotificationSeverity',\n },\n },\n },\n requestBodies: {},\n responses: {\n ErrorResponse: {\n description: 'An error response from the backend.',\n content: {\n 'application/json; charset=utf-8': {\n schema: {\n $ref: '#/components/schemas/Error',\n },\n },\n },\n },\n },\n schemas: {\n NotificationSeverity: {\n type: 'string',\n enum: ['critical', 'high', 'normal', 'low'],\n },\n NotificationPayload: {\n type: 'object',\n required: ['title'],\n properties: {\n title: {\n type: 'string',\n description: 'Notification title',\n },\n description: {\n type: 'string',\n description: 'Optional longer description for the notification',\n },\n link: {\n type: 'string',\n description: 'Optional link where the notification is pointing to',\n },\n severity: {\n $ref: '#/components/schemas/NotificationSeverity',\n },\n topic: {\n type: 'string',\n description: 'Optional notification topic',\n },\n scope: {\n type: 'string',\n description:\n 'Notification scope, can be used to re-send same notifications in case the scope and origin matches.',\n },\n icon: {\n type: 'string',\n description: 'Optional notification icon',\n },\n metadata: {\n type: 'object',\n description: 'Optional additional customizable metadata.',\n additionalProperties: true,\n },\n },\n },\n NotificationResponsePayload: {\n description:\n 'Response variant of NotificationPayload. Optional string fields may be returned as null when unset.',\n type: 'object',\n required: ['title'],\n properties: {\n title: {\n type: 'string',\n },\n description: {\n type: ['string', 'null'],\n },\n link: {\n type: ['string', 'null'],\n },\n severity: {\n $ref: '#/components/schemas/NotificationSeverity',\n },\n topic: {\n type: ['string', 'null'],\n },\n scope: {\n type: ['string', 'null'],\n },\n icon: {\n type: ['string', 'null'],\n },\n metadata: {\n type: 'object',\n additionalProperties: true,\n },\n },\n },\n Notification: {\n type: 'object',\n required: ['id', 'user', 'created', 'origin', 'payload'],\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the notification.',\n },\n user: {\n type: ['string', 'null'],\n description:\n 'User entity reference, or null for broadcast notifications.',\n },\n created: {\n type: 'string',\n format: 'date-time',\n },\n saved: {\n type: ['string', 'null'],\n format: 'date-time',\n },\n read: {\n type: ['string', 'null'],\n format: 'date-time',\n },\n updated: {\n type: ['string', 'null'],\n format: 'date-time',\n },\n origin: {\n type: 'string',\n description: \"Origin of the notification (the sender's reference).\",\n },\n payload: {\n $ref: '#/components/schemas/NotificationResponsePayload',\n },\n },\n },\n NotificationStatus: {\n type: 'object',\n required: ['unread', 'read'],\n properties: {\n unread: {\n type: 'integer',\n },\n read: {\n type: 'integer',\n },\n },\n },\n TopicSetting: {\n type: 'object',\n required: ['id', 'enabled'],\n properties: {\n id: {\n type: 'string',\n },\n enabled: {\n type: 'boolean',\n },\n },\n },\n OriginSetting: {\n type: 'object',\n required: ['id', 'enabled'],\n properties: {\n id: {\n type: 'string',\n },\n enabled: {\n type: 'boolean',\n },\n topics: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/TopicSetting',\n },\n },\n },\n },\n ChannelSetting: {\n type: 'object',\n required: ['id', 'origins'],\n properties: {\n id: {\n type: 'string',\n },\n enabled: {\n type: 'boolean',\n },\n origins: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/OriginSetting',\n },\n },\n },\n },\n NotificationSettings: {\n type: 'object',\n required: ['channels'],\n properties: {\n channels: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/ChannelSetting',\n },\n },\n },\n },\n EntityRef: {\n description: 'A single entity ref, or a list of entity refs.',\n oneOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n },\n OrderField: {\n description:\n 'One or more \"field,direction\" pairs, given as a single string or an array of strings.',\n oneOf: [\n {\n type: 'string',\n },\n {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n ],\n },\n NotificationRecipients: {\n oneOf: [\n {\n type: 'object',\n required: ['type', 'entityRef'],\n properties: {\n type: {\n type: 'string',\n enum: ['entity'],\n },\n entityRef: {\n $ref: '#/components/schemas/EntityRef',\n },\n excludeEntityRef: {\n $ref: '#/components/schemas/EntityRef',\n },\n },\n },\n {\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n type: 'string',\n enum: ['broadcast'],\n },\n },\n },\n ],\n },\n NotificationSendOptions: {\n type: 'object',\n required: ['recipients', 'payload'],\n properties: {\n recipients: {\n $ref: '#/components/schemas/NotificationRecipients',\n },\n payload: {\n $ref: '#/components/schemas/NotificationPayload',\n },\n },\n },\n UpdateNotificationsRequest: {\n type: 'object',\n required: ['ids'],\n properties: {\n ids: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n read: {\n type: 'boolean',\n },\n saved: {\n type: 'boolean',\n },\n },\n },\n ListNotificationsResponse: {\n type: 'object',\n required: ['totalCount', 'notifications'],\n properties: {\n totalCount: {\n type: 'integer',\n },\n notifications: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n GetTopicsResponse: {\n type: 'object',\n required: ['topics'],\n properties: {\n topics: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n },\n Error: {\n type: 'object',\n properties: {\n error: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n },\n required: ['name', 'message'],\n },\n request: {\n type: 'object',\n properties: {\n method: {\n type: 'string',\n },\n url: {\n type: 'string',\n },\n },\n required: ['method', 'url'],\n },\n response: {\n type: 'object',\n properties: {\n statusCode: {\n type: 'number',\n },\n },\n required: ['statusCode'],\n },\n },\n required: ['error', 'request', 'response'],\n },\n },\n securitySchemes: {\n JWT: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n },\n },\n },\n paths: {\n '/': {\n get: {\n operationId: 'ListNotificationsLegacy',\n deprecated: true,\n description: 'Deprecated alias for `GET /notifications`.',\n parameters: [\n {\n $ref: '#/components/parameters/offset',\n },\n {\n $ref: '#/components/parameters/limit',\n },\n {\n $ref: '#/components/parameters/orderField',\n },\n {\n $ref: '#/components/parameters/topic',\n },\n {\n $ref: '#/components/parameters/search',\n },\n {\n $ref: '#/components/parameters/read',\n },\n {\n $ref: '#/components/parameters/saved',\n },\n {\n $ref: '#/components/parameters/createdAfter',\n },\n {\n $ref: '#/components/parameters/minimumSeverity',\n },\n ],\n responses: {\n '200': {\n description: 'A page of notifications for the current user.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListNotificationsResponse',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n post: {\n operationId: 'CreateNotificationsLegacy',\n deprecated: true,\n description: 'Deprecated alias for `POST /notifications`.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationSendOptions',\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'The notifications that were created.',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/notifications': {\n get: {\n operationId: 'ListNotifications',\n description: 'List notifications for the current user.',\n parameters: [\n {\n $ref: '#/components/parameters/offset',\n },\n {\n $ref: '#/components/parameters/limit',\n },\n {\n $ref: '#/components/parameters/orderField',\n },\n {\n $ref: '#/components/parameters/topic',\n },\n {\n $ref: '#/components/parameters/search',\n },\n {\n $ref: '#/components/parameters/read',\n },\n {\n $ref: '#/components/parameters/saved',\n },\n {\n $ref: '#/components/parameters/createdAfter',\n },\n {\n $ref: '#/components/parameters/minimumSeverity',\n },\n ],\n responses: {\n '200': {\n description: 'A page of notifications for the current user.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/ListNotificationsResponse',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n post: {\n operationId: 'CreateNotifications',\n description:\n 'Send a notification to one or more recipients (service credentials required).',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationSendOptions',\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'The notifications that were created.',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/update': {\n post: {\n operationId: 'UpdateNotificationsLegacy',\n deprecated: true,\n description: 'Deprecated alias for `POST /notifications/update`.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/UpdateNotificationsRequest',\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'The notifications that were updated.',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/notifications/update': {\n post: {\n operationId: 'UpdateNotifications',\n description: 'Mark notifications as read/unread or saved/unsaved.',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/UpdateNotificationsRequest',\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'The notifications that were updated.',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/status': {\n get: {\n operationId: 'GetStatus',\n description: 'Get the unread/read counts for the current user.',\n responses: {\n '200': {\n description: \"The current user's notification status.\",\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationStatus',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/settings': {\n get: {\n operationId: 'GetSettings',\n description:\n \"Get the current user's notification settings, merged with defaults.\",\n responses: {\n '200': {\n description: 'Effective notification settings for the user.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationSettings',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n post: {\n operationId: 'UpdateSettings',\n description: \"Update the current user's notification settings.\",\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationSettings',\n },\n },\n },\n },\n responses: {\n '200': {\n description: 'Effective notification settings for the user.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/NotificationSettings',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/topics': {\n get: {\n operationId: 'GetTopics',\n description:\n 'List notification topics that the user has received notifications on.',\n parameters: [\n {\n $ref: '#/components/parameters/search',\n },\n {\n $ref: '#/components/parameters/read',\n },\n {\n $ref: '#/components/parameters/saved',\n },\n {\n $ref: '#/components/parameters/createdAfter',\n },\n {\n $ref: '#/components/parameters/minimumSeverity',\n },\n ],\n responses: {\n '200': {\n description: 'The list of topics.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/GetTopicsResponse',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/{id}': {\n get: {\n operationId: 'GetNotificationLegacy',\n deprecated: true,\n description: 'Deprecated alias for `GET /notifications/{id}`.',\n parameters: [\n {\n $ref: '#/components/parameters/notificationId',\n },\n ],\n responses: {\n '200': {\n description: 'The requested notification.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n '/notifications/{id}': {\n get: {\n operationId: 'GetNotification',\n description: 'Get a single notification by id for the current user.',\n parameters: [\n {\n $ref: '#/components/parameters/notificationId',\n },\n ],\n responses: {\n '200': {\n description: 'The requested notification.',\n content: {\n 'application/json': {\n schema: {\n $ref: '#/components/schemas/Notification',\n },\n },\n },\n },\n default: {\n $ref: '#/components/responses/ErrorResponse',\n },\n },\n security: [\n {},\n {\n JWT: [],\n },\n ],\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<\n typeof createValidatedOpenApiRouterFromGeneratedEndpointMap\n >['1'],\n) =>\n createValidatedOpenApiRouterFromGeneratedEndpointMap<EndpointMap>(\n spec,\n options,\n );\n"],"names":["createValidatedOpenApiRouterFromGeneratedEndpointMap"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var express = require('express');
4
- var Router = require('express-promise-router');
3
+ var router = require('../schema/openapi/generated/router.cjs.js');
5
4
  var DatabaseNotificationsStore = require('../database/DatabaseNotificationsStore.cjs.js');
6
5
  var crypto = require('node:crypto');
7
6
  var errors = require('@backstage/errors');
@@ -15,8 +14,6 @@ var DefaultNotificationRecipientResolver = require('./DefaultNotificationRecipie
15
14
 
16
15
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
17
16
 
18
- var express__default = /*#__PURE__*/_interopDefaultCompat(express);
19
- var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
20
17
  var pThrottle__default = /*#__PURE__*/_interopDefaultCompat(pThrottle);
21
18
 
22
19
  async function createRouter(options) {
@@ -280,7 +277,7 @@ async function createRouter(options) {
280
277
  };
281
278
  const appendCommonOptions = (req, opts) => {
282
279
  if (req.query.search) {
283
- opts.search = req.query.search.toString();
280
+ opts.search = req.query.search;
284
281
  }
285
282
  if (req.query.read === "true") {
286
283
  opts.read = true;
@@ -293,76 +290,71 @@ async function createRouter(options) {
293
290
  opts.saved = false;
294
291
  }
295
292
  if (req.query.createdAfter) {
296
- const sinceEpoch = Date.parse(String(req.query.createdAfter));
293
+ const sinceEpoch = Date.parse(req.query.createdAfter);
297
294
  if (isNaN(sinceEpoch)) {
298
295
  throw new errors.InputError("Unexpected date format");
299
296
  }
300
297
  opts.createdAfter = new Date(sinceEpoch);
301
298
  }
302
299
  if (req.query.minimumSeverity) {
303
- opts.minimumSeverity = DatabaseNotificationsStore.normalizeSeverity(
304
- req.query.minimumSeverity.toString()
305
- );
300
+ opts.minimumSeverity = DatabaseNotificationsStore.normalizeSeverity(req.query.minimumSeverity);
306
301
  }
307
302
  };
308
- const router = Router__default.default();
309
- router.use(express__default.default.json());
303
+ const router$1 = await router.createOpenApiRouter();
310
304
  const listNotificationsHandler = async (req, res) => {
311
305
  const user = await getUser(req);
312
- const opts = {
313
- user
314
- };
315
- if (req.query.offset) {
316
- opts.offset = Number.parseInt(req.query.offset.toString(), 10);
306
+ const opts = { user };
307
+ if (req.query.offset !== void 0) {
308
+ opts.offset = req.query.offset;
317
309
  }
318
- if (req.query.limit) {
319
- opts.limit = Number.parseInt(req.query.limit.toString(), 10);
310
+ if (req.query.limit !== void 0) {
311
+ opts.limit = req.query.limit;
320
312
  }
321
- if (req.query.orderField) {
322
- opts.orderField = parseEntityOrderFieldParams.parseEntityOrderFieldParams(req.query);
313
+ if (req.query.orderField !== void 0) {
314
+ opts.orderField = parseEntityOrderFieldParams.parseEntityOrderFieldParams({
315
+ orderField: req.query.orderField
316
+ });
323
317
  }
324
318
  if (req.query.topic) {
325
- opts.topic = req.query.topic.toString();
319
+ opts.topic = req.query.topic;
326
320
  }
327
321
  appendCommonOptions(req, opts);
328
322
  const [notifications, totalCount] = await Promise.all([
329
323
  store.getNotifications(opts),
330
324
  store.getNotificationsCount(opts)
331
325
  ]);
332
- res.json({
333
- totalCount,
334
- notifications
335
- });
326
+ res.json({ totalCount, notifications });
336
327
  };
337
- router.get("/", listNotificationsHandler);
338
- router.get("/notifications", listNotificationsHandler);
339
- router.get("/status", async (req, res) => {
328
+ router$1.get("/", listNotificationsHandler);
329
+ router$1.get("/notifications", listNotificationsHandler);
330
+ router$1.get("/status", async (req, res) => {
340
331
  const user = await getUser(req);
341
332
  const status = await store.getStatus({ user });
342
333
  res.json(status);
343
334
  });
344
- router.get(
345
- "/settings",
346
- async (req, res) => {
347
- const user = await getUser(req);
348
- const response = await getNotificationSettings(user);
349
- res.json(response);
350
- }
351
- );
352
- router.post(
353
- "/settings",
354
- async (req, res) => {
355
- const user = await getUser(req);
356
- const channels = getNotificationChannels();
357
- const settings = req.body;
358
- if (settings.channels.some((c) => !channels.includes(c.id))) {
359
- throw new errors.InputError("Invalid channel");
360
- }
361
- await store.saveNotificationSettings({ user, settings });
362
- const response = await getNotificationSettings(user);
363
- res.json(response);
335
+ router$1.get("/settings", async (req, res) => {
336
+ const user = await getUser(req);
337
+ const response = await getNotificationSettings(user);
338
+ res.json(response);
339
+ });
340
+ router$1.post("/settings", async (req, res) => {
341
+ const user = await getUser(req);
342
+ const channels = getNotificationChannels();
343
+ const settings = req.body;
344
+ if (settings.channels.some((c) => !channels.includes(c.id))) {
345
+ throw new errors.InputError("Invalid channel");
364
346
  }
365
- );
347
+ await store.saveNotificationSettings({ user, settings });
348
+ const response = await getNotificationSettings(user);
349
+ res.json(response);
350
+ });
351
+ router$1.get("/topics", async (req, res) => {
352
+ const user = await getUser(req);
353
+ const opts = { user };
354
+ appendCommonOptions(req, opts);
355
+ const topics = await store.getTopics(opts);
356
+ res.json(topics);
357
+ });
366
358
  const getNotificationHandler = async (req, res) => {
367
359
  const user = await getUser(req);
368
360
  const opts = {
@@ -376,24 +368,11 @@ async function createRouter(options) {
376
368
  }
377
369
  res.json(notifications[0]);
378
370
  };
379
- const listTopicsHandler = async (req, res) => {
380
- const user = await getUser(req);
381
- const opts = {
382
- user
383
- };
384
- appendCommonOptions(req, opts);
385
- const topics = await store.getTopics(opts);
386
- res.json(topics);
387
- };
388
- router.get("/topics", listTopicsHandler);
389
- router.get("/:id", getNotificationHandler);
390
- router.get("/notifications/:id", getNotificationHandler);
371
+ router$1.get("/:id", getNotificationHandler);
372
+ router$1.get("/notifications/:id", getNotificationHandler);
391
373
  const updateNotificationsHandler = async (req, res) => {
392
374
  const user = await getUser(req);
393
375
  const { ids, read, saved } = req.body;
394
- if (!ids || !Array.isArray(ids)) {
395
- throw new errors.InputError();
396
- }
397
376
  if (read === true) {
398
377
  await store.markRead({ user, ids });
399
378
  if (signals) {
@@ -421,8 +400,8 @@ async function createRouter(options) {
421
400
  const notifications = await store.getNotifications({ ids, user });
422
401
  res.json(notifications);
423
402
  };
424
- router.post("/update", updateNotificationsHandler);
425
- router.post("/notifications/update", updateNotificationsHandler);
403
+ router$1.post("/update", updateNotificationsHandler);
404
+ router$1.post("/notifications/update", updateNotificationsHandler);
426
405
  const sendBroadcastNotification = async (baseNotification, opts, origin) => {
427
406
  const { scope } = opts.payload;
428
407
  const broadcastNotification = {
@@ -531,7 +510,7 @@ async function createRouter(options) {
531
510
  const sent = await Promise.all(uniqueUsers.map((user) => throttled(user)));
532
511
  return sent.filter((n) => n !== void 0);
533
512
  };
534
- const createNotificationHandler = async (req, res) => {
513
+ const createNotificationsHandler = async (req, res) => {
535
514
  const credentials = await httpAuth.credentials(req, {
536
515
  allow: ["service"]
537
516
  });
@@ -597,9 +576,9 @@ async function createRouter(options) {
597
576
  }
598
577
  res.json(notifications);
599
578
  };
600
- router.post("/", createNotificationHandler);
601
- router.post("/notifications", createNotificationHandler);
602
- return router;
579
+ router$1.post("/", createNotificationsHandler);
580
+ router$1.post("/notifications", createNotificationsHandler);
581
+ return router$1;
603
582
  }
604
583
 
605
584
  exports.createRouter = createRouter;
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 */\n\nimport express, { Request, Response } from 'express';\nimport Router from 'express-promise-router';\nimport {\n normalizeSeverity,\n NotificationGetOptions,\n NotificationsStore,\n TopicGetOptions,\n} from '../database';\nimport { randomUUID as uuid } from 'node:crypto';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\nimport {\n NotificationProcessor,\n NotificationRecipientResolver,\n NotificationSendOptions,\n} from '@backstage/plugin-notifications-node';\nimport { InputError, NotFoundError } from '@backstage/errors';\nimport {\n AuthService,\n HttpAuthService,\n LoggerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport {\n ChannelSetting,\n isNotificationsEnabledFor,\n NewNotificationSignal,\n Notification,\n NotificationReadSignal,\n NotificationSettings,\n notificationSeverities,\n NotificationStatus,\n OriginSetting,\n} from '@backstage/plugin-notifications-common';\nimport { parseEntityOrderFieldParams } from './parseEntityOrderFieldParams';\nimport { Config, readDurationFromConfig } from '@backstage/config';\nimport { durationToMilliseconds } from '@backstage/types';\nimport pThrottle from 'p-throttle';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { DefaultNotificationRecipientResolver } from './DefaultNotificationRecipientResolver.ts';\n\n/** @internal */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n store: NotificationsStore;\n auth: AuthService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n signals?: SignalsService;\n catalog: CatalogService;\n processors?: NotificationProcessor[];\n recipientResolver?: NotificationRecipientResolver;\n}\n\n/** @internal */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n config,\n logger,\n store,\n auth,\n httpAuth,\n userInfo,\n catalog,\n processors = [],\n signals,\n recipientResolver,\n } = options;\n\n const WEB_NOTIFICATION_CHANNEL = 'Web';\n const frontendBaseUrl = config.getString('app.baseUrl');\n const concurrencyLimit =\n config.getOptionalNumber('notifications.concurrencyLimit') ?? 10;\n const throttleInterval = config.has('notifications.throttleInterval')\n ? durationToMilliseconds(\n readDurationFromConfig(config, {\n key: 'notifications.throttleInterval',\n }),\n )\n : 50;\n const throttle = pThrottle({\n limit: concurrencyLimit,\n interval: throttleInterval,\n });\n const defaultNotificationSettings: NotificationSettings | undefined =\n config.getOptional<NotificationSettings>('notifications.defaultSettings');\n\n const usedRecipientResolver =\n recipientResolver ??\n new DefaultNotificationRecipientResolver(auth, catalog);\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 getNotificationChannels = () => {\n return [WEB_NOTIFICATION_CHANNEL, ...processors.map(p => p.getName())];\n };\n\n const getTopicSettings = (\n topic: any,\n existingOrigin: OriginSetting | undefined,\n defaultOriginSettings: OriginSetting | undefined,\n channelDefaultEnabled: boolean,\n ) => {\n const existingTopic = existingOrigin?.topics?.find(\n t => t.id.toLowerCase() === topic.topic.toLowerCase(),\n );\n const defaultTopicSettings = defaultOriginSettings?.topics?.find(\n t => t.id.toLowerCase() === topic.topic.toLowerCase(),\n );\n\n // If topic has explicit setting, use it\n // Otherwise check default topic settings from config\n // Otherwise use channel default (not origin enabled state)\n return {\n id: topic.topic,\n enabled: existingTopic\n ? existingTopic.enabled\n : defaultTopicSettings?.enabled ?? channelDefaultEnabled,\n };\n };\n\n const getOriginSettings = (\n originId: string,\n existingChannel: ChannelSetting | undefined,\n defaultChannelSettings: ChannelSetting | undefined,\n topics: { origin: string; topic: string }[],\n channelDefaultEnabled: boolean,\n channelHasExplicitEnabled: boolean,\n ) => {\n const existingOrigin = existingChannel?.origins?.find(\n o => o.id.toLowerCase() === originId.toLowerCase(),\n );\n\n const defaultOriginSettings = defaultChannelSettings?.origins?.find(\n c => c.id.toLowerCase() === originId.toLowerCase(),\n );\n\n const defaultEnabled = existingOrigin\n ? existingOrigin.enabled\n : defaultOriginSettings?.enabled ?? channelDefaultEnabled;\n\n return {\n id: originId,\n enabled: defaultEnabled,\n topics: topics\n .filter(t => t.origin === originId)\n .map(t =>\n getTopicSettings(\n t,\n existingOrigin,\n defaultOriginSettings,\n channelHasExplicitEnabled ? channelDefaultEnabled : defaultEnabled,\n ),\n ),\n };\n };\n\n const getChannelSettings = (\n channelId: string,\n settings: NotificationSettings,\n origins: string[],\n topics: { origin: string; topic: string }[],\n ) => {\n const existingChannel = settings.channels.find(\n c => c.id.toLowerCase() === channelId.toLowerCase(),\n );\n const defaultChannelSettings = defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === channelId.toLowerCase(),\n );\n\n // Determine channel enabled state\n const channelEnabled =\n existingChannel?.enabled ?? defaultChannelSettings?.enabled;\n\n // Use channel's enabled flag as the default for origins if not explicitly set\n const defaultEnabledForOrigins = channelEnabled ?? true;\n\n // Check if channel has explicit enabled flag (either from user settings or config)\n const channelHasExplicitEnabled =\n existingChannel?.enabled !== undefined ||\n defaultChannelSettings?.enabled !== undefined;\n\n return {\n id: channelId,\n enabled: channelEnabled,\n origins: origins.map(originId =>\n getOriginSettings(\n originId,\n existingChannel,\n defaultChannelSettings,\n topics,\n defaultEnabledForOrigins,\n channelHasExplicitEnabled,\n ),\n ),\n };\n };\n\n const getNotificationSettings = async (\n user: string,\n ): Promise<NotificationSettings> => {\n const { origins } = await store.getUserNotificationOrigins({ user });\n const { topics } = await store.getUserNotificationTopics({ user });\n const settings = await store.getNotificationSettings({ user });\n const channels = getNotificationChannels();\n\n // Merge existing channels/origins/topics with configured settings\n for (const channel of defaultNotificationSettings?.channels ?? []) {\n if (!channels.includes(channel.id)) {\n channels.push(channel.id);\n }\n\n for (const origin of channel.origins ?? []) {\n if (!origins.includes(origin.id)) {\n origins.push(origin.id);\n }\n\n for (const topic of origin.topics ?? []) {\n if (\n !topics.some(t => t.origin === origin.id && t.topic === topic.id)\n ) {\n topics.push({ origin: origin.id, topic: topic.id });\n }\n }\n }\n }\n\n return {\n channels: channels.map(channelId =>\n getChannelSettings(channelId, settings, origins, topics),\n ),\n };\n };\n\n const isNotificationsEnabled = async (opts: {\n user: string;\n channel: string;\n origin: string;\n topic: string | null;\n }) => {\n // Get user's explicit settings from database\n const userSettings = await store.getNotificationSettings({\n user: opts.user,\n });\n\n // Build a minimal settings object with user settings and config defaults\n const settings: NotificationSettings = {\n channels: [\n {\n id: opts.channel,\n enabled: defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n )?.enabled,\n origins: [],\n },\n ],\n };\n\n // Add user's channel if it exists\n const userChannel = userSettings.channels.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n );\n if (userChannel) {\n settings.channels[0] = {\n ...settings.channels[0],\n enabled: userChannel.enabled ?? settings.channels[0].enabled,\n origins: userChannel.origins ?? [],\n };\n }\n\n // Add config default origins if not in user settings\n // Only add origins if the channel is enabled (not explicitly disabled)\n const defaultChannelSettings = defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n );\n if (\n defaultChannelSettings?.origins &&\n settings.channels[0].enabled !== false\n ) {\n for (const defaultOrigin of defaultChannelSettings.origins) {\n if (\n !settings.channels[0].origins.some(\n o => o.id.toLowerCase() === defaultOrigin.id.toLowerCase(),\n )\n ) {\n settings.channels[0].origins.push(defaultOrigin);\n }\n }\n }\n\n return isNotificationsEnabledFor(\n settings,\n opts.channel,\n opts.origin,\n opts.topic,\n );\n };\n\n const filterProcessors = async (\n notification:\n | Notification\n | ({ origin: string; user: null } & NotificationSendOptions),\n ) => {\n const result: NotificationProcessor[] = [];\n const { payload, user, origin } = notification;\n\n for (const processor of processors) {\n if (user) {\n const enabled = await isNotificationsEnabled({\n user,\n origin,\n channel: processor.getName(),\n topic: payload.topic ?? null,\n });\n if (!enabled) {\n continue;\n }\n }\n\n if (processor.getNotificationFilters) {\n const filters = processor.getNotificationFilters();\n if (filters.minSeverity) {\n if (\n notificationSeverities.indexOf(payload.severity ?? 'normal') >\n notificationSeverities.indexOf(filters.minSeverity)\n ) {\n continue;\n }\n }\n\n if (filters.maxSeverity) {\n if (\n notificationSeverities.indexOf(payload.severity ?? 'normal') <\n notificationSeverities.indexOf(filters.maxSeverity)\n ) {\n continue;\n }\n }\n\n if (filters.excludedTopics && payload.topic) {\n if (filters.excludedTopics.includes(payload.topic)) {\n continue;\n }\n }\n\n if (filters.includedTopics) {\n if (\n !payload.topic ||\n !filters.includedTopics.includes(payload.topic)\n ) {\n continue;\n }\n }\n }\n result.push(processor);\n }\n\n return result;\n };\n\n const processOptions = async (\n opts: NotificationSendOptions,\n origin: string,\n ): Promise<NotificationSendOptions> => {\n const filtered = await filterProcessors({ ...opts, origin, user: null });\n let ret = opts;\n for (const processor of filtered) {\n try {\n ret = processor.processOptions\n ? await processor.processOptions(ret)\n : ret;\n } catch (e) {\n logger.error(\n `Error while processing notification options with ${processor.getName()}: ${e}`,\n );\n }\n }\n return ret;\n };\n\n const preProcessNotification = async (\n notification: Notification,\n opts: NotificationSendOptions,\n ) => {\n const filtered = await filterProcessors(notification);\n let ret = notification;\n for (const processor of filtered) {\n try {\n ret = processor.preProcess\n ? await processor.preProcess(ret, opts)\n : ret;\n } catch (e) {\n logger.error(\n `Error while pre processing notification with ${processor.getName()}: ${e}`,\n );\n }\n }\n return ret;\n };\n\n const postProcessNotification = async (\n notification: Notification,\n opts: NotificationSendOptions,\n ) => {\n const filtered = await filterProcessors(notification);\n for (const processor of filtered) {\n if (!processor.postProcess) {\n continue;\n }\n\n try {\n await processor.postProcess(notification, opts);\n } catch (e) {\n logger.error(\n `Error while post processing notification with ${processor.getName()}: ${e}`,\n );\n }\n }\n };\n\n const validateLink = (link: string) => {\n const stripLeadingSlash = (s: string) => s.replace(/^\\//, '');\n const ensureTrailingSlash = (s: string) => s.replace(/\\/?$/, '/');\n const url = new URL(\n stripLeadingSlash(link),\n ensureTrailingSlash(frontendBaseUrl),\n );\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error('Only HTTP/HTTPS links are allowed');\n }\n };\n\n const appendCommonOptions = (\n req: Request,\n opts: NotificationGetOptions | TopicGetOptions,\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\n if (req.query.saved === 'true') {\n opts.saved = true;\n } else if (req.query.saved === 'false') {\n opts.saved = false;\n // or keep undefined\n }\n if (req.query.createdAfter) {\n const sinceEpoch = Date.parse(String(req.query.createdAfter));\n if (isNaN(sinceEpoch)) {\n throw new InputError('Unexpected date format');\n }\n opts.createdAfter = new Date(sinceEpoch);\n }\n if (req.query.minimumSeverity) {\n opts.minimumSeverity = normalizeSeverity(\n req.query.minimumSeverity.toString(),\n );\n }\n };\n\n // TODO: Move to use OpenAPI router instead\n const router = Router();\n router.use(express.json());\n\n const listNotificationsHandler = async (req: Request, res: Response) => {\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.orderField) {\n opts.orderField = parseEntityOrderFieldParams(req.query);\n }\n\n if (req.query.topic) {\n opts.topic = req.query.topic.toString();\n }\n\n appendCommonOptions(req, opts);\n\n const [notifications, totalCount] = await Promise.all([\n store.getNotifications(opts),\n store.getNotificationsCount(opts),\n ]);\n res.json({\n totalCount,\n notifications,\n });\n };\n\n router.get('/', listNotificationsHandler); // Deprecated endpoint\n router.get('/notifications', listNotificationsHandler);\n\n router.get('/status', async (req: Request<any, NotificationStatus>, res) => {\n const user = await getUser(req);\n const status = await store.getStatus({ user });\n res.json(status);\n });\n\n router.get(\n '/settings',\n async (req: Request<any, NotificationSettings>, res) => {\n const user = await getUser(req);\n const response = await getNotificationSettings(user);\n res.json(response);\n },\n );\n\n router.post(\n '/settings',\n async (\n req: Request<any, NotificationSettings, NotificationSettings>,\n res,\n ) => {\n const user = await getUser(req);\n const channels = getNotificationChannels();\n const settings: NotificationSettings = req.body;\n if (settings.channels.some(c => !channels.includes(c.id))) {\n throw new InputError('Invalid channel');\n }\n await store.saveNotificationSettings({ user, settings });\n const response = await getNotificationSettings(user);\n res.json(response);\n },\n );\n\n const getNotificationHandler = async (req: Request, res: Response) => {\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 throw new NotFoundError('Not found');\n }\n res.json(notifications[0]);\n };\n\n // Get topics\n const listTopicsHandler = async (req: Request, res: Response) => {\n const user = await getUser(req);\n const opts: TopicGetOptions = {\n user: user,\n };\n\n appendCommonOptions(req, opts);\n\n const topics = await store.getTopics(opts);\n res.json(topics);\n };\n\n router.get('/topics', listTopicsHandler);\n\n // Make sure this is the last \"GET\" handler\n router.get('/:id', getNotificationHandler); // Deprecated endpoint\n router.get('/notifications/:id', getNotificationHandler);\n\n const updateNotificationsHandler = async (req: Request, res: Response) => {\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 (signals) {\n await signals.publish<NotificationReadSignal>({\n recipients: { type: 'user', entityRef: [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 (signals) {\n await signals.publish<NotificationReadSignal>({\n recipients: { type: 'user', entityRef: [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.json(notifications);\n };\n\n router.post('/update', updateNotificationsHandler); // Deprecated endpoint\n router.post('/notifications/update', updateNotificationsHandler);\n\n const sendBroadcastNotification = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n opts: NotificationSendOptions,\n origin: string,\n ) => {\n const { scope } = opts.payload;\n const broadcastNotification = {\n ...baseNotification,\n user: null,\n id: uuid(),\n };\n const notification = await preProcessNotification(\n broadcastNotification,\n opts,\n );\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeBroadcast({\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: { ...notification, user: '' },\n });\n ret = restored ?? notification;\n } else {\n await store.saveBroadcast(notification);\n }\n\n if (signals) {\n await signals.publish<NewNotificationSignal>({\n recipients: { type: 'broadcast' },\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n postProcessNotification(ret, opts);\n return notification;\n };\n\n const sendUserNotification = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n user: string,\n opts: NotificationSendOptions,\n origin: string,\n scope?: string,\n ): Promise<Notification | undefined> => {\n const userNotification = {\n ...baseNotification,\n id: uuid(),\n user,\n };\n const notification = await preProcessNotification(userNotification, opts);\n\n const enabled = await isNotificationsEnabled({\n user,\n channel: WEB_NOTIFICATION_CHANNEL,\n origin: userNotification.origin,\n topic: userNotification.payload.topic ?? null,\n });\n\n let ret = notification;\n\n if (!enabled) {\n postProcessNotification(ret, opts);\n return undefined;\n }\n\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeNotification({\n user,\n scope,\n origin,\n });\n }\n\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 if (signals) {\n await signals.publish<NewNotificationSignal>({\n recipients: { type: 'user', entityRef: [user] },\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n postProcessNotification(ret, opts);\n return ret;\n };\n\n const filterNonUserEntityRefs = (refs: string[]): string[] => {\n return refs.filter(ref => {\n try {\n const parsed = parseEntityRef(ref);\n return parsed.kind.toLowerCase() === 'user';\n } catch {\n return false;\n }\n });\n };\n\n const sendUserNotifications = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n users: string[],\n opts: NotificationSendOptions,\n origin: string,\n ): Promise<Notification[]> => {\n const { scope } = opts.payload;\n const uniqueUsers = [...new Set(filterNonUserEntityRefs(users))];\n const throttled = throttle((user: string) =>\n sendUserNotification(baseNotification, user, opts, origin, scope),\n );\n const sent = await Promise.all(uniqueUsers.map(user => throttled(user)));\n return sent.filter(n => n !== undefined);\n };\n\n const createNotificationHandler = async (\n req: Request<any, Notification[], NotificationSendOptions>,\n res: Response,\n ) => {\n const credentials = await httpAuth.credentials(req, {\n allow: ['service'],\n });\n\n const origin = credentials.principal.subject;\n const opts = await processOptions(req.body, origin);\n const { recipients, payload } = opts;\n const { title, link } = payload;\n const notifications: Notification[] = [];\n\n if (!recipients || !title) {\n const missing = [\n !title ? 'title' : null,\n !recipients ? 'recipients' : null,\n ].filter(Boolean);\n const err = `Invalid notification request received: missing ${missing.join(\n ', ',\n )}`;\n throw new InputError(err);\n }\n\n if (link) {\n try {\n validateLink(link);\n } catch (e) {\n throw new InputError('Invalid link provided', e);\n }\n }\n\n const baseNotification = {\n payload: {\n ...payload,\n severity: payload.severity ?? 'normal',\n },\n origin,\n created: new Date(),\n };\n\n if (recipients.type === 'broadcast') {\n const broadcast = await sendBroadcastNotification(\n baseNotification,\n opts,\n origin,\n );\n notifications.push(broadcast);\n } else if (recipients.type === 'entity') {\n const entityRefs = [recipients.entityRef].flat();\n const excludedEntityRefs = recipients.excludeEntityRef\n ? [recipients.excludeEntityRef].flat()\n : undefined;\n try {\n const { userEntityRefs } =\n await usedRecipientResolver.resolveNotificationRecipients({\n entityRefs,\n excludedEntityRefs,\n });\n const userNotifications = await sendUserNotifications(\n baseNotification,\n userEntityRefs,\n opts,\n origin,\n );\n notifications.push(...userNotifications);\n } catch (e) {\n throw new InputError('Failed to send user notifications', e);\n }\n } else {\n throw new InputError(\n `Invalid recipients type, please use either 'broadcast' or 'entity'`,\n );\n }\n\n res.json(notifications);\n };\n\n // Add new notification\n router.post('/', createNotificationHandler);\n router.post('/notifications', createNotificationHandler);\n\n return router;\n}\n"],"names":["config","durationToMilliseconds","readDurationFromConfig","pThrottle","DefaultNotificationRecipientResolver","isNotificationsEnabledFor","notificationSeverities","InputError","normalizeSeverity","Router","express","parseEntityOrderFieldParams","NotFoundError","uuid","parseEntityRef"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 */\n\nimport express, { Request } from 'express';\nimport { createOpenApiRouter, EndpointMap } from '../schema/openapi';\nimport { internal as openapi } from '@backstage/backend-openapi-utils';\nimport {\n normalizeSeverity,\n NotificationGetOptions,\n NotificationsStore,\n TopicGetOptions,\n} from '../database';\nimport { randomUUID as uuid } from 'node:crypto';\nimport { CatalogService } from '@backstage/plugin-catalog-node';\nimport {\n NotificationProcessor,\n NotificationRecipientResolver,\n NotificationSendOptions,\n} from '@backstage/plugin-notifications-node';\nimport { InputError, NotFoundError } from '@backstage/errors';\nimport {\n AuthService,\n HttpAuthService,\n LoggerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport {\n ChannelSetting,\n isNotificationsEnabledFor,\n NewNotificationSignal,\n Notification,\n NotificationReadSignal,\n NotificationSettings,\n notificationSeverities,\n OriginSetting,\n} from '@backstage/plugin-notifications-common';\nimport { parseEntityOrderFieldParams } from './parseEntityOrderFieldParams';\nimport { Config, readDurationFromConfig } from '@backstage/config';\nimport { durationToMilliseconds } from '@backstage/types';\nimport pThrottle from 'p-throttle';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { DefaultNotificationRecipientResolver } from './DefaultNotificationRecipientResolver.ts';\n\n/** @internal */\nexport interface RouterOptions {\n logger: LoggerService;\n config: Config;\n store: NotificationsStore;\n auth: AuthService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n signals?: SignalsService;\n catalog: CatalogService;\n processors?: NotificationProcessor[];\n recipientResolver?: NotificationRecipientResolver;\n}\n\n/** @internal */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n config,\n logger,\n store,\n auth,\n httpAuth,\n userInfo,\n catalog,\n processors = [],\n signals,\n recipientResolver,\n } = options;\n\n const WEB_NOTIFICATION_CHANNEL = 'Web';\n const frontendBaseUrl = config.getString('app.baseUrl');\n const concurrencyLimit =\n config.getOptionalNumber('notifications.concurrencyLimit') ?? 10;\n const throttleInterval = config.has('notifications.throttleInterval')\n ? durationToMilliseconds(\n readDurationFromConfig(config, {\n key: 'notifications.throttleInterval',\n }),\n )\n : 50;\n const throttle = pThrottle({\n limit: concurrencyLimit,\n interval: throttleInterval,\n });\n const defaultNotificationSettings: NotificationSettings | undefined =\n config.getOptional<NotificationSettings>('notifications.defaultSettings');\n\n const usedRecipientResolver =\n recipientResolver ??\n new DefaultNotificationRecipientResolver(auth, catalog);\n\n const getUser = async (req: Request<any, any, any, any, any>) => {\n const credentials = await httpAuth.credentials(req, { allow: ['user'] });\n const info = await userInfo.getUserInfo(credentials);\n return info.userEntityRef;\n };\n\n const getNotificationChannels = () => {\n return [WEB_NOTIFICATION_CHANNEL, ...processors.map(p => p.getName())];\n };\n\n const getTopicSettings = (\n topic: any,\n existingOrigin: OriginSetting | undefined,\n defaultOriginSettings: OriginSetting | undefined,\n channelDefaultEnabled: boolean,\n ) => {\n const existingTopic = existingOrigin?.topics?.find(\n t => t.id.toLowerCase() === topic.topic.toLowerCase(),\n );\n const defaultTopicSettings = defaultOriginSettings?.topics?.find(\n t => t.id.toLowerCase() === topic.topic.toLowerCase(),\n );\n\n // If topic has explicit setting, use it\n // Otherwise check default topic settings from config\n // Otherwise use channel default (not origin enabled state)\n return {\n id: topic.topic,\n enabled: existingTopic\n ? existingTopic.enabled\n : defaultTopicSettings?.enabled ?? channelDefaultEnabled,\n };\n };\n\n const getOriginSettings = (\n originId: string,\n existingChannel: ChannelSetting | undefined,\n defaultChannelSettings: ChannelSetting | undefined,\n topics: { origin: string; topic: string }[],\n channelDefaultEnabled: boolean,\n channelHasExplicitEnabled: boolean,\n ) => {\n const existingOrigin = existingChannel?.origins?.find(\n o => o.id.toLowerCase() === originId.toLowerCase(),\n );\n\n const defaultOriginSettings = defaultChannelSettings?.origins?.find(\n c => c.id.toLowerCase() === originId.toLowerCase(),\n );\n\n const defaultEnabled = existingOrigin\n ? existingOrigin.enabled\n : defaultOriginSettings?.enabled ?? channelDefaultEnabled;\n\n return {\n id: originId,\n enabled: defaultEnabled,\n topics: topics\n .filter(t => t.origin === originId)\n .map(t =>\n getTopicSettings(\n t,\n existingOrigin,\n defaultOriginSettings,\n channelHasExplicitEnabled ? channelDefaultEnabled : defaultEnabled,\n ),\n ),\n };\n };\n\n const getChannelSettings = (\n channelId: string,\n settings: NotificationSettings,\n origins: string[],\n topics: { origin: string; topic: string }[],\n ) => {\n const existingChannel = settings.channels.find(\n c => c.id.toLowerCase() === channelId.toLowerCase(),\n );\n const defaultChannelSettings = defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === channelId.toLowerCase(),\n );\n\n // Determine channel enabled state\n const channelEnabled =\n existingChannel?.enabled ?? defaultChannelSettings?.enabled;\n\n // Use channel's enabled flag as the default for origins if not explicitly set\n const defaultEnabledForOrigins = channelEnabled ?? true;\n\n // Check if channel has explicit enabled flag (either from user settings or config)\n const channelHasExplicitEnabled =\n existingChannel?.enabled !== undefined ||\n defaultChannelSettings?.enabled !== undefined;\n\n return {\n id: channelId,\n enabled: channelEnabled,\n origins: origins.map(originId =>\n getOriginSettings(\n originId,\n existingChannel,\n defaultChannelSettings,\n topics,\n defaultEnabledForOrigins,\n channelHasExplicitEnabled,\n ),\n ),\n };\n };\n\n const getNotificationSettings = async (\n user: string,\n ): Promise<NotificationSettings> => {\n const { origins } = await store.getUserNotificationOrigins({ user });\n const { topics } = await store.getUserNotificationTopics({ user });\n const settings = await store.getNotificationSettings({ user });\n const channels = getNotificationChannels();\n\n // Merge existing channels/origins/topics with configured settings\n for (const channel of defaultNotificationSettings?.channels ?? []) {\n if (!channels.includes(channel.id)) {\n channels.push(channel.id);\n }\n\n for (const origin of channel.origins ?? []) {\n if (!origins.includes(origin.id)) {\n origins.push(origin.id);\n }\n\n for (const topic of origin.topics ?? []) {\n if (\n !topics.some(t => t.origin === origin.id && t.topic === topic.id)\n ) {\n topics.push({ origin: origin.id, topic: topic.id });\n }\n }\n }\n }\n\n return {\n channels: channels.map(channelId =>\n getChannelSettings(channelId, settings, origins, topics),\n ),\n };\n };\n\n const isNotificationsEnabled = async (opts: {\n user: string;\n channel: string;\n origin: string;\n topic: string | null;\n }) => {\n // Get user's explicit settings from database\n const userSettings = await store.getNotificationSettings({\n user: opts.user,\n });\n\n // Build a minimal settings object with user settings and config defaults\n const settings: NotificationSettings = {\n channels: [\n {\n id: opts.channel,\n enabled: defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n )?.enabled,\n origins: [],\n },\n ],\n };\n\n // Add user's channel if it exists\n const userChannel = userSettings.channels.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n );\n if (userChannel) {\n settings.channels[0] = {\n ...settings.channels[0],\n enabled: userChannel.enabled ?? settings.channels[0].enabled,\n origins: userChannel.origins ?? [],\n };\n }\n\n // Add config default origins if not in user settings\n // Only add origins if the channel is enabled (not explicitly disabled)\n const defaultChannelSettings = defaultNotificationSettings?.channels?.find(\n c => c.id.toLowerCase() === opts.channel.toLowerCase(),\n );\n if (\n defaultChannelSettings?.origins &&\n settings.channels[0].enabled !== false\n ) {\n for (const defaultOrigin of defaultChannelSettings.origins) {\n if (\n !settings.channels[0].origins.some(\n o => o.id.toLowerCase() === defaultOrigin.id.toLowerCase(),\n )\n ) {\n settings.channels[0].origins.push(defaultOrigin);\n }\n }\n }\n\n return isNotificationsEnabledFor(\n settings,\n opts.channel,\n opts.origin,\n opts.topic,\n );\n };\n\n const filterProcessors = async (\n notification:\n | Notification\n | ({ origin: string; user: null } & NotificationSendOptions),\n ) => {\n const result: NotificationProcessor[] = [];\n const { payload, user, origin } = notification;\n\n for (const processor of processors) {\n if (user) {\n const enabled = await isNotificationsEnabled({\n user,\n origin,\n channel: processor.getName(),\n topic: payload.topic ?? null,\n });\n if (!enabled) {\n continue;\n }\n }\n\n if (processor.getNotificationFilters) {\n const filters = processor.getNotificationFilters();\n if (filters.minSeverity) {\n if (\n notificationSeverities.indexOf(payload.severity ?? 'normal') >\n notificationSeverities.indexOf(filters.minSeverity)\n ) {\n continue;\n }\n }\n\n if (filters.maxSeverity) {\n if (\n notificationSeverities.indexOf(payload.severity ?? 'normal') <\n notificationSeverities.indexOf(filters.maxSeverity)\n ) {\n continue;\n }\n }\n\n if (filters.excludedTopics && payload.topic) {\n if (filters.excludedTopics.includes(payload.topic)) {\n continue;\n }\n }\n\n if (filters.includedTopics) {\n if (\n !payload.topic ||\n !filters.includedTopics.includes(payload.topic)\n ) {\n continue;\n }\n }\n }\n result.push(processor);\n }\n\n return result;\n };\n\n const processOptions = async (\n opts: NotificationSendOptions,\n origin: string,\n ): Promise<NotificationSendOptions> => {\n const filtered = await filterProcessors({ ...opts, origin, user: null });\n let ret = opts;\n for (const processor of filtered) {\n try {\n ret = processor.processOptions\n ? await processor.processOptions(ret)\n : ret;\n } catch (e) {\n logger.error(\n `Error while processing notification options with ${processor.getName()}: ${e}`,\n );\n }\n }\n return ret;\n };\n\n const preProcessNotification = async (\n notification: Notification,\n opts: NotificationSendOptions,\n ) => {\n const filtered = await filterProcessors(notification);\n let ret = notification;\n for (const processor of filtered) {\n try {\n ret = processor.preProcess\n ? await processor.preProcess(ret, opts)\n : ret;\n } catch (e) {\n logger.error(\n `Error while pre processing notification with ${processor.getName()}: ${e}`,\n );\n }\n }\n return ret;\n };\n\n const postProcessNotification = async (\n notification: Notification,\n opts: NotificationSendOptions,\n ) => {\n const filtered = await filterProcessors(notification);\n for (const processor of filtered) {\n if (!processor.postProcess) {\n continue;\n }\n\n try {\n await processor.postProcess(notification, opts);\n } catch (e) {\n logger.error(\n `Error while post processing notification with ${processor.getName()}: ${e}`,\n );\n }\n }\n };\n\n const validateLink = (link: string) => {\n const stripLeadingSlash = (s: string) => s.replace(/^\\//, '');\n const ensureTrailingSlash = (s: string) => s.replace(/\\/?$/, '/');\n const url = new URL(\n stripLeadingSlash(link),\n ensureTrailingSlash(frontendBaseUrl),\n );\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error('Only HTTP/HTTPS links are allowed');\n }\n };\n\n const appendCommonOptions = (\n req: {\n query: openapi.StaticQueryParamsSchema<EndpointMap, '/topics', 'get'>;\n },\n opts: NotificationGetOptions | TopicGetOptions,\n ) => {\n if (req.query.search) {\n opts.search = req.query.search;\n }\n if (req.query.read === 'true') {\n opts.read = true;\n } else if (req.query.read === 'false') {\n opts.read = false;\n }\n\n if (req.query.saved === 'true') {\n opts.saved = true;\n } else if (req.query.saved === 'false') {\n opts.saved = false;\n }\n if (req.query.createdAfter) {\n const sinceEpoch = Date.parse(req.query.createdAfter);\n if (isNaN(sinceEpoch)) {\n throw new InputError('Unexpected date format');\n }\n opts.createdAfter = new Date(sinceEpoch);\n }\n if (req.query.minimumSeverity) {\n opts.minimumSeverity = normalizeSeverity(req.query.minimumSeverity);\n }\n };\n\n const router = await createOpenApiRouter();\n\n const listNotificationsHandler: openapi.EndpointMapRequestHandler<\n EndpointMap,\n '/notifications',\n 'get'\n > = async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = { user };\n if (req.query.offset !== undefined) {\n opts.offset = req.query.offset;\n }\n if (req.query.limit !== undefined) {\n opts.limit = req.query.limit;\n }\n if (req.query.orderField !== undefined) {\n opts.orderField = parseEntityOrderFieldParams({\n orderField: req.query.orderField,\n });\n }\n if (req.query.topic) {\n opts.topic = req.query.topic;\n }\n appendCommonOptions(req, opts);\n\n const [notifications, totalCount] = await Promise.all([\n store.getNotifications(opts),\n store.getNotificationsCount(opts),\n ]);\n res.json({ totalCount, notifications });\n };\n\n router.get('/', listNotificationsHandler); // Deprecated alias of /notifications\n router.get('/notifications', listNotificationsHandler);\n\n router.get('/status', async (req, res) => {\n const user = await getUser(req);\n const status = await store.getStatus({ user });\n res.json(status);\n });\n\n router.get('/settings', async (req, res) => {\n const user = await getUser(req);\n const response = await getNotificationSettings(user);\n res.json(response);\n });\n\n router.post('/settings', async (req, res) => {\n const user = await getUser(req);\n const channels = getNotificationChannels();\n const settings: NotificationSettings = req.body;\n if (settings.channels.some(c => !channels.includes(c.id))) {\n throw new InputError('Invalid channel');\n }\n await store.saveNotificationSettings({ user, settings });\n const response = await getNotificationSettings(user);\n res.json(response);\n });\n\n router.get('/topics', async (req, res) => {\n const user = await getUser(req);\n const opts: TopicGetOptions = { user };\n appendCommonOptions(req, opts);\n const topics = await store.getTopics(opts);\n res.json(topics);\n });\n\n const getNotificationHandler: openapi.EndpointMapRequestHandler<\n EndpointMap,\n '/notifications/{id}',\n 'get'\n > = async (req, res) => {\n const user = await getUser(req);\n const opts: NotificationGetOptions = {\n user,\n limit: 1,\n ids: [req.params.id],\n };\n const notifications = await store.getNotifications(opts);\n if (notifications.length !== 1) {\n throw new NotFoundError('Not found');\n }\n res.json(notifications[0]);\n };\n\n // Make sure this is the last \"GET\" handler.\n router.get('/:id', getNotificationHandler); // Deprecated alias of /notifications/:id\n router.get('/notifications/:id', getNotificationHandler);\n\n const updateNotificationsHandler: openapi.EndpointMapRequestHandler<\n EndpointMap,\n '/notifications/update',\n 'post'\n > = async (req, res) => {\n const user = await getUser(req);\n const { ids, read, saved } = req.body;\n\n if (read === true) {\n await store.markRead({ user, ids });\n\n if (signals) {\n await signals.publish<NotificationReadSignal>({\n recipients: { type: 'user', entityRef: [user] },\n message: { action: 'notification_read', notification_ids: ids },\n channel: 'notifications',\n });\n }\n } else if (read === false) {\n await store.markUnread({ user, ids });\n\n if (signals) {\n await signals.publish<NotificationReadSignal>({\n recipients: { type: 'user', entityRef: [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, ids });\n } else if (saved === false) {\n await store.markUnsaved({ user, ids });\n }\n\n const notifications = await store.getNotifications({ ids, user });\n res.json(notifications);\n };\n\n router.post('/update', updateNotificationsHandler); // Deprecated alias of /notifications/update\n router.post('/notifications/update', updateNotificationsHandler);\n\n const sendBroadcastNotification = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n opts: NotificationSendOptions,\n origin: string,\n ) => {\n const { scope } = opts.payload;\n const broadcastNotification = {\n ...baseNotification,\n user: null,\n id: uuid(),\n };\n const notification = await preProcessNotification(\n broadcastNotification,\n opts,\n );\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeBroadcast({\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: { ...notification, user: '' },\n });\n ret = restored ?? notification;\n } else {\n await store.saveBroadcast(notification);\n }\n\n if (signals) {\n await signals.publish<NewNotificationSignal>({\n recipients: { type: 'broadcast' },\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n postProcessNotification(ret, opts);\n return notification;\n };\n\n const sendUserNotification = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n user: string,\n opts: NotificationSendOptions,\n origin: string,\n scope?: string,\n ): Promise<Notification | undefined> => {\n const userNotification = {\n ...baseNotification,\n id: uuid(),\n user,\n };\n const notification = await preProcessNotification(userNotification, opts);\n\n const enabled = await isNotificationsEnabled({\n user,\n channel: WEB_NOTIFICATION_CHANNEL,\n origin: userNotification.origin,\n topic: userNotification.payload.topic ?? null,\n });\n\n let ret = notification;\n\n if (!enabled) {\n postProcessNotification(ret, opts);\n return undefined;\n }\n\n let existingNotification;\n if (scope) {\n existingNotification = await store.getExistingScopeNotification({\n user,\n scope,\n origin,\n });\n }\n\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 if (signals) {\n await signals.publish<NewNotificationSignal>({\n recipients: { type: 'user', entityRef: [user] },\n message: {\n action: 'new_notification',\n notification_id: ret.id,\n },\n channel: 'notifications',\n });\n }\n postProcessNotification(ret, opts);\n return ret;\n };\n\n const filterNonUserEntityRefs = (refs: string[]): string[] => {\n return refs.filter(ref => {\n try {\n const parsed = parseEntityRef(ref);\n return parsed.kind.toLowerCase() === 'user';\n } catch {\n return false;\n }\n });\n };\n\n const sendUserNotifications = async (\n baseNotification: Omit<Notification, 'user' | 'id'>,\n users: string[],\n opts: NotificationSendOptions,\n origin: string,\n ): Promise<Notification[]> => {\n const { scope } = opts.payload;\n const uniqueUsers = [...new Set(filterNonUserEntityRefs(users))];\n const throttled = throttle((user: string) =>\n sendUserNotification(baseNotification, user, opts, origin, scope),\n );\n const sent = await Promise.all(uniqueUsers.map(user => throttled(user)));\n return sent.filter(n => n !== undefined);\n };\n\n const createNotificationsHandler: openapi.EndpointMapRequestHandler<\n EndpointMap,\n '/notifications',\n 'post'\n > = async (req, res) => {\n const credentials = await httpAuth.credentials(req, {\n allow: ['service'],\n });\n\n const origin = credentials.principal.subject;\n const opts = await processOptions(req.body, origin);\n const { recipients, payload } = opts;\n const { title, link } = payload;\n const notifications: Notification[] = [];\n\n if (!recipients || !title) {\n const missing = [\n !title ? 'title' : null,\n !recipients ? 'recipients' : null,\n ].filter(Boolean);\n const err = `Invalid notification request received: missing ${missing.join(\n ', ',\n )}`;\n throw new InputError(err);\n }\n\n if (link) {\n try {\n validateLink(link);\n } catch (e) {\n throw new InputError('Invalid link provided', e);\n }\n }\n\n const baseNotification = {\n payload: {\n ...payload,\n severity: payload.severity ?? 'normal',\n },\n origin,\n created: new Date(),\n };\n\n if (recipients.type === 'broadcast') {\n const broadcast = await sendBroadcastNotification(\n baseNotification,\n opts,\n origin,\n );\n notifications.push(broadcast);\n } else if (recipients.type === 'entity') {\n const entityRefs = [recipients.entityRef].flat();\n const excludedEntityRefs = recipients.excludeEntityRef\n ? [recipients.excludeEntityRef].flat()\n : undefined;\n try {\n const { userEntityRefs } =\n await usedRecipientResolver.resolveNotificationRecipients({\n entityRefs,\n excludedEntityRefs,\n });\n const userNotifications = await sendUserNotifications(\n baseNotification,\n userEntityRefs,\n opts,\n origin,\n );\n notifications.push(...userNotifications);\n } catch (e) {\n throw new InputError('Failed to send user notifications', e);\n }\n } else {\n throw new InputError(\n `Invalid recipients type, please use either 'broadcast' or 'entity'`,\n );\n }\n\n res.json(notifications);\n };\n\n // Add new notification\n router.post('/', createNotificationsHandler); // Deprecated alias of /notifications\n router.post('/notifications', createNotificationsHandler);\n\n return router;\n}\n"],"names":["config","durationToMilliseconds","readDurationFromConfig","pThrottle","DefaultNotificationRecipientResolver","isNotificationsEnabledFor","notificationSeverities","InputError","normalizeSeverity","router","createOpenApiRouter","parseEntityOrderFieldParams","NotFoundError","uuid","parseEntityRef"],"mappings":";;;;;;;;;;;;;;;;;;AAwEA,eAAsB,aACpB,OAAA,EACyB;AACzB,EAAA,MAAM;AAAA,YACJA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAa,EAAC;AAAA,IACd,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,wBAAA,GAA2B,KAAA;AACjC,EAAA,MAAM,eAAA,GAAkBA,QAAA,CAAO,SAAA,CAAU,aAAa,CAAA;AACtD,EAAA,MAAM,gBAAA,GACJA,QAAA,CAAO,iBAAA,CAAkB,gCAAgC,CAAA,IAAK,EAAA;AAChE,EAAA,MAAM,gBAAA,GAAmBA,QAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA,GAChEC,4BAAA;AAAA,IACEC,8BAAuBF,QAAA,EAAQ;AAAA,MAC7B,GAAA,EAAK;AAAA,KACN;AAAA,GACH,GACA,EAAA;AACJ,EAAA,MAAM,WAAWG,0BAAA,CAAU;AAAA,IACzB,KAAA,EAAO,gBAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,2BAAA,GACJH,QAAA,CAAO,WAAA,CAAkC,+BAA+B,CAAA;AAE1E,EAAA,MAAM,qBAAA,GACJ,iBAAA,IACA,IAAII,yEAAA,CAAqC,MAAM,OAAO,CAAA;AAExD,EAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAA0C;AAC/D,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK,EAAE,KAAA,EAAO,CAAC,MAAM,CAAA,EAAG,CAAA;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,WAAA,CAAY,WAAW,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,0BAA0B,MAAM;AACpC,IAAA,OAAO,CAAC,0BAA0B,GAAG,UAAA,CAAW,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA;AAAA,EACvE,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CACvB,KAAA,EACA,cAAA,EACA,uBACA,qBAAA,KACG;AACH,IAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,EAAQ,IAAA;AAAA,MAC5C,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,KAAA,CAAM,MAAM,WAAA;AAAY,KACtD;AACA,IAAA,MAAM,oBAAA,GAAuB,uBAAuB,MAAA,EAAQ,IAAA;AAAA,MAC1D,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,KAAA,CAAM,MAAM,WAAA;AAAY,KACtD;AAKA,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,KAAA;AAAA,MACV,OAAA,EAAS,aAAA,GACL,aAAA,CAAc,OAAA,GACd,sBAAsB,OAAA,IAAW;AAAA,KACvC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAoB,CACxB,QAAA,EACA,iBACA,sBAAA,EACA,MAAA,EACA,uBACA,yBAAA,KACG;AACH,IAAA,MAAM,cAAA,GAAiB,iBAAiB,OAAA,EAAS,IAAA;AAAA,MAC/C,OAAK,CAAA,CAAE,EAAA,CAAG,WAAA,EAAY,KAAM,SAAS,WAAA;AAAY,KACnD;AAEA,IAAA,MAAM,qBAAA,GAAwB,wBAAwB,OAAA,EAAS,IAAA;AAAA,MAC7D,OAAK,CAAA,CAAE,EAAA,CAAG,WAAA,EAAY,KAAM,SAAS,WAAA;AAAY,KACnD;AAEA,IAAA,MAAM,cAAA,GAAiB,cAAA,GACnB,cAAA,CAAe,OAAA,GACf,uBAAuB,OAAA,IAAW,qBAAA;AAEtC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,QAAA;AAAA,MACJ,OAAA,EAAS,cAAA;AAAA,MACT,QAAQ,MAAA,CACL,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,CACjC,GAAA;AAAA,QAAI,CAAA,CAAA,KACH,gBAAA;AAAA,UACE,CAAA;AAAA,UACA,cAAA;AAAA,UACA,qBAAA;AAAA,UACA,4BAA4B,qBAAA,GAAwB;AAAA;AACtD;AACF,KACJ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CACzB,SAAA,EACA,QAAA,EACA,SACA,MAAA,KACG;AACH,IAAA,MAAM,eAAA,GAAkB,SAAS,QAAA,CAAS,IAAA;AAAA,MACxC,OAAK,CAAA,CAAE,EAAA,CAAG,WAAA,EAAY,KAAM,UAAU,WAAA;AAAY,KACpD;AACA,IAAA,MAAM,sBAAA,GAAyB,6BAA6B,QAAA,EAAU,IAAA;AAAA,MACpE,OAAK,CAAA,CAAE,EAAA,CAAG,WAAA,EAAY,KAAM,UAAU,WAAA;AAAY,KACpD;AAGA,IAAA,MAAM,cAAA,GACJ,eAAA,EAAiB,OAAA,IAAW,sBAAA,EAAwB,OAAA;AAGtD,IAAA,MAAM,2BAA2B,cAAA,IAAkB,IAAA;AAGnD,IAAA,MAAM,yBAAA,GACJ,eAAA,EAAiB,OAAA,KAAY,MAAA,IAC7B,wBAAwB,OAAA,KAAY,MAAA;AAEtC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,SAAA;AAAA,MACJ,OAAA,EAAS,cAAA;AAAA,MACT,SAAS,OAAA,CAAQ,GAAA;AAAA,QAAI,CAAA,QAAA,KACnB,iBAAA;AAAA,UACE,QAAA;AAAA,UACA,eAAA;AAAA,UACA,sBAAA;AAAA,UACA,MAAA;AAAA,UACA,wBAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,OAC9B,IAAA,KACkC;AAClC,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAM,MAAM,0BAAA,CAA2B,EAAE,MAAM,CAAA;AACnE,IAAA,MAAM,EAAE,QAAO,GAAI,MAAM,MAAM,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACjE,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uBAAA,CAAwB,EAAE,MAAM,CAAA;AAC7D,IAAA,MAAM,WAAW,uBAAA,EAAwB;AAGzC,IAAA,KAAA,MAAW,OAAA,IAAW,2BAAA,EAA6B,QAAA,IAAY,EAAC,EAAG;AACjE,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,EAAG;AAClC,QAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,EAAE,CAAA;AAAA,MAC1B;AAEA,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG;AAC1C,QAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,QACxB;AAEA,QAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,UAAA,IACE,CAAC,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,EAAA,IAAM,CAAA,CAAE,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA,EAChE;AACA,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,IAAI,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,UAAU,QAAA,CAAS,GAAA;AAAA,QAAI,CAAA,SAAA,KACrB,kBAAA,CAAmB,SAAA,EAAW,QAAA,EAAU,SAAS,MAAM;AAAA;AACzD,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,OAAO,IAAA,KAKhC;AAEJ,IAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,uBAAA,CAAwB;AAAA,MACvD,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,QAAA,GAAiC;AAAA,MACrC,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAI,IAAA,CAAK,OAAA;AAAA,UACT,OAAA,EAAS,6BAA6B,QAAA,EAAU,IAAA;AAAA,YAC9C,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,IAAA,CAAK,QAAQ,WAAA;AAAY,WACvD,EAAG,OAAA;AAAA,UACH,SAAS;AAAC;AACZ;AACF,KACF;AAGA,IAAA,MAAM,WAAA,GAAc,aAAa,QAAA,CAAS,IAAA;AAAA,MACxC,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,IAAA,CAAK,QAAQ,WAAA;AAAY,KACvD;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,GAAI;AAAA,QACrB,GAAG,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA;AAAA,QACtB,SAAS,WAAA,CAAY,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA;AAAA,QACrD,OAAA,EAAS,WAAA,CAAY,OAAA,IAAW;AAAC,OACnC;AAAA,IACF;AAIA,IAAA,MAAM,sBAAA,GAAyB,6BAA6B,QAAA,EAAU,IAAA;AAAA,MACpE,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,IAAA,CAAK,QAAQ,WAAA;AAAY,KACvD;AACA,IAAA,IACE,wBAAwB,OAAA,IACxB,QAAA,CAAS,SAAS,CAAC,CAAA,CAAE,YAAY,KAAA,EACjC;AACA,MAAA,KAAA,MAAW,aAAA,IAAiB,uBAAuB,OAAA,EAAS;AAC1D,QAAA,IACE,CAAC,QAAA,CAAS,QAAA,CAAS,CAAC,EAAE,OAAA,CAAQ,IAAA;AAAA,UAC5B,OAAK,CAAA,CAAE,EAAA,CAAG,aAAY,KAAM,aAAA,CAAc,GAAG,WAAA;AAAY,SAC3D,EACA;AACA,UAAA,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAOC,mDAAA;AAAA,MACL,QAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,OACvB,YAAA,KAGG;AACH,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO,GAAI,YAAA;AAElC,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,OAAA,GAAU,MAAM,sBAAA,CAAuB;AAAA,UAC3C,IAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA,EAAS,UAAU,OAAA,EAAQ;AAAA,UAC3B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,SACzB,CAAA;AACD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,UAAU,sBAAA,EAAwB;AACpC,QAAA,MAAM,OAAA,GAAU,UAAU,sBAAA,EAAuB;AACjD,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,IACEC,gDAAA,CAAuB,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,QAAQ,IAC3DA,gDAAA,CAAuB,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAClD;AACA,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,IACEA,gDAAA,CAAuB,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,QAAQ,IAC3DA,gDAAA,CAAuB,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAClD;AACA,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,KAAA,EAAO;AAC3C,UAAA,IAAI,OAAA,CAAQ,cAAA,CAAe,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClD,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,UAAA,IACE,CAAC,QAAQ,KAAA,IACT,CAAC,QAAQ,cAAA,CAAe,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAC9C;AACA,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OACrB,IAAA,EACA,MAAA,KACqC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,CAAA;AACvE,IAAA,IAAI,GAAA,GAAM,IAAA;AACV,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,UAAU,cAAA,GACZ,MAAM,SAAA,CAAU,cAAA,CAAe,GAAG,CAAA,GAClC,GAAA;AAAA,MACN,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,KAAA;AAAA,UACL,CAAA,iDAAA,EAAoD,SAAA,CAAU,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,SAC/E;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,OAC7B,YAAA,EACA,IAAA,KACG;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,YAAY,CAAA;AACpD,IAAA,IAAI,GAAA,GAAM,YAAA;AACV,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,UAAU,UAAA,GACZ,MAAM,UAAU,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,GACpC,GAAA;AAAA,MACN,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,KAAA;AAAA,UACL,CAAA,6CAAA,EAAgD,SAAA,CAAU,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,SAC3E;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,OAC9B,YAAA,EACA,IAAA,KACG;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,YAAY,CAAA;AACpD,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAI,CAAC,UAAU,WAAA,EAAa;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,WAAA,CAAY,YAAA,EAAc,IAAI,CAAA;AAAA,MAChD,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,KAAA;AAAA,UACL,CAAA,8CAAA,EAAiD,SAAA,CAAU,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,SAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,IAAA,MAAM,oBAAoB,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC5D,IAAA,MAAM,sBAAsB,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAChE,IAAA,MAAM,MAAM,IAAI,GAAA;AAAA,MACd,kBAAkB,IAAI,CAAA;AAAA,MACtB,oBAAoB,eAAe;AAAA,KACrC;AACA,IAAA,IAAI,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,aAAa,OAAA,EAAS;AACzD,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAC1B,GAAA,EAGA,IAAA,KACG;AACH,IAAA,IAAI,GAAA,CAAI,MAAM,MAAA,EAAQ;AACpB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,MAAA;AAAA,IAC1B;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd,CAAA,MAAA,IAAW,GAAA,CAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AAAA,IACd;AAEA,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf,CAAA,MAAA,IAAW,GAAA,CAAI,KAAA,CAAM,KAAA,KAAU,OAAA,EAAS;AACtC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf;AACA,IAAA,IAAI,GAAA,CAAI,MAAM,YAAA,EAAc;AAC1B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,YAAY,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,QAAA,MAAM,IAAIC,kBAAW,wBAAwB,CAAA;AAAA,MAC/C;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,GAAA,CAAI,MAAM,eAAA,EAAiB;AAC7B,MAAA,IAAA,CAAK,eAAA,GAAkBC,4CAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,eAAe,CAAA;AAAA,IACpE;AAAA,EACF,CAAA;AAEA,EAAA,MAAMC,QAAA,GAAS,MAAMC,0BAAA,EAAoB;AAEzC,EAAA,MAAM,wBAAA,GAIF,OAAO,GAAA,EAAK,GAAA,KAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,IAAA,GAA+B,EAAE,IAAA,EAAK;AAC5C,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW;AAClC,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,MAAA;AAAA,IAC1B;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW;AACjC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,IACzB;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW;AACtC,MAAA,IAAA,CAAK,aAAaC,uDAAA,CAA4B;AAAA,QAC5C,UAAA,EAAY,IAAI,KAAA,CAAM;AAAA,OACvB,CAAA;AAAA,IACH;AACA,IAAA,IAAI,GAAA,CAAI,MAAM,KAAA,EAAO;AACnB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA;AAAA,IACzB;AACA,IAAA,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAE7B,IAAA,MAAM,CAAC,aAAA,EAAe,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,KAAA,CAAM,iBAAiB,IAAI,CAAA;AAAA,MAC3B,KAAA,CAAM,sBAAsB,IAAI;AAAA,KACjC,CAAA;AACD,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,UAAA,EAAY,aAAA,EAAe,CAAA;AAAA,EACxC,CAAA;AAEA,EAAAF,QAAA,CAAO,GAAA,CAAI,KAAK,wBAAwB,CAAA;AACxC,EAAAA,QAAA,CAAO,GAAA,CAAI,kBAAkB,wBAAwB,CAAA;AAErD,EAAAA,QAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,GAAA,EAAK,GAAA,KAAQ;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,SAAS,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,MAAM,CAAA;AAC7C,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAAA,QAAA,CAAO,GAAA,CAAI,WAAA,EAAa,OAAO,GAAA,EAAK,GAAA,KAAQ;AAC1C,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,IAAI,CAAA;AACnD,IAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EACnB,CAAC,CAAA;AAED,EAAAA,QAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,GAAA,EAAK,GAAA,KAAQ;AAC3C,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,WAAW,uBAAA,EAAwB;AACzC,IAAA,MAAM,WAAiC,GAAA,CAAI,IAAA;AAC3C,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,SAAS,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG;AACzD,MAAA,MAAM,IAAIF,kBAAW,iBAAiB,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,KAAA,CAAM,wBAAA,CAAyB,EAAE,IAAA,EAAM,UAAU,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,IAAI,CAAA;AACnD,IAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EACnB,CAAC,CAAA;AAED,EAAAE,QAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,GAAA,EAAK,GAAA,KAAQ;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAwB,EAAE,IAAA,EAAK;AACrC,IAAA,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,sBAAA,GAIF,OAAO,GAAA,EAAK,GAAA,KAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,IAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,GAAA,EAAK,CAAC,GAAA,CAAI,MAAA,CAAO,EAAE;AAAA,KACrB;AACA,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,gBAAA,CAAiB,IAAI,CAAA;AACvD,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAIG,qBAAc,WAAW,CAAA;AAAA,IACrC;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EAC3B,CAAA;AAGA,EAAAH,QAAA,CAAO,GAAA,CAAI,QAAQ,sBAAsB,CAAA;AACzC,EAAAA,QAAA,CAAO,GAAA,CAAI,sBAAsB,sBAAsB,CAAA;AAEvD,EAAA,MAAM,0BAAA,GAIF,OAAO,GAAA,EAAK,GAAA,KAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,KAAU,GAAA,CAAI,IAAA;AAEjC,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,KAAK,CAAA;AAElC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,QAAQ,OAAA,CAAgC;AAAA,UAC5C,YAAY,EAAE,IAAA,EAAM,QAAQ,SAAA,EAAW,CAAC,IAAI,CAAA,EAAE;AAAA,UAC9C,OAAA,EAAS,EAAE,MAAA,EAAQ,mBAAA,EAAqB,kBAAkB,GAAA,EAAI;AAAA,UAC9D,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,EAAE,IAAA,EAAM,KAAK,CAAA;AAEpC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,QAAQ,OAAA,CAAgC;AAAA,UAC5C,YAAY,EAAE,IAAA,EAAM,QAAQ,SAAA,EAAW,CAAC,IAAI,CAAA,EAAE;AAAA,UAC9C,OAAA,EAAS,EAAE,MAAA,EAAQ,qBAAA,EAAuB,kBAAkB,GAAA,EAAI;AAAA,UAChE,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAC1B,MAAA,MAAM,KAAA,CAAM,WAAA,CAAY,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,gBAAgB,MAAM,KAAA,CAAM,iBAAiB,EAAE,GAAA,EAAK,MAAM,CAAA;AAChE,IAAA,GAAA,CAAI,KAAK,aAAa,CAAA;AAAA,EACxB,CAAA;AAEA,EAAAA,QAAA,CAAO,IAAA,CAAK,WAAW,0BAA0B,CAAA;AACjD,EAAAA,QAAA,CAAO,IAAA,CAAK,yBAAyB,0BAA0B,CAAA;AAE/D,EAAA,MAAM,yBAAA,GAA4B,OAChC,gBAAA,EACA,IAAA,EACA,MAAA,KACG;AACH,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAA;AACvB,IAAA,MAAM,qBAAA,GAAwB;AAAA,MAC5B,GAAG,gBAAA;AAAA,MACH,IAAA,EAAM,IAAA;AAAA,MACN,IAAII,iBAAA;AAAK,KACX;AACA,IAAA,MAAM,eAAe,MAAM,sBAAA;AAAA,MACzB,qBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,oBAAA;AACJ,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,oBAAA,GAAuB,MAAM,MAAM,yBAAA,CAA0B;AAAA,QAC3D,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,GAAA,GAAM,YAAA;AACV,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,2BAAA,CAA4B;AAAA,QACvD,IAAI,oBAAA,CAAqB,EAAA;AAAA,QACzB,YAAA,EAAc,EAAE,GAAG,YAAA,EAAc,MAAM,EAAA;AAAG,OAC3C,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,YAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,CAAM,cAAc,YAAY,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAQ,OAAA,CAA+B;AAAA,QAC3C,UAAA,EAAY,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,QAChC,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,kBAAA;AAAA,UACR,iBAAiB,GAAA,CAAI;AAAA,SACvB;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,uBAAA,CAAwB,KAAK,IAAI,CAAA;AACjC,IAAA,OAAO,YAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,uBAAuB,OAC3B,gBAAA,EACA,IAAA,EACA,IAAA,EACA,QACA,KAAA,KACsC;AACtC,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,GAAG,gBAAA;AAAA,MACH,IAAIA,iBAAA,EAAK;AAAA,MACT;AAAA,KACF;AACA,IAAA,MAAM,YAAA,GAAe,MAAM,sBAAA,CAAuB,gBAAA,EAAkB,IAAI,CAAA;AAExE,IAAA,MAAM,OAAA,GAAU,MAAM,sBAAA,CAAuB;AAAA,MAC3C,IAAA;AAAA,MACA,OAAA,EAAS,wBAAA;AAAA,MACT,QAAQ,gBAAA,CAAiB,MAAA;AAAA,MACzB,KAAA,EAAO,gBAAA,CAAiB,OAAA,CAAQ,KAAA,IAAS;AAAA,KAC1C,CAAA;AAED,IAAA,IAAI,GAAA,GAAM,YAAA;AAEV,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,uBAAA,CAAwB,KAAK,IAAI,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,oBAAA;AACJ,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,oBAAA,GAAuB,MAAM,MAAM,4BAAA,CAA6B;AAAA,QAC9D,IAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,2BAAA,CAA4B;AAAA,QACvD,IAAI,oBAAA,CAAqB,EAAA;AAAA,QACzB;AAAA,OACD,CAAA;AACD,MAAA,GAAA,GAAM,QAAA,IAAY,YAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,CAAM,iBAAiB,YAAY,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAQ,OAAA,CAA+B;AAAA,QAC3C,YAAY,EAAE,IAAA,EAAM,QAAQ,SAAA,EAAW,CAAC,IAAI,CAAA,EAAE;AAAA,QAC9C,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,kBAAA;AAAA,UACR,iBAAiB,GAAA,CAAI;AAAA,SACvB;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,uBAAA,CAAwB,KAAK,IAAI,CAAA;AACjC,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,IAAA,KAA6B;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAO,CAAA,GAAA,KAAO;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAASC,4BAAe,GAAG,CAAA;AACjC,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAA,EAAY,KAAM,MAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,OAC5B,gBAAA,EACA,KAAA,EACA,MACA,MAAA,KAC4B;AAC5B,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,OAAA;AACvB,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,IAAI,uBAAA,CAAwB,KAAK,CAAC,CAAC,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,QAAA;AAAA,MAAS,CAAC,IAAA,KAC1B,oBAAA,CAAqB,kBAAkB,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAK;AAAA,KAClE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,IAAA,KAAQ,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,MAAS,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,0BAAA,GAIF,OAAO,GAAA,EAAK,GAAA,KAAQ;AACtB,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK;AAAA,MAClD,KAAA,EAAO,CAAC,SAAS;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,YAAY,SAAA,CAAU,OAAA;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,GAAA,CAAI,MAAM,MAAM,CAAA;AAClD,IAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,IAAA;AAChC,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,OAAA;AACxB,IAAA,MAAM,gBAAgC,EAAC;AAEvC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,KAAA,EAAO;AACzB,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,CAAC,QAAQ,OAAA,GAAU,IAAA;AAAA,QACnB,CAAC,aAAa,YAAA,GAAe;AAAA,OAC/B,CAAE,OAAO,OAAO,CAAA;AAChB,MAAA,MAAM,GAAA,GAAM,kDAAkD,OAAA,CAAQ,IAAA;AAAA,QACpE;AAAA,OACD,CAAA,CAAA;AACD,MAAA,MAAM,IAAIP,kBAAW,GAAG,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,IAAIA,iBAAA,CAAW,uBAAA,EAAyB,CAAC,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,OAAA,EAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,OAChC;AAAA,MACA,MAAA;AAAA,MACA,OAAA,sBAAa,IAAA;AAAK,KACpB;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,WAAA,EAAa;AACnC,MAAA,MAAM,YAAY,MAAM,yBAAA;AAAA,QACtB,gBAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,MAAM,UAAA,GAAa,CAAC,UAAA,CAAW,SAAS,EAAE,IAAA,EAAK;AAC/C,MAAA,MAAM,kBAAA,GAAqB,WAAW,gBAAA,GAClC,CAAC,WAAW,gBAAgB,CAAA,CAAE,MAAK,GACnC,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,cAAA,EAAe,GACrB,MAAM,sBAAsB,6BAAA,CAA8B;AAAA,UACxD,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AACH,QAAA,MAAM,oBAAoB,MAAM,qBAAA;AAAA,UAC9B,gBAAA;AAAA,UACA,cAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,aAAA,CAAc,IAAA,CAAK,GAAG,iBAAiB,CAAA;AAAA,MACzC,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,IAAIA,iBAAA,CAAW,mCAAA,EAAqC,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAIA,iBAAA;AAAA,QACR,CAAA,kEAAA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAK,aAAa,CAAA;AAAA,EACxB,CAAA;AAGA,EAAAE,QAAA,CAAO,IAAA,CAAK,KAAK,0BAA0B,CAAA;AAC3C,EAAAA,QAAA,CAAO,IAAA,CAAK,kBAAkB,0BAA0B,CAAA;AAExD,EAAA,OAAOA,QAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-notifications-backend",
3
- "version": "0.6.5-next.1",
3
+ "version": "0.6.6-next.0",
4
4
  "backstage": {
5
5
  "role": "backend-plugin",
6
6
  "pluginId": "notifications",
@@ -38,6 +38,7 @@
38
38
  "scripts": {
39
39
  "build": "backstage-cli package build",
40
40
  "clean": "backstage-cli package clean",
41
+ "generate": "backstage-repo-tools package schema openapi generate --server",
41
42
  "lint": "backstage-cli package lint",
42
43
  "prepack": "backstage-cli package prepack",
43
44
  "postpack": "backstage-cli package postpack",
@@ -45,14 +46,15 @@
45
46
  "test": "backstage-cli package test"
46
47
  },
47
48
  "dependencies": {
48
- "@backstage/backend-plugin-api": "1.9.1-next.0",
49
- "@backstage/catalog-model": "1.8.1-next.1",
50
- "@backstage/config": "1.3.8-next.0",
51
- "@backstage/errors": "1.3.1-next.0",
52
- "@backstage/plugin-catalog-node": "2.2.1-next.1",
53
- "@backstage/plugin-notifications-common": "0.2.3-next.0",
54
- "@backstage/plugin-notifications-node": "0.2.26-next.0",
55
- "@backstage/plugin-signals-node": "0.2.1-next.0",
49
+ "@backstage/backend-openapi-utils": "0.6.10-next.0",
50
+ "@backstage/backend-plugin-api": "1.9.2-next.0",
51
+ "@backstage/catalog-model": "1.9.0",
52
+ "@backstage/config": "1.3.8",
53
+ "@backstage/errors": "1.3.1",
54
+ "@backstage/plugin-catalog-node": "2.2.2-next.0",
55
+ "@backstage/plugin-notifications-common": "0.2.3",
56
+ "@backstage/plugin-notifications-node": "0.2.27-next.0",
57
+ "@backstage/plugin-signals-node": "0.2.2-next.0",
56
58
  "@backstage/types": "1.2.2",
57
59
  "express": "^4.22.0",
58
60
  "express-promise-router": "^4.1.0",
@@ -60,13 +62,14 @@
60
62
  "p-throttle": "^4.1.1"
61
63
  },
62
64
  "devDependencies": {
63
- "@backstage/backend-defaults": "0.17.1-next.1",
64
- "@backstage/backend-test-utils": "1.11.3-next.1",
65
- "@backstage/cli": "0.36.2-next.1",
66
- "@backstage/plugin-auth-backend": "0.28.1-next.1",
67
- "@backstage/plugin-auth-backend-module-guest-provider": "0.2.19-next.0",
68
- "@backstage/plugin-events-backend": "0.6.2-next.0",
69
- "@backstage/plugin-signals-backend": "0.3.15-next.1",
65
+ "@backstage/backend-defaults": "0.17.2-next.0",
66
+ "@backstage/backend-test-utils": "1.11.4-next.0",
67
+ "@backstage/cli": "0.36.3-next.0",
68
+ "@backstage/plugin-auth-backend": "0.29.1-next.0",
69
+ "@backstage/plugin-auth-backend-module-guest-provider": "0.2.20-next.0",
70
+ "@backstage/plugin-events-backend": "0.6.3-next.0",
71
+ "@backstage/plugin-signals-backend": "0.3.16-next.0",
72
+ "@backstage/repo-tools": "0.17.3-next.0",
70
73
  "@types/express": "^4.17.6",
71
74
  "@types/supertest": "^2.0.8",
72
75
  "supertest": "^7.0.0"