diff --git a/.changeset/curvy-tigers-cross.md b/.changeset/curvy-tigers-cross.md index 51b1c1ab66..1a55960f89 100644 --- a/.changeset/curvy-tigers-cross.md +++ b/.changeset/curvy-tigers-cross.md @@ -3,4 +3,4 @@ '@backstage/plugin-notifications': patch --- -all notifications can be marked and filtered by severity critical, high, normal or low, the default is 'normal' +All notifications can be marked and filtered by severity critical, high, normal or low, the default is 'normal' diff --git a/.changeset/hot-moles-lay.md b/.changeset/hot-moles-lay.md index 90adcbd07b..69a763ac16 100644 --- a/.changeset/hot-moles-lay.md +++ b/.changeset/hot-moles-lay.md @@ -2,4 +2,4 @@ '@backstage/plugin-airbrake': patch --- -added an optional ESLint rule - no-top-level-material-ui-4-imports - which has an auto fix function to migrate the imports and using it migrated the imports +Added an optional ESLint rule - no-top-level-material-ui-4-imports - which has an auto fix function to migrate the imports and using it migrated the imports. diff --git a/plugins/notifications-backend/migrations/20240302_numericSeverity.js b/plugins/notifications-backend/migrations/20240302_numericSeverity.js deleted file mode 100644 index 6f71fd49d9..0000000000 --- a/plugins/notifications-backend/migrations/20240302_numericSeverity.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -exports.up = async function up(knex) { - await knex.schema.alterTable('notification', table => { - table.tinyint('severity').notNullable().alter(); - // we do not need to migrate data since there are not real deployments so far - }); -}; - -exports.down = async function down(knex) { - await knex.schema.alterTable('notification', table => { - table.string('severity').nullable().alter(); - }); -}; diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts index f532f2873a..f6d5f35e1f 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.test.ts @@ -14,10 +14,7 @@ * limitations under the License. */ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; -import { - DatabaseNotificationsStore, - getNumericSeverity, -} from './DatabaseNotificationsStore'; +import { DatabaseNotificationsStore } from './DatabaseNotificationsStore'; import { Knex } from 'knex'; import { Notification, @@ -300,7 +297,7 @@ describe.each(databases.eachSupportedId())( it('normal', async () => { const normal = await storage.getNotifications({ user, - minimalSeverity: getNumericSeverity('normal'), + minimumSeverity: 'normal', }); expect(normal.map(idOnly)).toEqual([id1, id2, id3, id4]); }); @@ -308,7 +305,7 @@ describe.each(databases.eachSupportedId())( it('critical', async () => { const critical = await storage.getNotifications({ user, - minimalSeverity: getNumericSeverity('critical'), + minimumSeverity: 'critical', }); expect(critical.length).toBe(1); expect(critical.at(0)?.id).toEqual(id3); @@ -317,7 +314,7 @@ describe.each(databases.eachSupportedId())( it('high', async () => { const high = await storage.getNotifications({ user, - minimalSeverity: getNumericSeverity('high'), + minimumSeverity: 'high', }); expect(high.map(idOnly)).toEqual([id3, id4]); }); @@ -325,7 +322,7 @@ describe.each(databases.eachSupportedId())( it('low', async () => { const low = await storage.getNotifications({ user, - minimalSeverity: getNumericSeverity('low'), + minimumSeverity: 'low', }); expect(low.map(idOnly)).toEqual([id1, id2, id3, id4, id5]); }); diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts index 6d0d8bb638..dcf899832b 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts @@ -39,9 +39,13 @@ const severities: NotificationSeverity[] = [ 'normal', 'low', ]; -export const getNumericSeverity = (severity: string): Number => { - const idx = severities.indexOf(severity as NotificationSeverity); - return idx >= 0 ? idx : 2 /* normal */; + +export const normalizeSeverity = (input?: string): NotificationSeverity => { + let lower = (input ?? 'normal').toLowerCase() as NotificationSeverity; + if (severities.indexOf(lower) < 0) { + lower = 'normal'; + } + return lower; }; /** @internal */ @@ -84,7 +88,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { description: row.description, link: row.link, topic: row.topic, - severity: severities[row.severity], + severity: row.severity, scope: row.scope, icon: row.icon, }, @@ -101,7 +105,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { link: notification.payload?.link, title: notification.payload?.title, description: notification.payload?.description, - severity: getNumericSeverity(notification.payload?.severity ?? 'normal'), + severity: normalizeSeverity(notification.payload?.severity), scope: notification.payload?.scope, saved: notification.saved, read: notification.read, @@ -169,8 +173,10 @@ export class DatabaseNotificationsStore implements NotificationsStore { query.whereNull('notification.saved'); } // or match both if undefined - if (options.minimalSeverity !== undefined) { - query.where('notification.severity', '<=', options.minimalSeverity); + if (options.minimumSeverity !== undefined) { + const idx = severities.indexOf(options.minimumSeverity); + const equalOrHigher = severities.slice(0, idx + 1); + query.whereIn('notification.severity', equalOrHigher); } return query; @@ -260,7 +266,7 @@ export class DatabaseNotificationsStore implements NotificationsStore { link: notification.payload.link, topic: notification.payload.topic, updated: new Date(), - severity: getNumericSeverity(notification.payload?.severity ?? 'normal'), + severity: normalizeSeverity(notification.payload?.severity), read: null, }); diff --git a/plugins/notifications-backend/src/database/NotificationsStore.ts b/plugins/notifications-backend/src/database/NotificationsStore.ts index b95f504322..408e90f24b 100644 --- a/plugins/notifications-backend/src/database/NotificationsStore.ts +++ b/plugins/notifications-backend/src/database/NotificationsStore.ts @@ -16,6 +16,7 @@ import { Notification, + NotificationSeverity, NotificationStatus, } from '@backstage/plugin-notifications-common'; @@ -32,7 +33,7 @@ export type NotificationGetOptions = { read?: boolean; saved?: boolean; createdAfter?: Date; - minimalSeverity?: Number; + minimumSeverity?: NotificationSeverity; }; /** @internal */ diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index baab9fd4ae..a27c0b10a7 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -18,7 +18,7 @@ import express, { Request } from 'express'; import Router from 'express-promise-router'; import { DatabaseNotificationsStore, - getNumericSeverity, + normalizeSeverity, NotificationGetOptions, } from '../database'; import { v4 as uuid } from 'uuid'; @@ -239,7 +239,7 @@ export async function createRouter( opts.createdAfter = new Date(sinceEpoch); } if (req.query.minimal_severity) { - opts.minimalSeverity = getNumericSeverity( + opts.minimumSeverity = normalizeSeverity( req.query.minimal_severity.toString(), ); } diff --git a/plugins/notifications/api-report.md b/plugins/notifications/api-report.md index 93a418b27b..11c671112a 100644 --- a/plugins/notifications/api-report.md +++ b/plugins/notifications/api-report.md @@ -27,7 +27,7 @@ export type GetNotificationsOptions = { createdAfter?: Date; sort?: 'created' | 'topic' | 'origin'; sortOrder?: 'asc' | 'desc'; - minimalSeverity?: NotificationSeverity; + minimumSeverity?: NotificationSeverity; }; // @public (undocumented) diff --git a/plugins/notifications/src/api/NotificationsApi.ts b/plugins/notifications/src/api/NotificationsApi.ts index 461c38537c..234e86ff13 100644 --- a/plugins/notifications/src/api/NotificationsApi.ts +++ b/plugins/notifications/src/api/NotificationsApi.ts @@ -35,7 +35,7 @@ export type GetNotificationsOptions = { createdAfter?: Date; sort?: 'created' | 'topic' | 'origin'; sortOrder?: 'asc' | 'desc'; - minimalSeverity?: NotificationSeverity; + minimumSeverity?: NotificationSeverity; }; /** @public */ diff --git a/plugins/notifications/src/api/NotificationsClient.ts b/plugins/notifications/src/api/NotificationsClient.ts index ea809658f9..1e2e289bbe 100644 --- a/plugins/notifications/src/api/NotificationsClient.ts +++ b/plugins/notifications/src/api/NotificationsClient.ts @@ -67,8 +67,8 @@ export class NotificationsClient implements NotificationsApi { if (options?.createdAfter !== undefined) { queryString.append('created_after', options.createdAfter.toISOString()); } - if (options?.minimalSeverity !== undefined) { - queryString.append('minimal_severity', options.minimalSeverity); + if (options?.minimumSeverity !== undefined) { + queryString.append('minimal_severity', options.minimumSeverity); } const urlSegment = `?${queryString}`; diff --git a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx index 44617ea72c..caf966eab3 100644 --- a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx +++ b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx @@ -251,12 +251,10 @@ export const NotificationsFilters = ({ - - Minimal severity - + Severity