defmodule MobilizonWeb.PageView do @moduledoc """ View for our webapp """ use MobilizonWeb, :view alias Mobilizon.Actors.Actor alias Mobilizon.Service.ActivityPub.Utils alias Mobilizon.Service.Metadata alias Mobilizon.Service.MetadataUtils def render("actor.activity-json", %{conn: %{assigns: %{object: actor}}}) do public_key = Mobilizon.Service.ActivityPub.Utils.pem_to_public_key_pem(actor.keys) %{ "id" => Actor.build_url(actor.preferred_username, :page), "type" => "Person", "following" => Actor.build_url(actor.preferred_username, :following), "followers" => Actor.build_url(actor.preferred_username, :followers), "inbox" => Actor.build_url(actor.preferred_username, :inbox), "outbox" => Actor.build_url(actor.preferred_username, :outbox), "preferredUsername" => actor.preferred_username, "name" => actor.name, "summary" => actor.summary, "url" => actor.url, "manuallyApprovesFollowers" => actor.manually_approves_followers, "publicKey" => %{ "id" => "#{actor.url}#main-key", "owner" => actor.url, "publicKeyPem" => public_key }, # TODO : Make have actors have an uuid # "uuid" => actor.uuid "endpoints" => %{ "sharedInbox" => actor.shared_inbox_url } # "icon" => %{ # "type" => "Image", # "url" => User.avatar_url(actor) # }, # "image" => %{ # "type" => "Image", # "url" => User.banner_url(actor) # } } |> Map.merge(Utils.make_json_ld_header()) end def render("event.activity-json", %{conn: %{assigns: %{object: event}}}) do event = Mobilizon.Service.ActivityPub.Converters.Event.model_to_as(event) {:ok, html, []} = Earmark.as_html(event["summary"]) %{ "type" => "Event", "attributedTo" => event["actor"], "id" => event["id"], "name" => event["title"], "category" => event["category"], "content" => html, "source" => %{ "content" => event["summary"], "mediaType" => "text/markdown" }, "mediaType" => "text/html", "published" => event["publish_at"], "updated" => event["updated_at"] } |> Map.merge(Utils.make_json_ld_header()) end def render("comment.activity-json", %{conn: %{assigns: %{object: comment}}}) do comment = Mobilizon.Service.ActivityPub.Converters.Comment.model_to_as(comment) %{ "actor" => comment["actor"], "uuid" => comment["uuid"], # The activity should have attributedTo, not the comment itself # "attributedTo" => comment.attributed_to, "type" => "Note", "id" => comment["id"], "content" => comment["content"], "mediaType" => "text/html" # "published" => Timex.format!(comment.inserted_at, "{ISO:Extended}"), # "updated" => Timex.format!(comment.updated_at, "{ISO:Extended}") } |> Map.merge(Utils.make_json_ld_header()) end def render(page, %{object: object} = _assigns) when page in ["actor.html", "event.html", "comment.html"] do with {:ok, index_content} <- File.read(index_file_path()) do tags = object |> Metadata.build_tags() |> MetadataUtils.stringify_tags() index_content = String.replace(index_content, "", tags) {:safe, index_content} end end def render("index.html", _assigns) do with {:ok, index_content} <- File.read(index_file_path()) do {:safe, index_content} end end defp index_file_path() do Path.join(Application.app_dir(:mobilizon, "priv/static"), "index.html") end end