diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-18 21:47:21 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-18 21:47:21 +0200 |
| commit | c3c61894d2b119ae424bac605d4b3099e0b674e5 (patch) | |
| tree | c525ebf4d33cbdfac22fc8702367f20d8f7ba344 /src/lib/server/db/errors.ts | |
| parent | c2722b62832afe2d028f1bcb6954116f7eec9cde (diff) | |
fix: report a duplicate name instead of failing the page
Adding a category or project whose name exists, or renaming an item onto an
existing name, hit the unique constraint and rendered SvelteKit's 500 page.
Translate SQLITE_CONSTRAINT_UNIQUE into a form error on the three forms.
Diffstat (limited to 'src/lib/server/db/errors.ts')
| -rw-r--r-- | src/lib/server/db/errors.ts | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/lib/server/db/errors.ts b/src/lib/server/db/errors.ts new file mode 100644 index 0000000..4b101f8 --- /dev/null +++ b/src/lib/server/db/errors.ts @@ -0,0 +1,13 @@ +/** + * True when the failure is SQLite's UNIQUE constraint. Drizzle wraps driver + * errors, so the libsql error sits at some depth of the `cause` chain. + */ +export function isUniqueViolation(error: unknown): boolean { + let current: unknown = error; + while (current instanceof Error) { + if ('code' in current && current.code === 'SQLITE_CONSTRAINT_UNIQUE') + return true; + current = current.cause; + } + return false; +} |
