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