fix(db): enforce correct slug uniqueness rules with insert trigger

This commit is contained in:
Arshdeep Singh 2025-06-02 10:29:56 +05:30
parent 925873a1de
commit ee171da676

View file

@ -44,8 +44,7 @@ const initDB = async () => {
short_code TEXT NOT NULL, short_code TEXT NOT NULL,
expiry_date TEXT, expiry_date TEXT,
user_id TEXT DEFAULT '', user_id TEXT DEFAULT '',
customized_shortner_slug TEXT, customized_shortner_slug TEXT
UNIQUE(user_id, customized_shortner_slug)
)`, )`,
function (err) { function (err) {
if (err) { if (err) {
@ -58,19 +57,21 @@ const initDB = async () => {
CREATE TRIGGER IF NOT EXISTS enforce_custom_slug_uniqueness_insert CREATE TRIGGER IF NOT EXISTS enforce_custom_slug_uniqueness_insert
BEFORE INSERT ON urls BEFORE INSERT ON urls
BEGIN BEGIN
-- Prevent duplicate slugs for anonymous users -- Case 1: Anonymous users with non-empty slug must be globally unique
SELECT RAISE(ABORT, 'Slug must be unique for anonymous users') SELECT RAISE(ABORT, 'Slug must be unique for anonymous users')
WHERE NEW.user_id = '' AND NEW.customized_shortner_slug != '' AND EXISTS ( WHERE NEW.user_id = '' AND NEW.customized_shortner_slug != ''
SELECT 1 FROM urls AND EXISTS (
WHERE user_id = '' AND customized_shortner_slug = NEW.customized_shortner_slug SELECT 1 FROM urls
); WHERE user_id = '' AND customized_shortner_slug = NEW.customized_shortner_slug
);
-- Prevent duplicate slugs for the same logged-in user -- Case 2: Logged-in users with non-empty slug must be unique per user
SELECT RAISE(ABORT, 'Slug must be unique per user') SELECT RAISE(ABORT, 'Slug must be unique per user')
WHERE NEW.user_id != '' AND NEW.customized_shortner_slug != '' AND EXISTS ( WHERE NEW.user_id != '' AND NEW.customized_shortner_slug != ''
SELECT 1 FROM urls AND EXISTS (
WHERE user_id = NEW.user_id AND customized_shortner_slug = NEW.customized_shortner_slug SELECT 1 FROM urls
); WHERE user_id = NEW.user_id AND customized_shortner_slug = NEW.customized_shortner_slug
);
END; END;
`, `,
function (err) { function (err) {