From e3a3d2f806ece9e722c1e04dbd21c24598a71c01 Mon Sep 17 00:00:00 2001 From: Yusuf Bouzekri Date: Tue, 26 Mar 2024 14:43:52 +0100 Subject: [PATCH] Accept JSON sending --- db/config.ts | 11 ++++++----- src/pages/api/micropub.ts | 41 +++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/db/config.ts b/db/config.ts index 3e3fc93..134b324 100644 --- a/db/config.ts +++ b/db/config.ts @@ -1,12 +1,13 @@ -import { column, defineDb, defineTable } from 'astro:db'; +import { column, defineDb, defineTable } from "astro:db"; +import dayjs from "dayjs"; const Note = defineTable({ columns: { content: column.text(), - published: column.number() - } -}) + published: column.number({ default: dayjs().unix() }), + }, +}); export default defineDb({ - tables: { Note } + tables: { Note }, }); diff --git a/src/pages/api/micropub.ts b/src/pages/api/micropub.ts index 7a520b0..ad3d2b2 100644 --- a/src/pages/api/micropub.ts +++ b/src/pages/api/micropub.ts @@ -18,10 +18,11 @@ interface ErrorIndieToken { type IndieTokenResponse = SuccessfulIndieToken | ErrorIndieToken; -function Error(code: number, message?: string) { +function Respond(code: number, message?: string, headers?: HeadersInit) { return new Response(null, { statusText: message ?? undefined, status: code, + headers: headers ?? undefined, }); } function hasOwnProperty( @@ -56,12 +57,12 @@ export async function POST({ request, site, url }: APIContext) { // NOTE: rejecting multiple authentication attempts as per RFC 6750 if (headerAuthToken && bodyAuthToken) { - return Error(400, "invalid request"); + return Respond(400, "invalid request"); } const authToken = headerAuthToken || bodyAuthToken; - if (!authToken) return Error(401); + if (!authToken) return Respond(401); const res = await fetch("https://tokens.indieauth.com/token", { method: "GET", @@ -78,29 +79,31 @@ export async function POST({ request, site, url }: APIContext) { console.log("hello world"); if (contentType === "application/x-www-form-urlencoded") { - if (!hasOwnProperty(formBodyObject, "content")) { - return Error(422); - } - const sinceEpoch = dayjs().unix(); + if (!hasOwnProperty(formBodyObject, "content")) return Respond(422); const records = await db .insert(Note) - .values({ - content: formBodyObject.content, - published: sinceEpoch, - }) + .values({ content: formBodyObject.content }) .returning(); - console.log(records); - return new Response(null, { - statusText: "Created", - status: 201, - headers: { - Location: "https://yusuf.fyi/notes/" + records[0].published, - }, + return Respond(201, "Created", { + Location: "https://yusuf.fyi/notes/" + records[0].published, }); } + if (contentType === "application/json") { + const body = await request.json(); + if (typeof body.properties.content[0] === "string") { + const records = await db + .insert(Note) + .values({ content: body.properties.content[0] }) + .returning(); + + return Respond(201, "Created", { + Location: "https://yusuf.fyi/notes/" + records[0].published, + }); + } + } } else { - return Error(401, "invalid token"); + return Respond(401, "invalid token"); } }