This commit is contained in:
Mirai Kumiko 2025-06-19 17:21:52 +02:00
parent f963620cf0
commit 43ee272ca1
Signed by: miraikumiko
GPG key ID: 3F178B1B5E0CB278
3 changed files with 87 additions and 14 deletions

View file

@ -15,6 +15,7 @@
</div> </div>
</div> </div>
<div class="relative border border-gray-300 shadow-md mt-5 rounded-t-xl overflow-hidden"> <div class="relative border border-gray-300 shadow-md mt-5 rounded-t-xl overflow-hidden">
{@note.content}
</div> </div>
<div class="flex flex-col items-center mt-5 gap-5"> <div class="flex flex-col items-center mt-5 gap-5">
<div class="text-sm rounded-xl border border-gray-300 p-4 w-[90%] h-[300px]"></div> <div class="text-sm rounded-xl border border-gray-300 p-4 w-[90%] h-[300px]"></div>

View file

@ -5,22 +5,40 @@ defmodule NullaWeb.NoteController do
alias Nulla.Models.Note alias Nulla.Models.Note
def show(conn, %{"username" => username, "id" => id}) do def show(conn, %{"username" => username, "id" => id}) do
accept = List.first(get_req_header(conn, "accept")) case Integer.parse(id) do
note = Note.get_note(id) |> Repo.preload([:actor, :media_attachments]) {int_id, ""} ->
note = Note.get_note(int_id) |> Repo.preload([:actor, :media_attachments])
if username != note.actor.preferredUsername do cond do
conn is_nil(note) ->
|> put_status(:not_found) conn
|> json(%{error: "Not Found"}) |> put_status(:not_found)
|> halt() |> json(%{error: "Not Found"})
end |> halt()
if accept in ["application/activity+json", "application/ld+json"] do username != note.actor.preferredUsername ->
conn conn
|> put_resp_content_type("application/activity+json") |> put_status(:not_found)
|> json(ActivityPub.note(note)) |> json(%{error: "Not Found"})
else |> halt()
render(conn, :show, note: note, layout: false)
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 end
end end

View file

@ -71,5 +71,59 @@ defmodule NullaWeb.NoteControllerTest do
assert is_map(response["contentMap"]) assert is_map(response["contentMap"])
assert is_list(response["attachment"]) assert is_list(response["attachment"])
end 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
end end