diff --git a/lib/nulla_web/components/templates/note/show.html.heex b/lib/nulla_web/components/templates/note/show.html.heex
index 52faab3..453f308 100644
--- a/lib/nulla_web/components/templates/note/show.html.heex
+++ b/lib/nulla_web/components/templates/note/show.html.heex
@@ -15,6 +15,7 @@
diff --git a/lib/nulla_web/controllers/note_controller.ex b/lib/nulla_web/controllers/note_controller.ex
index 1ee7130..bafa1c0 100644
--- a/lib/nulla_web/controllers/note_controller.ex
+++ b/lib/nulla_web/controllers/note_controller.ex
@@ -5,22 +5,40 @@ defmodule NullaWeb.NoteController do
alias Nulla.Models.Note
def show(conn, %{"username" => username, "id" => id}) do
- accept = List.first(get_req_header(conn, "accept"))
- note = Note.get_note(id) |> Repo.preload([:actor, :media_attachments])
+ case Integer.parse(id) do
+ {int_id, ""} ->
+ note = Note.get_note(int_id) |> Repo.preload([:actor, :media_attachments])
- if username != note.actor.preferredUsername do
- conn
- |> put_status(:not_found)
- |> json(%{error: "Not Found"})
- |> halt()
- end
+ cond do
+ is_nil(note) ->
+ conn
+ |> put_status(:not_found)
+ |> json(%{error: "Not Found"})
+ |> halt()
- if accept in ["application/activity+json", "application/ld+json"] do
- conn
- |> put_resp_content_type("application/activity+json")
- |> json(ActivityPub.note(note))
- else
- render(conn, :show, note: note, layout: false)
+ username != note.actor.preferredUsername ->
+ conn
+ |> put_status(:not_found)
+ |> json(%{error: "Not Found"})
+ |> halt()
+
+ true ->
+ accept = List.first(get_req_header(conn, "accept"))
+
+ if accept in ["application/activity+json", "application/ld+json"] do
+ conn
+ |> put_resp_content_type("application/activity+json")
+ |> json(ActivityPub.note(note))
+ else
+ render(conn, :show, note: note, layout: false)
+ end
+ end
+
+ _ ->
+ conn
+ |> put_status(:not_found)
+ |> json(%{error: "Not Found"})
+ |> halt()
end
end
end
diff --git a/test/nulla_web/controllers/note_controller_test.exs b/test/nulla_web/controllers/note_controller_test.exs
index d3f87ee..a4bcf49 100644
--- a/test/nulla_web/controllers/note_controller_test.exs
+++ b/test/nulla_web/controllers/note_controller_test.exs
@@ -71,5 +71,59 @@ defmodule NullaWeb.NoteControllerTest do
assert is_map(response["contentMap"])
assert is_list(response["attachment"])
end
+
+ test "renders HTML if Accept header is regular", %{conn: conn} do
+ {publicKeyPem, _privateKeyPem} = KeyGen.gen()
+
+ {:ok, actor} =
+ Actor.create_actor(%{
+ domain: "localhost",
+ ap_id: "http://localhost/users/test",
+ type: "Person",
+ following: "http://localhost/users/test/following",
+ followers: "http://localhost/users/test/followers",
+ inbox: "http://localhost/users/test/inbox",
+ outbox: "http://localhost/users/test/outbox",
+ featured: "http://localhost/users/test/collections/featured",
+ featuredTags: "http://localhost/users/test/collections/tags",
+ preferredUsername: "test",
+ name: "Test",
+ summary: "Test User",
+ url: "http://localhost/@test",
+ manuallyApprovesFollowers: false,
+ discoverable: true,
+ indexable: true,
+ published: DateTime.utc_now(),
+ memorial: false,
+ publicKey:
+ Jason.OrderedObject.new(
+ id: "http://localhost/users/test#main-key",
+ owner: "http://localhost/users/test",
+ publicKeyPem: publicKeyPem
+ ),
+ endpoints: Jason.OrderedObject.new(sharedInbox: "http://localhost/inbox")
+ })
+
+ note_id = Snowflake.next_id()
+
+ {:ok, note} =
+ Note.create_note(%{
+ id: note_id,
+ url: "#{actor.url}/#{note_id}",
+ content: "Hello World from Nulla!",
+ language: "en",
+ actor_id: actor.id
+ })
+
+ conn = get(conn, ~p"/users/test/notes/#{note.id}")
+
+ assert html_response(conn, 200) =~ note.content
+ end
+
+ test "returns 404 if note not found", %{conn: conn} do
+ conn = get(conn, ~p"/users/test/notes/nonexistent")
+
+ assert json_response(conn, 404)["error"] == "Not Found"
+ end
end
end