From 002966b73959c5a1cf26fe046f86a2d1e2bf413d Mon Sep 17 00:00:00 2001 From: Kunthawat Greethong Date: Tue, 31 Mar 2026 11:44:31 +0700 Subject: [PATCH] fix: Consent API auto-creates database table on startup - better-sqlite3 creates ConsentLog table if not exists - Auto-creates data/ directory if missing - Fixes Astro DB not creating custom tables issue --- data/consent.db | Bin 0 -> 20480 bytes src/pages/api/consent/[sessionId].ts | 23 +++++++++++++++++++++-- src/pages/api/consent/index.ts | 23 +++++++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 data/consent.db diff --git a/data/consent.db b/data/consent.db new file mode 100644 index 0000000000000000000000000000000000000000..b397c0f68ce5e9534da4e9e99c1049e5e28386fb GIT binary patch literal 20480 zcmeI(&rjM=00;2*3d5BRyNlsO^5CQqNL$LLBuj>@b7Y7=RuT+Wq%DaNONn z>h-*i(>i>^`{B?hhvoEM+Wy`!KfL;Z&->+FG04Qoa%8hd3cX00Izz00bZa0SG_<0uX=z1R!v?1g51(nvP#_ zkY;E^lP6y$IN$$2CCaHXxLY@f(Lw+M5P$##AOHafKmY;|fB*#kb%BZ$C#k2hEGKg_ zf%yMLPF0IyhyHQ6Z(qBd_vujW-vZ`s zI?+mnVqPmQ+}ufAP*LTKC}+y|e_ajZg8&2|009U<00Izz00bZa0SG|gj{*-PDLVS0 ML3$8L$rlOZ7nAlGj{pDw literal 0 HcmV?d00001 diff --git a/src/pages/api/consent/[sessionId].ts b/src/pages/api/consent/[sessionId].ts index efd15b9..1e3d861 100644 --- a/src/pages/api/consent/[sessionId].ts +++ b/src/pages/api/consent/[sessionId].ts @@ -1,13 +1,32 @@ import type { APIRoute } from 'astro'; import Database from 'better-sqlite3'; import { join } from 'path'; +import { mkdirSync, existsSync } from 'fs'; export const prerender = false; -const DB_PATH = join(process.cwd(), 'data', 'consent.db'); +const DATA_DIR = join(process.cwd(), 'data'); +const DB_PATH = join(DATA_DIR, 'consent.db'); function getDb() { - return new Database(DB_PATH); + if (!existsSync(DATA_DIR)) { + mkdirSync(DATA_DIR, { recursive: true }); + } + const db = new Database(DB_PATH); + db.exec(` + CREATE TABLE IF NOT EXISTS ConsentLog ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + sessionId TEXT UNIQUE NOT NULL, + timestamp TEXT NOT NULL, + essential INTEGER NOT NULL DEFAULT 0, + analytics INTEGER NOT NULL DEFAULT 0, + marketing INTEGER NOT NULL DEFAULT 0, + policyVersion TEXT NOT NULL, + ipHash TEXT, + userAgent TEXT + ) + `); + return db; } export const DELETE: APIRoute = async ({ params }) => { diff --git a/src/pages/api/consent/index.ts b/src/pages/api/consent/index.ts index e1705b8..bab75b0 100644 --- a/src/pages/api/consent/index.ts +++ b/src/pages/api/consent/index.ts @@ -1,13 +1,32 @@ import type { APIRoute } from 'astro'; import Database from 'better-sqlite3'; import { join } from 'path'; +import { mkdirSync, existsSync } from 'fs'; export const prerender = false; -const DB_PATH = join(process.cwd(), 'data', 'consent.db'); +const DATA_DIR = join(process.cwd(), 'data'); +const DB_PATH = join(DATA_DIR, 'consent.db'); function getDb() { - return new Database(DB_PATH); + if (!existsSync(DATA_DIR)) { + mkdirSync(DATA_DIR, { recursive: true }); + } + const db = new Database(DB_PATH); + db.exec(` + CREATE TABLE IF NOT EXISTS ConsentLog ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + sessionId TEXT UNIQUE NOT NULL, + timestamp TEXT NOT NULL, + essential INTEGER NOT NULL DEFAULT 0, + analytics INTEGER NOT NULL DEFAULT 0, + marketing INTEGER NOT NULL DEFAULT 0, + policyVersion TEXT NOT NULL, + ipHash TEXT, + userAgent TEXT + ) + `); + return db; } const rateLimitMap = new Map();