SBZ-EDU
Initial commit for Cloudflare D1 integration
b273c57
Raw
History Blame Contribute Delete
5.26 kB
interface Env {
DB: D1Database;
}
export const onRequest = async (context: { request: Request; env: Env }) => {
const { request, env } = context;
const url = new URL(request.url);
const path = url.pathname;
if (request.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
}
try {
if (path === "/api/db/professionals") {
const type = url.searchParams.get("type");
if (request.method === "GET") {
let query = "SELECT * FROM professionals";
const params: any[] = [];
if (type) {
query += " WHERE type = ?";
params.push(type);
}
const { results } = await env.DB.prepare(query).bind(...params).all();
return new Response(JSON.stringify(results), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "POST") {
const { data, type: bodyType } = await request.json();
const professionalsArray = Array.isArray(data) ? data : [data];
const statements = professionalsArray.map((p: any) =>
env.DB.prepare(
"INSERT INTO professionals (name, specialty, address, contact, website, summary, type) VALUES (?, ?, ?, ?, ?, ?, ?)"
).bind(
p.name,
p.specialty,
p.address,
p.contact,
p.website,
p.summary,
bodyType || type || 'lawyer'
)
);
await env.DB.batch(statements);
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "DELETE") {
if (type) {
await env.DB.prepare("DELETE FROM professionals WHERE type = ?").bind(type).run();
} else {
await env.DB.prepare("DELETE FROM professionals").run();
}
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
}
if (path === "/api/db/chats") {
if (request.method === "GET") {
const { results } = await env.DB.prepare("SELECT * FROM chat_sessions ORDER BY timestamp DESC").all();
const chats = results.map((r: any) => ({
...r,
messages: JSON.parse(r.messages)
}));
return new Response(JSON.stringify(chats), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "POST") {
const chat = await request.json();
await env.DB.prepare(
"INSERT OR REPLACE INTO chat_sessions (id, title, docType, timestamp, messages) VALUES (?, ?, ?, ?, ?)"
).bind(
chat.id,
chat.title,
chat.docType,
chat.timestamp,
JSON.stringify(chat.messages)
).run();
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "DELETE") {
const id = url.searchParams.get("id");
if (id) {
await env.DB.prepare("DELETE FROM chat_sessions WHERE id = ?").bind(id).run();
} else {
await env.DB.prepare("DELETE FROM chat_sessions").run();
}
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
}
if (path === "/api/db/checkpoints") {
if (request.method === "GET") {
const { results } = await env.DB.prepare("SELECT * FROM checkpoints ORDER BY timestamp DESC").all();
const checkpoints = results.map((r: any) => ({
...r,
state: JSON.parse(r.state)
}));
return new Response(JSON.stringify(checkpoints), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "POST") {
const ckpt = await request.json();
await env.DB.prepare(
"INSERT OR REPLACE INTO checkpoints (id, name, timestamp, state) VALUES (?, ?, ?, ?)"
).bind(
ckpt.id,
ckpt.name,
ckpt.timestamp,
JSON.stringify(ckpt.state)
).run();
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
if (request.method === "DELETE") {
const id = url.searchParams.get("id");
if (id) {
await env.DB.prepare("DELETE FROM checkpoints WHERE id = ?").bind(id).run();
} else {
await env.DB.prepare("DELETE FROM checkpoints").run();
}
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
});
}
}
return new Response("Not Found", { status: 404 });
} catch (error: any) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { "Content-Type": "application/json" },
});
}
};