hanchu/server/server.ts

75 lines
2.1 KiB
TypeScript
Raw Normal View History

2024-10-20 12:51:30 +00:00
import { Database } from 'bun:sqlite';
const db = new Database('../data/data.db');
db.exec('PRAGMA journal_mode = WAL;');
Bun.serve({
fetch(req) {
console.log('req object', req);
const url = new URL(req.url);
if (url.pathname === '/') return new Response('Home page!');
if (req.method === 'POST' && url.pathname === '/api')
return handlePost(req, url);
if (req.method === 'GET' && url.pathname.startsWith('/api'))
return handleGet(req, url);
return new Response('404!');
},
});
async function handleGet(_req: Request, url: URL) {
if (url.pathname === '/api/resource') return handleGetResource(url);
else return new Response('huh');
}
function handleGetResource(url: URL) {
const params = new URLSearchParams(url.search);
console.log(params);
const type = params.get('type');
const resource = params.get('res');
const data = fetchResource(type!, resource!);
return Response.json({ ok: true, data });
}
async function handlePost(req: Request, url: URL) {
const data = await req.json();
if (url.pathname === '/api/user') return handlePostUser(data);
else return new Response('huh');
}
// https://bun.sh/guides/http/server
type PostUser = { name: string; creds: string };
function handlePostUser(user: PostUser) {
addUser(user.name, user.creds);
return new Response('ok');
}
function addUser(name: string, creds: string) {
const query = db.query(`
INSERT
INTO users(name, creds)
VALUES($name, $creds)
`);
query.run({ $name: name, $creds: creds });
}
function fetchResource(type: string, resource: string) {
if (type === 'word') return fetchWord(resource);
else return {};
}
function fetchWord(word: string) {
const query = db.query(`
SELECT
spelling,
ipa,
languages.name AS language,
GROUP_CONCAT(c.name, ',') AS category,
ps.name AS pos
FROM words
JOIN languages ON languages.id = words.language_id
JOIN word_categories wc ON words.id = wc.word_id
JOIN categories c ON wc.category_id = c.id
JOIN parts_of_speech ps ON ps.id = c.part_of_speech_id
WHERE spelling = $spelling
GROUP BY words.id
`);
return query.get({ $spelling: word });
}