Show group address in group metadata
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -187,7 +187,7 @@ defmodule Mobilizon.Actors do
|
||||
def get_actor_by_name_with_preload(name, type \\ nil) do
|
||||
name
|
||||
|> get_actor_by_name(type)
|
||||
|> Repo.preload([:organized_events, :user])
|
||||
|> Repo.preload([:organized_events, :user, :physical_address])
|
||||
end
|
||||
|
||||
@doc """
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
defimpl Mobilizon.Service.Metadata, for: Mobilizon.Actors.Actor do
|
||||
alias Phoenix.HTML
|
||||
alias Phoenix.HTML.Tag
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Web.JsonLD.ObjectView
|
||||
alias Mobilizon.Web.MediaProxy
|
||||
|
||||
def build_tags(%Actor{} = actor, _locale \\ "en") do
|
||||
tags = [
|
||||
[
|
||||
Tag.tag(:meta, property: "og:title", content: Actor.display_name_and_username(actor)),
|
||||
Tag.tag(:meta, property: "og:url", content: actor.url),
|
||||
Tag.tag(:meta, property: "og:description", content: actor.summary),
|
||||
@@ -12,7 +14,12 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Actors.Actor do
|
||||
Tag.tag(:meta, property: "profile:username", content: actor.preferred_username),
|
||||
Tag.tag(:meta, property: "twitter:card", content: "summary")
|
||||
]
|
||||
|> maybe_add_avatar(actor)
|
||||
|> maybe_add_group_schema(actor)
|
||||
end
|
||||
|
||||
@spec maybe_add_avatar(list(Tag.t()), Actor.t()) :: list(Tag.t())
|
||||
defp maybe_add_avatar(tags, actor) do
|
||||
if is_nil(actor.avatar) do
|
||||
tags
|
||||
else
|
||||
@@ -20,4 +27,17 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Actors.Actor do
|
||||
[Tag.tag(:meta, property: "og:image", content: actor.avatar.url |> MediaProxy.url())]
|
||||
end
|
||||
end
|
||||
|
||||
defp maybe_add_group_schema(tags, %Actor{type: :Group} = group) do
|
||||
tags ++ [~s{<script type="application/ld+json">#{json(group)}</script>} |> HTML.raw()]
|
||||
end
|
||||
|
||||
defp maybe_add_group_schema(tags, _), do: tags
|
||||
|
||||
# Insert JSON-LD schema by hand because Tag.content_tag wants to escape it
|
||||
defp json(%Actor{} = group) do
|
||||
"group.json"
|
||||
|> ObjectView.render(%{group: group})
|
||||
|> Jason.encode!()
|
||||
end
|
||||
end
|
||||
|
||||
2
lib/web/cache/activity_pub.ex
vendored
2
lib/web/cache/activity_pub.ex
vendored
@@ -23,7 +23,7 @@ defmodule Mobilizon.Web.Cache.ActivityPub do
|
||||
{:commit, Actor.t()} | {:ignore, nil}
|
||||
def get_actor_by_name(name) do
|
||||
Cachex.fetch(@cache, "actor_" <> name, fn "actor_" <> name ->
|
||||
case Actors.get_actor_by_name(name) do
|
||||
case Actors.get_actor_by_name_with_preload(name) do
|
||||
%Actor{} = actor ->
|
||||
{:commit, actor}
|
||||
|
||||
|
||||
@@ -157,12 +157,7 @@ defmodule Mobilizon.Web.PageController do
|
||||
defp is_local?(%{local: local}), do: if(local, do: true, else: :remote)
|
||||
defp is_local?(_), do: false
|
||||
|
||||
defp maybe_add_noindex_header(conn, %Event{visibility: visibility})
|
||||
when visibility != :public do
|
||||
put_resp_header(conn, "x-robots-tag", "noindex")
|
||||
end
|
||||
|
||||
defp maybe_add_noindex_header(conn, %Post{visibility: visibility})
|
||||
defp maybe_add_noindex_header(conn, %{visibility: visibility})
|
||||
when visibility != :public do
|
||||
put_resp_header(conn, "x-robots-tag", "noindex")
|
||||
end
|
||||
|
||||
@@ -8,6 +8,16 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do
|
||||
alias Mobilizon.Web.JsonLD.ObjectView
|
||||
alias Mobilizon.Web.MediaProxy
|
||||
|
||||
def render("group.json", %{group: %Actor{} = group}) do
|
||||
%{
|
||||
"@context" => "http://schema.org",
|
||||
"@type" => "Organization",
|
||||
"url" => group.url,
|
||||
"name" => group.name || group.preferred_username,
|
||||
"address" => render_address(group)
|
||||
}
|
||||
end
|
||||
|
||||
def render("event.json", %{event: %Event{} = event}) do
|
||||
organizer = %{
|
||||
"@type" => if(event.organizer_actor.type == :Group, do: "Organization", else: "Person"),
|
||||
@@ -56,14 +66,18 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do
|
||||
%{
|
||||
"@type" => "Place",
|
||||
"name" => address.description,
|
||||
"address" => %{
|
||||
"@type" => "PostalAddress",
|
||||
"streetAddress" => address.street,
|
||||
"addressLocality" => address.locality,
|
||||
"postalCode" => address.postal_code,
|
||||
"addressRegion" => address.region,
|
||||
"addressCountry" => address.country
|
||||
}
|
||||
"address" => render_one(address, ObjectView, "address.json", as: :address)
|
||||
}
|
||||
end
|
||||
|
||||
def render("address.json", %{address: %Address{} = address}) do
|
||||
%{
|
||||
"@type" => "PostalAddress",
|
||||
"streetAddress" => address.street,
|
||||
"addressLocality" => address.locality,
|
||||
"postalCode" => address.postal_code,
|
||||
"addressRegion" => address.region,
|
||||
"addressCountry" => address.country
|
||||
}
|
||||
end
|
||||
|
||||
@@ -81,7 +95,7 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do
|
||||
}
|
||||
end
|
||||
|
||||
defp render_location(%Event{physical_address: %Address{} = address}),
|
||||
defp render_location(%{physical_address: %Address{} = address}),
|
||||
do: render_one(address, ObjectView, "place.json", as: :address)
|
||||
|
||||
# For now the Virtual Location of an event is it's own URL,
|
||||
@@ -92,4 +106,11 @@ defmodule Mobilizon.Web.JsonLD.ObjectView do
|
||||
"url" => event_url
|
||||
}
|
||||
end
|
||||
|
||||
defp render_location(_), do: nil
|
||||
|
||||
defp render_address(%{physical_address: %Address{} = address}),
|
||||
do: render_one(address, ObjectView, "address.json", as: :address)
|
||||
|
||||
defp render_address(_), do: nil
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user