65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import { Application, Router } from "@oak/oak";
|
|
import { deleteNote, getNotes, getNotesByDid } from "./src/data/db.ts";
|
|
import { authenticateRequest } from "./src/auth/verify.ts";
|
|
|
|
const router = new Router();
|
|
|
|
const PAGINATION = 20
|
|
|
|
router.get("/", (ctx) => {
|
|
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")) || PAGINATION;
|
|
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")) || PAGINATION;
|
|
ctx.response.body = getNotesByDid(did, cursor, limit);
|
|
});
|
|
|
|
router.delete("/:did/:rkey", async (ctx) => {
|
|
const { did, rkey } = ctx.params;
|
|
let verifiedDid: string;
|
|
try {
|
|
verifiedDid = await authenticateRequest(
|
|
ctx.request.headers.get("Authorization"),
|
|
);
|
|
} catch {
|
|
ctx.response.status = 401;
|
|
ctx.response.body = { error: "Unauthorized" };
|
|
return;
|
|
}
|
|
if (verifiedDid !== did) {
|
|
ctx.response.status = 403;
|
|
ctx.response.body = { error: "You can only delete your own notes" };
|
|
return;
|
|
}
|
|
deleteNote({ did, rkey });
|
|
ctx.response.status = 204;
|
|
})
|
|
|
|
const app = new Application();
|
|
|
|
app.use(async (ctx, next) => {
|
|
ctx.response.headers.set("Access-Control-Allow-Origin", "*");
|
|
ctx.response.headers.set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
|
ctx.response.headers.set("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
if (ctx.request.method === "OPTIONS") {
|
|
ctx.response.status = 204;
|
|
return;
|
|
}
|
|
await next();
|
|
});
|
|
|
|
app.use(router.routes());
|
|
app.use(router.allowedMethods());
|
|
|
|
console.log("[server] listening on port 8080");
|
|
app.listen({ port: 8080 });
|