From 8da9ffe072779219a89a47530b19279278a6f0ae Mon Sep 17 00:00:00 2001 From: Ethienne Roy Date: Thu, 24 Aug 2023 06:49:38 -0400 Subject: [PATCH 1/2] feat: CLIN-2173 new handle to validate savedFilter name --- src/routes/savedFilters.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/routes/savedFilters.ts b/src/routes/savedFilters.ts index 7b33a14..787a5bf 100644 --- a/src/routes/savedFilters.ts +++ b/src/routes/savedFilters.ts @@ -11,7 +11,13 @@ import { update, updateAsDefault, } from '../db/dal/savedFilter'; -import { getFilterIDs, removeQueryFromFilters, uniqueNameErrorHandler, updateQuery } from '../utils/savedFilters'; +import { + getFilterIDs, + handleUniqueName, + removeQueryFromFilters, + uniqueNameErrorHandler, + updateQuery, +} from '../utils/savedFilters'; // Handles requests made to /saved-filters const savedFiltersRouter = Router(); @@ -129,4 +135,15 @@ savedFiltersRouter.get('/withQueryId/:id', async (req: any, res) => { } }); +savedFiltersRouter.post('/validate-name', async (req: any, res: any, next) => { + try { + const keycloak_id = req['kauth']?.grant?.access_token?.content?.sub; + await handleUniqueName({ ...req.body, keycloak_id }); + res.status(StatusCodes.OK).send({ valid: true }); + } catch (err) { + uniqueNameErrorHandler(err, res); + next(err); + } +}); + export default savedFiltersRouter; From 41fd1c3637ad154fe5b1ee1dc3c45219e505ec9f Mon Sep 17 00:00:00 2001 From: Ethienne Roy Date: Thu, 24 Aug 2023 10:10:22 -0400 Subject: [PATCH 2/2] feat: CLIN-2173 removed unique index --- ...1692886119429_remove-unique-constraint.sql | 20 +++++++++++++++++++ src/utils/savedFilters.ts | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 migrations/1692886119429_remove-unique-constraint.sql diff --git a/migrations/1692886119429_remove-unique-constraint.sql b/migrations/1692886119429_remove-unique-constraint.sql new file mode 100644 index 0000000..6a49985 --- /dev/null +++ b/migrations/1692886119429_remove-unique-constraint.sql @@ -0,0 +1,20 @@ +-- Up Migration +drop index idx_unique_saved_filters; + +drop function get_filter_uniqueness_date(); +-- Down Migration +CREATE OR REPLACE FUNCTION get_filter_uniqueness_date() RETURNS timestamp AS $$ +declare run_on_date timestamp; +BEGIN + SELECT run_on into run_on_date + FROM pgmigrations + WHERE name = '1688561786592_update-saved-filter'; + + RETURN run_on_date; +END +$$ LANGUAGE plpgsql + IMMUTABLE;; + +CREATE UNIQUE INDEX idx_unique_saved_filters + ON saved_filters (title, keycloak_id, type) + WHERE creation_date > get_filter_uniqueness_date(); \ No newline at end of file diff --git a/src/utils/savedFilters.ts b/src/utils/savedFilters.ts index 91685b1..0af60ad 100644 --- a/src/utils/savedFilters.ts +++ b/src/utils/savedFilters.ts @@ -100,7 +100,7 @@ const getCount = (filter) => type: QueryTypes.SELECT, }, ) - .then((res) => res[0]['count']); + .then((res) => Number(res[0]['count'])); export const handleUniqueName = async (filter) => { if (!filter.title) {