From be41af9e13146bf1f4a4f36d88c8b851b10e999c Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Thu, 2 Oct 2025 08:50:32 -0700 Subject: [PATCH] Feat: Add API endpoint for D1 schema management --- functions/api/schema.js | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 functions/api/schema.js diff --git a/functions/api/schema.js b/functions/api/schema.js new file mode 100644 index 0000000..ce63c0f --- /dev/null +++ b/functions/api/schema.js @@ -0,0 +1,68 @@ +const schema = [ + `CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY, + username TEXT UNIQUE NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + );`, + `CREATE TABLE IF NOT EXISTS subs ( + id INTEGER PRIMARY KEY, + name TEXT UNIQUE NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + );`, + `CREATE TABLE IF NOT EXISTS posts ( + id INTEGER PRIMARY KEY, + sub_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + title TEXT NOT NULL, + url TEXT, + content TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY(sub_id) REFERENCES subs(id), + FOREIGN KEY(user_id) REFERENCES users(id) + );`, + `CREATE TABLE IF NOT EXISTS comments ( + id INTEGER PRIMARY KEY, + post_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + parent_id INTEGER, + content TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY(post_id) REFERENCES posts(id), + FOREIGN KEY(user_id) REFERENCES users(id), + FOREIGN KEY(parent_id) REFERENCES comments(id) + );`, + `CREATE TABLE IF NOT EXISTS votes ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + post_id INTEGER, + comment_id INTEGER, + direction INTEGER NOT NULL CHECK(direction IN (1, -1)), + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + UNIQUE(user_id, post_id), + UNIQUE(user_id, comment_id), + FOREIGN KEY(user_id) REFERENCES users(id) + );` +]; + +export async function onRequestPost({ request, env }) { + try { + const db = env.D1_SPCHCAP; + const { action } = await request.json(); + + if (action === 'get') { + const stmt = db.prepare("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"); + const { results } = await stmt.all(); + return Response.json({ success: true, schema: results }); + } + + if (action === 'create') { + const stmts = schema.map(sql => db.prepare(sql)); + const results = await db.batch(stmts); + return Response.json({ success: true, results }); + } + + return Response.json({ success: false, error: 'Invalid action' }, { status: 400 }); + } catch (e) { + return Response.json({ success: false, error: e.message }, { status: 500 }); + } +}