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/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; 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) {