Skip to content
This repository was archived by the owner on Jan 2, 2025. It is now read-only.

Commit 4deac86

Browse files
authored
Remove sqlite, refactor to use level (#69)
* init * checkpoint, db dump method, refactor with-db * fix zod level db fns, migrate "create.ts" from dev_package_examples * wip refactoring dev server to level from sqlite * Added a new test for the `dev_package_examples/list.test.ts` file. * Replaced Kysely query with ZodLevelDatabase dump and mapping to required format. * list endpoint support * wip progress on refactor to level * db reset * implement export file refactor * implement download * fix tests * remove log line * small fixes to prevent level open/close issues * remove sqlite * remove sqlite types
1 parent 4d52124 commit 4deac86

40 files changed

+634
-387
lines changed

bun.lockb

-9.72 KB
Binary file not shown.

dev-server-api/bun.lockb

-14.8 KB
Binary file not shown.

dev-server-api/package.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"build": "winterspec bundle-routes -i ./routes -o static-routes.ts"
88
},
99
"devDependencies": {
10-
"@types/better-sqlite3": "^7.6.9",
1110
"@types/bun": "latest",
1211
"@types/sql.js": "^1.4.9",
1312
"make-vfs": "^1.0.10"
@@ -16,9 +15,6 @@
1615
"typescript": "^5.0.0"
1716
},
1817
"dependencies": {
19-
"better-sqlite3": "^11.0.0",
20-
"kysely": "^0.27.3",
21-
"kysely-bun-sqlite": "^0.3.2",
2218
"level": "^8.0.1",
2319
"redaxios": "^0.5.1",
2420
"winterspec": "0.0.81",
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { withWinterSpec } from "src/with-winter-spec"
2+
import { z } from "zod"
3+
4+
export default withWinterSpec({
5+
methods: ["GET"],
6+
jsonResponse: z.object({
7+
dev_server_database_dump: z.any(),
8+
}),
9+
auth: "none",
10+
})(async (req, ctx) => {
11+
return new Response(
12+
JSON.stringify(
13+
{
14+
dev_server_database_dump: await ctx.db.dump(),
15+
},
16+
null,
17+
" "
18+
),
19+
{
20+
headers: {
21+
"content-type": "application/json",
22+
},
23+
}
24+
)
25+
})

dev-server-api/routes/api/dev_package_examples/create.ts

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { withWinterSpec } from "src/with-winter-spec"
2-
import { NotFoundError } from "edgespec/middleware"
32
import { z } from "zod"
43

54
export default withWinterSpec({
@@ -17,35 +16,26 @@ export default withWinterSpec({
1716
file_path: z.string(),
1817
tscircuit_soup: z.any(),
1918
error: z.string().nullable().optional(),
20-
last_updated_at: z.string().datetime(),
19+
last_updated_at: z.string().datetime().nullable(), // TODO remove nullable
2120
}),
2221
}),
2322
auth: "none",
2423
})(async (req, ctx) => {
2524
const tscircuit_soup = req.jsonBody.tscircuit_soup
26-
? JSON.stringify(req.jsonBody.tscircuit_soup)
27-
: undefined
28-
const dev_package_example = await ctx.db
29-
.insertInto("dev_package_example")
30-
.values({
31-
file_path: req.jsonBody.file_path,
32-
export_name: req.jsonBody.export_name,
33-
error: req.jsonBody.error,
34-
tscircuit_soup,
35-
is_loading: req.jsonBody.is_loading ? 1 : 0,
36-
last_updated_at: new Date().toISOString(),
37-
})
38-
.onConflict((oc) =>
39-
oc.columns(["file_path"]).doUpdateSet({
40-
export_name: req.jsonBody.export_name,
41-
error: req.jsonBody.error,
42-
tscircuit_soup,
43-
is_loading: req.jsonBody.is_loading ? 1 : 0,
44-
last_updated_at: new Date().toISOString(),
45-
})
46-
)
47-
.returningAll()
48-
.executeTakeFirstOrThrow()
25+
26+
const existingDevPackageExample = await ctx.db.find("dev_package_example", {
27+
file_path: req.jsonBody.file_path,
28+
})
29+
30+
const dev_package_example = await ctx.db.put("dev_package_example", {
31+
dev_package_example_id: existingDevPackageExample?.dev_package_example_id,
32+
file_path: req.jsonBody.file_path,
33+
export_name: req.jsonBody.export_name,
34+
error: req.jsonBody.error,
35+
tscircuit_soup,
36+
is_loading: Boolean(req.jsonBody.is_loading),
37+
last_updated_at: new Date().toISOString(),
38+
})
4939

5040
return ctx.json({
5141
dev_package_example,

dev-server-api/routes/api/dev_package_examples/get.ts

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default withWinterSpec({
1212
dev_package_example_id: z.coerce.number(),
1313
file_path: z.string(),
1414
tscircuit_soup: z.any(),
15-
completed_edit_events: z.array(z.any()).nullable().default(null),
15+
completed_edit_events: z.array(z.any()).default([]),
1616
is_loading: z.boolean(),
1717
error: z.string().nullable().optional().default(null),
1818
soup_last_updated_at: z.string().datetime().nullable().default(null),
@@ -26,30 +26,21 @@ export default withWinterSpec({
2626
.datetime()
2727
.nullable()
2828
.default(null),
29-
last_updated_at: z.string().datetime(),
29+
last_updated_at: z.string().datetime().nullable(),
3030
}),
3131
}),
3232
auth: "none",
3333
})(async (req, ctx) => {
34+
const dev_package_example = await ctx.db.get(
35+
"dev_package_example",
36+
req.commonParams.dev_package_example_id
37+
)
38+
39+
if (!dev_package_example) {
40+
throw new NotFoundError("Package not found")
41+
}
42+
3443
return ctx.json({
35-
dev_package_example: await ctx.db
36-
.selectFrom("dev_package_example")
37-
.selectAll()
38-
.where(
39-
"dev_package_example_id",
40-
"=",
41-
req.commonParams.dev_package_example_id
42-
)
43-
.executeTakeFirstOrThrow((e) => {
44-
throw new NotFoundError("Package not found")
45-
})
46-
.then((r) => ({
47-
...r,
48-
is_loading: r.is_loading === 1,
49-
tscircuit_soup: JSON.parse(r.tscircuit_soup),
50-
completed_edit_events: r.completed_edit_events
51-
? JSON.parse(r.completed_edit_events)
52-
: null,
53-
})),
44+
dev_package_example,
5445
})
5546
})

dev-server-api/routes/api/dev_package_examples/list.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { sql } from "kysely"
21
import { withWinterSpec } from "src/with-winter-spec"
32
import { z } from "zod"
43

@@ -9,32 +8,28 @@ export default withWinterSpec({
98
z.object({
109
dev_package_example_id: z.coerce.number(),
1110
file_path: z.string(),
12-
export_name: z.string(),
13-
is_loading: z.coerce.boolean(),
14-
edit_events_last_updated_at: z
15-
.string()
16-
.datetime()
17-
.nullable()
18-
.default(null),
19-
soup_last_updated_at: z.string().datetime().nullable().default(null),
20-
last_updated_at: z.string().datetime(),
11+
export_name: z.string().nullable(),
12+
is_loading: z.boolean(),
13+
edit_events_last_updated_at: z.string().datetime().nullable(),
14+
soup_last_updated_at: z.string().datetime().nullable(),
15+
last_updated_at: z.string().datetime().nullable(),
2116
})
2217
),
2318
}),
2419
auth: "none",
2520
})(async (req, ctx) => {
26-
const dev_package_examples = await ctx.db
27-
.selectFrom("dev_package_example")
28-
.select([
29-
"dev_package_example_id",
30-
"file_path",
31-
"export_name",
32-
"last_updated_at",
33-
"edit_events_last_updated_at",
34-
"soup_last_updated_at",
35-
sql`(is_loading = 1)`.$castTo<boolean>().as("is_loading"),
36-
])
37-
.execute()
21+
const dev_package_examples = (await ctx.db.list("dev_package_example")).map(
22+
(dpe) => ({
23+
dev_package_example_id: dpe.dev_package_example_id,
24+
file_path: dpe.file_path,
25+
export_name: dpe.export_name,
26+
is_loading: dpe.is_loading,
27+
edit_events_last_updated_at: dpe.edit_events_last_updated_at,
28+
soup_last_updated_at: dpe.soup_last_updated_at,
29+
last_updated_at: dpe.last_updated_at,
30+
})
31+
)
32+
3833
return ctx.json({
3934
dev_package_examples,
4035
})
Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { withWinterSpec } from "src/with-winter-spec"
22
import { NotFoundError } from "edgespec/middleware"
33
import { z } from "zod"
4+
import { DevPackageExampleSchema } from "src/db/schema"
45

56
export default withWinterSpec({
67
methods: ["POST"],
@@ -12,46 +13,47 @@ export default withWinterSpec({
1213
error: z.string().nullable().optional().default(null),
1314
}),
1415
jsonResponse: z.object({
15-
dev_package_example: z.object({
16-
dev_package_example_id: z.coerce.number(),
17-
tscircuit_soup: z.any(),
18-
error: z.string().nullable().optional(),
19-
last_updated_at: z.string().datetime(),
20-
}),
16+
dev_package_example: DevPackageExampleSchema,
2117
}),
2218
auth: "none",
2319
})(async (req, ctx) => {
20+
const dev_package_example = await ctx.db.get(
21+
"dev_package_example",
22+
req.jsonBody.dev_package_example_id
23+
)
24+
25+
if (!dev_package_example) {
26+
throw new NotFoundError("Package not found")
27+
}
28+
29+
const new_dev_package_example = {
30+
...dev_package_example,
31+
}
32+
33+
if (req.jsonBody.completed_edit_events !== undefined) {
34+
new_dev_package_example.completed_edit_events =
35+
req.jsonBody.completed_edit_events
36+
new_dev_package_example.edit_events_last_updated_at =
37+
new Date().toISOString()
38+
}
39+
if (req.jsonBody.edit_events_last_applied_at !== undefined) {
40+
new_dev_package_example.edit_events_last_applied_at =
41+
req.jsonBody.edit_events_last_applied_at
42+
}
43+
if (req.jsonBody.tscircuit_soup !== undefined) {
44+
new_dev_package_example.tscircuit_soup = req.jsonBody.tscircuit_soup
45+
new_dev_package_example.error = null
46+
new_dev_package_example.soup_last_updated_at = new Date().toISOString()
47+
}
48+
if (req.jsonBody.error !== undefined) {
49+
new_dev_package_example.error = req.jsonBody.error
50+
}
51+
52+
new_dev_package_example.last_updated_at = new Date().toISOString()
53+
54+
await ctx.db.put("dev_package_example", new_dev_package_example)
55+
2456
return ctx.json({
25-
dev_package_example: await ctx.db
26-
.updateTable("dev_package_example")
27-
.set({
28-
last_updated_at: new Date().toISOString(),
29-
})
30-
.$if(req.jsonBody.tscircuit_soup !== undefined, (q) =>
31-
q
32-
.set("tscircuit_soup", req.jsonBody.tscircuit_soup)
33-
.set("error", null)
34-
.set("soup_last_updated_at", new Date().toISOString())
35-
)
36-
.$if(req.jsonBody.error !== undefined, (q) =>
37-
q.set("error", req.jsonBody.error)
38-
)
39-
.$if(req.jsonBody.completed_edit_events !== undefined, (q) =>
40-
q
41-
.set(
42-
"completed_edit_events",
43-
JSON.stringify(req.jsonBody.completed_edit_events)
44-
)
45-
.set("edit_events_last_updated_at", new Date().toISOString())
46-
)
47-
.$if(req.jsonBody.edit_events_last_applied_at !== undefined, (q) =>
48-
q.set(
49-
"edit_events_last_applied_at",
50-
req.jsonBody.edit_events_last_applied_at!
51-
)
52-
)
53-
.returningAll()
54-
.where("dev_package_example_id", "=", req.jsonBody.dev_package_example_id)
55-
.executeTakeFirstOrThrow(),
57+
dev_package_example: new_dev_package_example,
5658
})
5759
})
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
import { sql } from "kysely"
21
import { withWinterSpec } from "src/with-winter-spec"
3-
import { z } from "zod"
4-
import { unlinkSync } from "fs"
5-
import { getDbFilePath } from "src/db/get-db"
6-
7-
export default (req: Request) => {
8-
unlinkSync(getDbFilePath())
92

3+
export default withWinterSpec({
4+
methods: ["GET", "POST"],
5+
auth: "none",
6+
})(async (req, ctx) => {
7+
await ctx.db.clear()
108
return new Response(JSON.stringify({}), {
119
headers: {
1210
"content-type": "application/json",
1311
},
1412
})
15-
}
13+
})
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ExportFileSchema } from "src/db/schema"
12
import { publicMapExportFile } from "src/lib/public-mapping/public-map-export-file"
23
import { export_file } from "src/lib/zod/export_file"
34
import { withWinterSpec } from "src/with-winter-spec"
@@ -8,25 +9,21 @@ export default withWinterSpec({
89
jsonBody: z.object({
910
export_request_id: z.number().int(),
1011
file_name: z.string(),
11-
file_content_base64: z.string().transform((a) => Buffer.from(a, "base64")),
12+
file_content_base64: z.string(),
1213
}),
1314
jsonResponse: z.object({
14-
export_file,
15+
export_file: ExportFileSchema.omit({ file_content_base64: true }),
1516
}),
1617
auth: "none",
1718
})(async (req, ctx) => {
18-
const db_export_file = await ctx.db
19-
.insertInto("export_file")
20-
.values({
21-
export_request_id: req.jsonBody.export_request_id,
22-
file_name: req.jsonBody.file_name,
23-
file_content: req.jsonBody.file_content_base64,
24-
created_at: new Date().toISOString(),
25-
})
26-
.returningAll()
27-
.executeTakeFirstOrThrow()
19+
const export_file = await ctx.db.put("export_file", {
20+
export_request_id: req.jsonBody.export_request_id,
21+
file_name: req.jsonBody.file_name,
22+
file_content_base64: req.jsonBody.file_content_base64,
23+
created_at: new Date().toISOString(),
24+
})
2825

2926
return ctx.json({
30-
export_file: publicMapExportFile(db_export_file),
27+
export_file,
3128
})
3229
})
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { publicMapExportFile } from "src/lib/public-mapping/public-map-export-file"
22
import { export_file } from "src/lib/zod/export_file"
33
import { withWinterSpec } from "src/with-winter-spec"
4+
import { NotFoundError } from "winterspec/middleware"
45
import { z } from "zod"
56

67
export default withWinterSpec({
@@ -10,15 +11,17 @@ export default withWinterSpec({
1011
}),
1112
auth: "none",
1213
})(async (req, ctx) => {
13-
const db_export_file = await ctx.db
14-
.selectFrom("export_file")
15-
.selectAll()
16-
.where("export_file_id", "=", req.query.export_file_id)
17-
.executeTakeFirstOrThrow()
14+
const export_file = await ctx.db.get("export_file", req.query.export_file_id)
1815

19-
return new Response(db_export_file.file_content, {
16+
if (!export_file) {
17+
throw new NotFoundError("Export file not found")
18+
}
19+
20+
const file_content = Buffer.from(export_file.file_content_base64!, "base64")
21+
22+
return new Response(file_content, {
2023
headers: {
21-
"Content-Disposition": `attachment; filename="${db_export_file.file_name}"`,
24+
"Content-Disposition": `attachment; filename="${export_file.file_name}"`,
2225
},
2326
})
2427
})

0 commit comments

Comments
 (0)