From 764953fcbce76171221b096a738ba6d1cdd8515b Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Date: Thu, 12 Oct 2023 13:14:44 -0400
Subject: [PATCH] Created status and activity ajson endpoints per page

---
 CHANGELOG.md                                  |  3 ++
 config/_default/hugo.toml                     | 13 ++++--
 layouts/_default/single.activity.ajson        |  1 +
 layouts/_default/single.activity_status.ajson |  1 +
 layouts/index.activity_outbox.ajson           | 41 +------------------
 layouts/index.html                            |  4 +-
 layouts/partials/activity.ajson               | 10 +++++
 layouts/partials/status.ajson                 | 41 +++++++++++++++++++
 vercel.json                                   | 26 ++++++++++++
 9 files changed, 95 insertions(+), 45 deletions(-)
 create mode 100644 layouts/_default/single.activity.ajson
 create mode 100644 layouts/_default/single.activity_status.ajson
 create mode 100644 layouts/partials/activity.ajson
 create mode 100644 layouts/partials/status.ajson

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a55283a75..8db1a9ffb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,9 @@
 ## 1.0.2
 
 * Fixed bad id in `/followers` ActivityPub endpoint.
+* Created activity and status pages for each page independent from the outbox.
+    This should enable searches for specific posts to work rather than simply
+    pointing to the main user.
 
 ## 1.0.1
 
diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml
index cfa243db2..ba3f25d02 100644
--- a/config/_default/hugo.toml
+++ b/config/_default/hugo.toml
@@ -12,8 +12,11 @@ enableRobotsTXT = true
 [services.rss]
 limit = 50
 
-[permalinks]
-post = "/:title/"
+# [permalinks]
+# [permalinks.page]
+# news = "/:section/:slug/"
+# projects = "/:section/:slug/"
+# resource = "/:section/:slug/"
 
 [taxonimies]
 tag = "tags"
@@ -39,11 +42,15 @@ baseName = "outbox"
 mediaType = "application/json"
 notAlternative = true
 baseName = "manifest"
+[outputFormats.ACTIVITY_STATUS]
+mediaType = "application/activity+json"
+notAlternative = true
+baseName = "status"
 
 [outputs]
 home = ["HTML", "RSS", "ACTIVITY", "ACTIVITY_OUTBOX", "MANIFEST"]
 section = ["HTML", "RSS"]
-page = ["HTML"]
+page = ["HTML", "ACTIVITY_STATUS", "ACTIVITY"]
 
 [related]
 # Only include matches with rank >= threshold. This is a normalized rank between 0 and 100.
