aboutsummaryrefslogtreecommitdiff
path: root/src/lib/server/db/errors.ts
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-10-18 21:47:21 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-10-18 21:47:21 +0200
commitc3c61894d2b119ae424bac605d4b3099e0b674e5 (patch)
treec525ebf4d33cbdfac22fc8702367f20d8f7ba344 /src/lib/server/db/errors.ts
parentc2722b62832afe2d028f1bcb6954116f7eec9cde (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.ts13
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;
+}