bc0f3beed268802128f345e1120acd10716ecb6b
[akkoma] / lib / pleroma / web / metadata.ex
1 defmodule Pleroma.Web.Metadata do
2 alias Phoenix.HTML
3
4 @parsers Pleroma.Config.get([:metadata, :providers], [])
5 def get_cached_tags(%{activity: activity, user: user} = params) do
6 # We don't need to use the both activity and a user since the object can't change it's content
7 key = "#{:erlang.term_to_binary(user)}#{activity.data["id"]}"
8
9 Cachex.fetch!(:metadata_cache, key, fn _key ->
10 {:commit, build_tags(params)}
11 end)
12 end
13
14 def get_cached_tags(%{user: user} = params) do
15 # I am unsure how well ETS works with big keys
16 key = :erlang.term_to_binary(user)
17
18 Cachex.fetch!(:metadata_cache, key, fn _key ->
19 {:commit, build_tags(params)}
20 end)
21 end
22
23 def build_tags(params) do
24 Enum.reduce(@parsers, "", fn parser, acc ->
25 rendered_html =
26 params
27 |> parser.build_tags()
28 |> Enum.map(&to_tag/1)
29 |> Enum.map(&HTML.safe_to_string/1)
30 |> Enum.join()
31
32 acc <> rendered_html
33 end)
34 end
35
36 def to_tag(data) do
37 with {name, attrs, _content = []} <- data do
38 HTML.Tag.tag(name, attrs)
39 else
40 {name, attrs, content} ->
41 HTML.Tag.content_tag(name, content, attrs)
42
43 _ ->
44 raise ArgumentError, message: "make_tag invalid args"
45 end
46 end
47 end