diff --git a/layouts/_default/single.activity.ajson b/layouts/_default/single.activity.ajson
new file mode 100644
index 000000000..2497ee7c4
--- /dev/null
+++ b/layouts/_default/single.activity.ajson
@@ -0,0 +1 @@
+{{ partial "activity.ajson" . }}
diff --git a/layouts/_default/single.activity_status.ajson b/layouts/_default/single.activity_status.ajson
new file mode 100644
index 000000000..d907084b2
--- /dev/null
+++ b/layouts/_default/single.activity_status.ajson
@@ -0,0 +1 @@
+{{ partial "status.ajson" . }}
diff --git a/layouts/index.activity_outbox.ajson b/layouts/index.activity_outbox.ajson
index 0ebe9780e..1bced6bf1 100644
--- a/layouts/index.activity_outbox.ajson
+++ b/layouts/index.activity_outbox.ajson
@@ -16,46 +16,7 @@
   "orderedItems": [
   {{ range $index, $element := $all  }}
     {{- if ne $index 0 }}, {{ end }}
-    {
-      "@context": "https://www.w3.org/ns/activitystreams",
-      "id": "{{.Permalink}}-create",
-      "type": "Create",
-      "actor": "{{ .Site.BaseURL }}{{ site.Params.apUser | lower}}",
-      "object": {
-        "id": "{{ .Permalink }}",
-        "type": "Note",
-        "content": {{ printf "\"" | safeHTML }}<b>{{.Title}}</b>{{ if .Summary }}<br>{{ replace (replace .Summary "\n" "<br>") "\r" "" | safeHTML}}{{ end }}<br><br>Read more here:<br><a href='{{.Permalink}}'>{{.Permalink}}</a><br><br>{{ if .Site.Params.renderArticleHashtags }}{{ if .Params.tags }}{{ range $indexArticleTags, $elementArticleTag := .Params.tags }}{{ if ne $indexArticleTags 0 }} {{ end }}<a href='{{ site.BaseURL }}tags/{{ $elementArticleTag | lower }}' class='mention hashtag' rel='tag'>#<span>{{ $elementArticleTag }}</span></a>{{ end }}{{ end }}{{ end }} {{ if .Site.Params.renderDefaultHashtags }}{{ if .Site.Params.postHashtags }}{{ range $indexTags, $elementTag := .Site.Params.postHashtags }}{{ if ne $indexTags 0 }} {{ end }}<a href='#' class='mention hashtag' rel='tag'>#<span>{{ $elementTag }}</span></a>{{ end }}{{ end }}{{ end }}{{ printf "\"" | safeHTML }},
-        "url": "{{.Permalink}}",
-        "attributedTo": "{{ .Site.BaseURL }}{{ site.Params.apUser | lower}}",
-        "to": "https://www.w3.org/ns/activitystreams#Public",
-        {{ if (or (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) (and .Params.tags .Site.Params.renderArticleHashtags)) }}
-        "tag": [
-          {{- if (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) }}
-          {{- range $indexTags, $elementTag := .Site.Params.postHashtags }}
-          {{- if ne $indexTags 0 }}, {{ end }}
-          {
-            "type": "Hashtag",
-            "href": "{{ site.BaseURL | safeHTML }}tags/{{ $elementTag | lower }}",
-            "name": "#{{ $elementTag }}"
-          }
-          {{- end }}
-          {{- end }}
-          {{- $hasTagContent := (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) }}
-          {{- if (and .Params.tags .Site.Params.renderArticleHashtags) }}
-          {{- range $indexTags, $elementTag := .Params.tags }}
-          {{- if (or (ne $indexTags 0) $hasTagContent) }}, {{ end }}
-          {
-            "type": "Hashtag",
-            "href": "{{ site.BaseURL | safeHTML }}tags/{{ $elementTag | lower }}",
-            "name": "#{{ $elementTag }}"
-          }
-          {{- end }}
-          {{- end }}
-          ],
-        {{- end }}
-        "published": {{ dateFormat "2006-01-02T15:04:05-07:00" .Date | jsonify }}
-      }
-    }
+    {{ partial "activity.ajson" . }}
   {{end}}
   ]
 }
diff --git a/layouts/index.html b/layouts/index.html
index 9eb2d0499..6ba1fb76d 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -1,3 +1,3 @@
-{{ partial "top_home.html" }}
+{{ partial "top_home.html" . }}
 {{ .Content }}
