feat: add endpoints to get notes

This commit is contained in:
Julien Calixte
2026-02-09 14:07:17 +01:00
parent ed157cb4df
commit 6e22fd2f56
3 changed files with 68 additions and 2 deletions

View File

@@ -2,8 +2,8 @@
"tasks": { "tasks": {
"jetstream:prod": "deno run --allow-net --allow-read --allow-write --allow-env jetstream.ts", "jetstream:prod": "deno run --allow-net --allow-read --allow-write --allow-env jetstream.ts",
"jetstream": "deno run --watch --allow-net --allow-read --allow-write --allow-env jetstream.ts", "jetstream": "deno run --watch --allow-net --allow-read --allow-write --allow-env jetstream.ts",
"server": "deno run --watch --allow-net server.ts", "server": "deno run --watch --allow-net --allow-read --allow-write --allow-env server.ts",
"server:prod": "deno run --allow-net server.ts", "server:prod": "deno run --allow-net --allow-read --allow-write --allow-env server.ts",
"migrate": "deno run --allow-read --allow-write src/migrations/init.ts" "migrate": "deno run --allow-read --allow-write src/migrations/init.ts"
}, },
"imports": { "imports": {

View File

@@ -1,4 +1,5 @@
import { Application, Router } from "@oak/oak"; import { Application, Router } from "@oak/oak";
import { getNotes, getNotesByDid } from "./src/data/db.ts";
const router = new Router(); const router = new Router();
@@ -6,6 +7,19 @@ router.get("/", (ctx) => {
ctx.response.body = "Hello world"; ctx.response.body = "Hello world";
}); });
router.get("/notes", (ctx) => {
const cursor = ctx.request.url.searchParams.get("cursor") ?? undefined;
const limit = Number(ctx.request.url.searchParams.get("limit")) || 20;
ctx.response.body = getNotes(cursor, limit);
});
router.get("/:did/notes", (ctx) => {
const { did } = ctx.params;
const cursor = ctx.request.url.searchParams.get("cursor") ?? undefined;
const limit = Number(ctx.request.url.searchParams.get("limit")) || 20;
ctx.response.body = getNotesByDid(did, cursor, limit);
});
const app = new Application(); const app = new Application();
app.use(router.routes()); app.use(router.routes());
app.use(router.allowedMethods()); app.use(router.allowedMethods());

View File

@@ -3,6 +3,58 @@ import type { Note } from "./note.ts";
export const db = new DB(Deno.env.get("SQLITE_PATH") ?? "notes.db"); export const db = new DB(Deno.env.get("SQLITE_PATH") ?? "notes.db");
export const getNotes = (cursor?: string, limit = 20) => {
const rows = cursor
? db.query<[string, string, string, string, string, string]>(
"SELECT did, rkey, title, content, publishedAt, createdAt FROM note WHERE rkey < ? ORDER BY rkey DESC LIMIT ?",
[cursor, limit],
)
: db.query<[string, string, string, string, string, string]>(
"SELECT did, rkey, title, content, publishedAt, createdAt FROM note ORDER BY rkey DESC LIMIT ?",
[limit],
);
const notes = rows.map(([did, rkey, title, content, publishedAt, createdAt]) => ({
did,
rkey,
title,
content,
publishedAt,
createdAt,
}));
return {
notes,
cursor: notes.length === limit ? notes[notes.length - 1].rkey : undefined,
};
};
export const getNotesByDid = (did: string, cursor?: string, limit = 20) => {
const rows = cursor
? db.query<[string, string, string, string, string, string]>(
"SELECT did, rkey, title, content, publishedAt, createdAt FROM note WHERE did = ? AND rkey < ? ORDER BY rkey DESC LIMIT ?",
[did, cursor, limit],
)
: db.query<[string, string, string, string, string, string]>(
"SELECT did, rkey, title, content, publishedAt, createdAt FROM note WHERE did = ? ORDER BY rkey DESC LIMIT ?",
[did, limit],
);
const notes = rows.map(([did, rkey, title, content, publishedAt, createdAt]) => ({
did,
rkey,
title,
content,
publishedAt,
createdAt,
}));
return {
notes,
cursor: notes.length === limit ? notes[notes.length - 1].rkey : undefined,
};
};
export const upsertNote = (note: Note) => { export const upsertNote = (note: Note) => {
db.query( db.query(
` `