summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/collection/helpers.ts3
-rw-r--r--src/pages/.well-known/webfinger.ts22
-rw-r--r--src/pages/actor.json.ts95
-rw-r--r--src/pages/outbox.json.ts41
4 files changed, 161 insertions, 0 deletions
diff --git a/src/lib/collection/helpers.ts b/src/lib/collection/helpers.ts
index 83eb21d..587180b 100644
--- a/src/lib/collection/helpers.ts
+++ b/src/lib/collection/helpers.ts
@@ -96,6 +96,9 @@ export async function fromPosts<T extends Entry, U>(
const entries = await getCollection<"blog", T>("blog", filter);
return predicate(entries);
}
+export const isEntry = (
+ _entry: CollectionEntry<"blog">,
+): _entry is Entry => true;
export const isOriginal = (
entry: CollectionEntry<"blog">,
): entry is OriginalEntry => entry.data.kind === "original";
diff --git a/src/pages/.well-known/webfinger.ts b/src/pages/.well-known/webfinger.ts
new file mode 100644
index 0000000..5f5ca8e
--- /dev/null
+++ b/src/pages/.well-known/webfinger.ts
@@ -0,0 +1,22 @@
+import type { APIRoute } from "astro";
+import { env } from "../../lib/environment.ts";
+
+const { PUBLIC_SITE_URL } = env;
+const site = new URL(PUBLIC_SITE_URL);
+
+const webfinger = {
+ "subject": "acct:cravodeabril@cravodeabril.pt",
+ "links": [
+ {
+ "rel": "self",
+ "type": "application/activity+json",
+ "href": new URL("actor.json", site),
+ },
+ ],
+};
+
+export const GET: APIRoute = (): Response => {
+ return new Response(JSON.stringify(webfinger), {
+ headers: { "Content-Type": "application/json" },
+ });
+};
diff --git a/src/pages/actor.json.ts b/src/pages/actor.json.ts
new file mode 100644
index 0000000..23e69bb
--- /dev/null
+++ b/src/pages/actor.json.ts
@@ -0,0 +1,95 @@
+import type { APIRoute } from "astro";
+import { env } from "../lib/environment.ts";
+
+const { PUBLIC_SITE_URL, PUBLIC_SITE_TITLE } = env;
+const site = new URL(PUBLIC_SITE_URL);
+
+const actor = {
+ "@context": "https://www.w3.org/ns/activitystreams",
+ id: new URL("actor.json", site).href,
+ type: "Person",
+ preferredUsername: "cravodeabril",
+ inbox: new URL("inbox", site).href,
+ outbox: new URL("outbox.json", site).href,
+ name: PUBLIC_SITE_TITLE,
+ summary: `${PUBLIC_SITE_TITLE} no Fediverse`,
+ publicKey: {
+ id: new URL("actor.json#main-key", site).href,
+ actor: new URL("actor.json", site).href,
+ publicKeyPem: `-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBGL8N9ABEAC7M2bDtOMYFzzj6CvxsD94aBilharzXYvGTw9GbZqfEl8G3xit
+ShGES3LLhOe2lKSSDGCXbYoQ9eVm+gt3riTayFmGsDWaIEmCRobtUZ5AVjl95ds+
+NMOI5AG6fx5DcG1Kg5x5ULHBdD4OFUtG1uM2WsviGVVroZl9PJLXW1jEiTbBGKjM
+KHyhydjYJ5ZEjRNWhKlxplO83P6CwREQwCX7yliSqpiGIHH1h8Lf+2pmv1AzWelL
+2RXyX7qekcaTpihpGgA5luUCCKk2C8mV9QMnRSbKFKT/r3FWmHX8X8TYnRUYaoYL
+M/FkWeUCJoYQEjQMFKgWTBnZiW29FtwYX3streO7/+abWUzsAWG0euDeSuNm1VCR
+jafMegr+ihpWqB9YL6aAYcmO7vDQ1sqMKALjt2bHrtJsGjM/qzSFH1IK38koQ9IR
+8Or6/sPStS9t5ug4968NPAC17j+I7nUqE6AAdkP8T9FTn/m6mdZOKxcMPTgrPM6a
+s3LTRKwueMZ4SA+Gs7ZfFGYsl9uG5g5v85N+/abdC3oNkS4ikVSTp0M18w5Ywgdy
+JXsnAPM1mz/XTCNu6vYT8JpRw5xsfNgc8cL/h6vY317DScABIlZ5uLTXMaqlEiZb
+L3QyPnNKyLM+D/2Vh0j7nNzzydREpaCLSPFzfi9T6bLHCFzPOMGtSThCvQARAQAB
+tFtKb8OjbyBBdWd1c3RvIENvc3RhIEJyYW5jbyBNYXJhZG8gVG9ycmVzIChodHRw
+czovL2NyYXZvZGVhYnJpbC5wdCkgPHRvcnJlcy5kZXZAZGlzcm9vdC5vcmc+iQJa
+BBMBCABEAhsDBQkGMQ/6BQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEE0vD/
+OlpfIlcPSxI48oBRM0M48CEFAmgtFK8CGQEACgkQ8oBRM0M48CHvdRAAjPnDFuXY
+oGiDHEjHaLemBwL6WC6ct7e/20V70uzmyRspl24boJS8e+1YpLi7yjKiGidq3VqB
+YhZkR/8mPJ+2/zY6+4Qt1Nj9rJd4+GiWW3jd2sXlUwh7OEHZY4yS4bcrGSXnhLS2
+NHz+bQ1ICMzYbhNZTFTIaO4hEB/9IANejSCJI+OKjW8v0Ae+W47kqt4ZT/g31YiI
+0HNGnlQB6ZRV89fcHXpTR1E6Yr6XT+EBr22ziaAZlhBPdYaiP7WZUTub6fE4bkkW
+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
+zUSvXg==
+=6+uu
+-----END PGP PUBLIC KEY BLOCK-----`,
+ },
+};
+
+export const GET: APIRoute = (): Response => {
+ return new Response(JSON.stringify(actor), {
+ headers: { "Content-Type": "application/activity+json" },
+ });
+};
diff --git a/src/pages/outbox.json.ts b/src/pages/outbox.json.ts
new file mode 100644
index 0000000..cec761e
--- /dev/null
+++ b/src/pages/outbox.json.ts
@@ -0,0 +1,41 @@
+import type { APIRoute } from "astro";
+import { env } from "../lib/environment.ts";
+import { fromPosts, isOriginal } from "../lib/collection/helpers.ts";
+
+const { PUBLIC_SITE_URL } = env;
+const site = new URL(PUBLIC_SITE_URL);
+
+const orderedItems = fromPosts(
+ isOriginal,
+ (x) =>
+ x.map(({ id, data, rendered }) => {
+ const { dateCreated, title } = data;
+ return {
+ id: new URL(`blog/read/${id}`, site).href,
+ type: "Create",
+ actor: new URL("actor.json", site).href,
+ published: dateCreated.toISOString(),
+ to: ["https://www.w3.org/ns/activitystreams#Public"],
+ object: {
+ id: new URL(`blog/read/${id}`, site).href,
+ type: "Article",
+ name: title,
+ url: new URL(`blog/read/${id}`, site).href,
+ content: rendered?.html ?? "",
+ },
+ };
+ }),
+);
+const outbox = {
+ "@context": "https://www.w3.org/ns/activitystreams",
+ id: new URL("outbox.json", site).href,
+ type: "OrderedCollection",
+ totalItems: 1,
+ orderedItems,
+};
+
+export const GET: APIRoute = (): Response => {
+ return new Response(JSON.stringify(outbox), {
+ headers: { "Content-Type": "application/activity+json" },
+ });
+};