-{{ partial "bottom_home.html" }}
+{{ partial "bottom_home.html" . }}
diff --git a/layouts/partials/activity.ajson b/layouts/partials/activity.ajson
new file mode 100644
index 000000000..983943f59
--- /dev/null
+++ b/layouts/partials/activity.ajson
@@ -0,0 +1,10 @@
+{
+  "@context": "https://www.w3.org/ns/activitystreams",
+  "id": "{{.Permalink}}activity",
+  "type": "Create",
+  "actor": "{{ .Site.BaseURL }}{{ site.Params.apUser | lower}}",
+  "published": {{ dateFormat "2006-01-02T15:04:05-07:00" .Date | jsonify }},
+  "to": [ "https://www.w3.org/ns/activitystreams#Public" ],
+  "cc": [ "{{ .Site.BaseURL }}followers" ],
+  "object": {{ partial "status.ajson" . }}
+}
diff --git a/layouts/partials/status.ajson b/layouts/partials/status.ajson
new file mode 100644
index 000000000..224005107
--- /dev/null
+++ b/layouts/partials/status.ajson
@@ -0,0 +1,41 @@
+{
+  "id": "{{ .Permalink }}",
+  "type": "Note",
+  "summary": null,
+  "inReplyTo": null,
+  "published": {{ dateFormat "2006-01-02T15:04:05-07:00" .Date | jsonify }},
+  "url": "{{.Permalink}}",
+  "attributedTo": "{{ .Site.BaseURL }}{{ site.Params.apUser | lower}}",
+  "to": [ "https://www.w3.org/ns/activitystreams#Public" ],
+  "cc": [ "{{ .Site.BaseURL }}followers" ],
+  "sensitive": false,
+  "atomUri": "{{ .Permalink }}",
+  "inReplyToAtomUri": null,
+  "content": {{ printf "\"" | safeHTML }}<b>{{.Title}}</b>{{ if .Summary }}<br>{{ replace (replace .Summary "\n" "<br>") "\r" "" | safeHTML}}{{ end }}<br><br>Read more here:<br><a href='{{.Permalink}}'>{{.Permalink}}</a><br><br>{{ if .Site.Params.renderArticleHashtags }}{{ if .Params.tags }}{{ range $indexArticleTags, $elementArticleTag := .Params.tags }}{{ if ne $indexArticleTags 0 }} {{ end }}<a href='{{ site.BaseURL }}tags/{{ $elementArticleTag | lower }}' class='mention hashtag' rel='tag'>#<span>{{ $elementArticleTag }}</span></a>{{ end }}{{ end }}{{ end }} {{ if .Site.Params.renderDefaultHashtags }}{{ if .Site.Params.postHashtags }}{{ range $indexTags, $elementTag := .Site.Params.postHashtags }}{{ if ne $indexTags 0 }} {{ end }}<a href='#' class='mention hashtag' rel='tag'>#<span>{{ $elementTag }}</span></a>{{ end }}{{ end }}{{ end }}{{ printf "\"" | safeHTML }},
+  "attachment": [],
+  {{ if (or (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) (and .Params.tags .Site.Params.renderArticleHashtags)) }}
+  "tag": [
+    {{- if (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) }}
+    {{- range $indexTags, $elementTag := .Site.Params.postHashtags }}
+    {{- if ne $indexTags 0 }}, {{ end }}
+    {
+      "type": "Hashtag",
+      "href": "{{ site.BaseURL | safeHTML }}tags/{{ $elementTag | lower }}",
+      "name": "#{{ $elementTag }}"
+    }
+    {{- end }}
+    {{- end }}
+    {{- $hasTagContent := (and .Site.Params.postHashtags .Site.Params.renderDefaultHashtags) }}
+    {{- if (and .Params.tags .Site.Params.renderArticleHashtags) }}
+    {{- range $indexTags, $elementTag := .Params.tags }}
+    {{- if (or (ne $indexTags 0) $hasTagContent) }}, {{ end }}
+    {
+      "type": "Hashtag",
+      "href": "{{ site.BaseURL | safeHTML }}tags/{{ $elementTag | lower }}",
+      "name": "#{{ $elementTag }}"
+    }
+    {{- end }}
+    {{- end }}
+    ]
+  {{- end }}
+}
diff --git a/vercel.json b/vercel.json
index 231d06354..3132c1573 100644
--- a/vercel.json
+++ b/vercel.json
@@ -59,6 +59,32 @@
     {
       "source": "/send-note",
       "destination": "/api/activitypub/sendNote.js"
+    },
+    {
+      "source": "/:pathSection/:pathPage/",
+      "has": [
+        {
+          "type": "header",
+          "key": "Accept",
+          "value": "application/activity+json"
+        }
+      ],
+      "destination": "/:pathSection/:pathPage/status.ajson"
+    },
+    {
+      "source": "/:pathSection/:pathPage/",
+      "has": [
+        {
+          "type": "header",
+          "key": "Accept",
+          "value": "application/json"
+        }
+      ],
+      "destination": "/:pathSection/:pathPage/status.ajson"
+    },
+    {
+      "source": "/:pathSection/:pathPage/activity",
+      "destination": "/:pathSection/:pathPage/activity.ajson"
     }
   ],
   "functions": {
-- 
GitLab