47 "slug": "codegen",
48 "link": "/blog/codegen",
49 "description": "Like Claude Artifacts, but with a backend and database",
50 "pubDate": "Thu, 22 Aug 2024 00:00:00 GMT",
51 "author": "JP Posma",
198```
199โโโ backend/
200โ โโโ database/
201โ โ โโโ migrations.ts # Schema definitions
202โ โ โโโ queries.ts # DB query functions
257 ```
258
259### Database Patterns
260- Run migrations on startup or comment out for performance
261- Change table names when modifying schemas rather than altering
198```
199โโโ backend/
200โ โโโ database/
201โ โ โโโ migrations.ts # Schema definitions
202โ โ โโโ queries.ts # DB query functions
257 ```
258
259### Database Patterns
260- Run migrations on startup or comment out for performance
261- Change table names when modifying schemas rather than altering
46 }
47
48 // Now it's time to upload things to database and blob storage
49 // First, add to database, and get the ID
50 const id = await sqlite.execute(
51 `INSERT INTO ${TABLE_NAME} (title, data, type, time) VALUES ($title, $data, $type, $time)`,
1import { parseProject, readFile, serveFile } from "https://esm.town/v/std/utils/index.ts";
2import { Hono } from "npm:hono";
3import { getMessages, insertMessage } from "./database/queries.ts";
4
5const app = new Hono();
190
191/**
192 * Get database statistics for the homepage
193 */
194export async function getSearchStats(): Promise<{
873 const offset = (page - 1) * pageSize;
874
875 // Start all database queries in parallel
876 // 1. Launch count queries
877 const countsPromise = withTiming(() => Promise.all([
960 ));
961
962 // Wait for all database operations to complete in parallel
963 const [
964 [countsResult, countsTime],
198```
199โโโ backend/
200โ โโโ database/
201โ โ โโโ migrations.ts # Schema definitions
202โ โ โโโ queries.ts # DB query functions
257 ```
258
259### Database Patterns
260- Run migrations on startup or comment out for performance
261- Change table names when modifying schemas rather than altering
46 }
47
48 // Now it's time to upload things to database and blob storage
49 // First, add to database, and get the ID
50 const id = await sqlite.execute(
51 `INSERT INTO ${TABLE_NAME} (title, data, type, time) VALUES ($title, $data, $type, CURRENT_TIMESTAMP)`,
1import { Hono } from "npm:hono";
2import { createThread, getThreadMessages, getUserThreads } from "../database/queries.ts";
3
4const app = new Hono();
3import { type Message, type Thread, type User } from "../../shared/types.ts";
4import {
5 type DatabaseMessage,
6 type DatabaseThread,
7 type DatabaseUser,
8 MESSAGES_TABLE,
9 THREADS_TABLE,
11} from "./schema.ts";
12
13function parseDatabaseUser(user: DatabaseUser): User {
14 return {
15 id: user.id,
21}
22
23function parseDatabaseThread(thread: DatabaseThread): Thread {
24 return {
25 id: thread.id,
32}
33
34function parseDatabaseMessage(message: DatabaseMessage): Message {
35 return {
36 id: message.id,
60 );
61 if (result.rows && result.rows.length > 0) {
62 return parseDatabaseUser(result.rows[0]);
63 }
64
78 );
79 if (result2.rows && result2.rows.length > 0) {
80 return parseDatabaseUser(result2.rows[0]);
81 }
82
90 );
91 if (result3.rows && result3.rows.length > 0) {
92 return parseDatabaseUser(result3.rows[0]);
93 }
94 throw new Error("Failed to create user");
126
127 if (result.rows && result.rows.length > 0) {
128 return parseDatabaseThread(result.rows[0]);
129 }
130 return null;
136 [userId],
137 );
138 return (result.rows || []).map(parseDatabaseThread);
139}
140
144 [valId],
145 );
146 return (result.rows || []).map(parseDatabaseThread);
147}
148
155 );
156
157 return (result.rows || []).map(parseDatabaseMessage);
158}
159