55 lines
1.6 KiB
Elixir
55 lines
1.6 KiB
Elixir
defmodule NullaWeb.OutboxController do
|
|
use NullaWeb, :controller
|
|
alias Nulla.ActivityPub
|
|
alias Nulla.Models.Actor
|
|
alias Nulla.Models.Note
|
|
alias Nulla.Models.InstanceSettings
|
|
|
|
def outbox(conn, %{"username" => username} = params) do
|
|
case Map.get(params, "page") do
|
|
"true" ->
|
|
instance_settings = InstanceSettings.get_instance_settings!()
|
|
domain = instance_settings.domain
|
|
actor = Actor.get_actor(username, domain)
|
|
max_id = params["max_id"] && String.to_integer(params["max_id"])
|
|
|
|
notes =
|
|
if max_id do
|
|
Note.get_before_notes(actor.id, max_id)
|
|
else
|
|
Note.get_latest_notes(actor.id)
|
|
end
|
|
|
|
items = Enum.map(notes, &ActivityPub.activity_note(&1))
|
|
|
|
next_max_id =
|
|
case List.last(notes) do
|
|
nil -> 0
|
|
last -> last.id
|
|
end
|
|
|
|
min_id =
|
|
case List.first(notes) do
|
|
nil -> 0
|
|
first -> first.id
|
|
end
|
|
|
|
conn
|
|
|> put_resp_content_type("application/activity+json")
|
|
|> send_resp(
|
|
200,
|
|
Jason.encode!(ActivityPub.outbox(domain, username, next_max_id, min_id || 0, items))
|
|
)
|
|
|
|
_ ->
|
|
instance_settings = InstanceSettings.get_instance_settings!()
|
|
domain = instance_settings.domain
|
|
actor = Actor.get_actor(username, domain)
|
|
total = Note.get_total_notes_count(actor.id)
|
|
|
|
conn
|
|
|> put_resp_content_type("application/activity+json")
|
|
|> send_resp(200, Jason.encode!(ActivityPub.outbox(domain, username, total)))
|
|
end
|
|
end
|
|
end
|