fix(backend): fix config cache not being used everytime

When loading a page, we inject various meta tags in the HTML. These made database calls everytime

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2023-08-17 13:16:58 +02:00
parent a6721ec4ae
commit ed3cd5858c
No known key found for this signature in database
GPG key ID: A061B9DDE0CA0773
4 changed files with 100 additions and 64 deletions

View file

@ -1,45 +1,20 @@
02CE4963DFD1B0D6D5C567357CAFFE97
155A1FB53DE39EC8EFCFD7FB94EA823D 155A1FB53DE39EC8EFCFD7FB94EA823D
2262742E5C8944D5BF6698EC61F5DE50 1C29EE70E90ECED01AF28EC58D2575B5
25BEE162A99754480967216281E9EF33 31CE26BC979C57B9E3CC97B40C290CE5
2A6F71CD6F1246F0B152C2376E2E398A 3529E7A4CECC24D02678820E6F521162
30552A09D485A6AA73401C1D54F63C21 4A4B7002DEB734A943B467DF7D2BD1AA
52900CE4EE3598F6F178A651FB256770 4E7C044C59E0BCB76AA826789998F624
6151F44368FC19F2394274F513C29151 53CBBEB6243FAF5C37249CBA17DE6F4C
765526195D4C6D770EAF4DC944A8CBF4 5BCE3651A03711295046DE48BDFE007E
B2FF1A12F13B873507C85091688C1D6D 630C0972985257251EDF89A7117DE423
B9AF8A342CD7FF39E10CC10A408C28E1 8274AF29B81EC7CF7F585D5EED8A64E1
C042E87389F7BDCFF4E076E95731AE69 94ACF7B17C3FF42F64E57DD1DA936BD8
C42BFAEF7100F57BED75998B217C857A A32E125003F1EDFAD95C487C6A969725
D11958E86F1B6D37EF656B63405CA8A4 ACF6272A1DBB3A2ABD96C0C120B5CA69
F16F054F2628609A726B9FF2F089D484 C46C4893B2F702ACADC4CAA5683FE370
26E816A7B054CB0347A2C6451F03B92B CDF2CCE0CF10F49CDFAE22FE26208155
2B76BDDB2BB4D36D69FAE793EBD63894 E720CB13C50FF3ADEE7C522531E11217
301A837DE24C6AEE1DA812DF9E5486C1 E8FC5F2C5DEA6671BA596B022C4FE6F2
395A2740CB468F93F6EBE6E90EE08291 F3D5851D3FB050939841ED2F14307A27
4013C9866943B9381D9F9F97027F88A9 FD1C9756370A195B74E95CE504C45E9E
4C796DD588A4B1C98E86BBCD0349949A
51289D8D7BDB59CB6473E0DED0591ED7
5A70DC86895DB3610C605EA9F31ED300
705C17F9C852F546D886B20DB2C4D0D1
75D2074B6F771BA8C032008EC18CABDF
7B1C6E35A374C38FF5F07DBF23B3EAE2
955ACF52ADD8FCAA450FB8138CB1FD1A
A092A563729E1F2C1C8D5D809A31F754
BFA12FDEDEAD7DEAB6D44DF6FDFBD5E1
D9A08930F140F9BA494BB90B3F812C87
FE1EEB91EA633570F703B251AE2D4D4E
02B15A0FE85181E2470E4E1E6740DFF6
128653EA565172F81FD177D1D6491CF3
2EB031217231C480C89EA0C1576EF3CA
39CFFBCF3FD4F6DB0E4DE4A9A78D3961
40C6EAD7C05ABB6A85BB904589DEF72F
49DE9560D506F9E7EF3AFD8DA6E5564B
759F752FA0768CCC7871895DC2A5CD51
7EEC79571F3F7CEEB04A8B86D908382A
E7967805C1EA5301F2722C7BDB2F25F3
BDFB0FB1AAF69C18212CBCFD42F8B717
40220A533CCACB3A1CE9DBF1A8A430A1
EEB29D1DDA3A3015BC645A989B5BD38E
5AEE3C678C80E0389C3B0D9D11886EB6

View file

@ -273,7 +273,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
|> Enum.into(%{}), |> Enum.into(%{}),
:ok <- eventually_update_instance_actor(res) do :ok <- eventually_update_instance_actor(res) do
Config.clear_config_cache() Config.clear_config_cache()
Cachex.put(:config, :admin_config, res)
{:ok, res} {:ok, res}
end end

View file

@ -78,6 +78,11 @@ defmodule Mobilizon.Admin do
defp stringify_struct(struct), do: struct defp stringify_struct(struct), do: struct
@spec get_all_admin_settings :: list(Setting.t())
def get_all_admin_settings do
Repo.all(Setting)
end
@spec get_admin_setting_value(String.t(), String.t(), String.t() | nil) :: @spec get_admin_setting_value(String.t(), String.t(), String.t() | nil) ::
String.t() | boolean() | nil | map() | list() String.t() | boolean() | nil | map() | list()
def get_admin_setting_value(group, name, fallback \\ nil) def get_admin_setting_value(group, name, fallback \\ nil)

View file

@ -4,6 +4,7 @@ defmodule Mobilizon.Config do
""" """
alias Mobilizon.Actors alias Mobilizon.Actors
alias Mobilizon.Admin.Setting
alias Mobilizon.Service.GitStatus alias Mobilizon.Service.GitStatus
require Logger require Logger
import Mobilizon.Service.Export.Participants.Common, only: [enabled_formats: 0] import Mobilizon.Service.Export.Participants.Common, only: [enabled_formats: 0]
@ -28,10 +29,67 @@ defmodule Mobilizon.Config do
@spec instance_config :: mobilizon_config @spec instance_config :: mobilizon_config
def instance_config, do: Application.get_env(:mobilizon, :instance) def instance_config, do: Application.get_env(:mobilizon, :instance)
@spec db_instance_config :: list(Setting.t())
def db_instance_config, do: Mobilizon.Admin.get_all_admin_settings()
@spec config_cache :: map()
def config_cache do
case Cachex.fetch(:config, :all_db_config, fn _key ->
value =
Enum.reduce(
Mobilizon.Admin.get_all_admin_settings(),
%{},
&arrange_values/2
)
{:commit, value}
end) do
{status, value} when status in [:ok, :commit] -> value
_err -> %{}
end
end
@spec arrange_values(Setting.t(), map()) :: map()
defp arrange_values(setting, acc) do
{_, new_data} =
Map.get_and_update(acc, setting.group, fn current_value ->
new_value = current_value || %{}
{current_value, Map.put(new_value, setting.name, process_value(setting.value))}
end)
new_data
end
@spec process_value(String.t() | nil) :: any()
defp process_value(nil), do: nil
defp process_value(""), do: nil
defp process_value(value) do
case Jason.decode(value) do
{:ok, val} ->
val
{:error, _} ->
case value do
"true" -> true
"false" -> false
value -> value
end
end
end
@spec config_cached_value(String.t(), String.t(), String.t()) :: any()
def config_cached_value(group, name, fallback \\ nil) do
config_cache()
|> Map.get(group, %{})
|> Map.get(name, fallback)
end
@spec instance_name :: String.t() @spec instance_name :: String.t()
def instance_name, def instance_name,
do: do:
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"instance_name", "instance_name",
instance_config()[:name] instance_config()[:name]
@ -40,7 +98,7 @@ defmodule Mobilizon.Config do
@spec instance_description :: String.t() @spec instance_description :: String.t()
def instance_description, def instance_description,
do: do:
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"instance_description", "instance_description",
instance_config()[:description] instance_config()[:description]
@ -49,37 +107,37 @@ defmodule Mobilizon.Config do
@spec instance_long_description :: String.t() @spec instance_long_description :: String.t()
def instance_long_description, def instance_long_description,
do: do:
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"instance_long_description" "instance_long_description"
) )
@spec instance_slogan :: String.t() | nil @spec instance_slogan :: String.t() | nil
def instance_slogan, do: Mobilizon.Admin.get_admin_setting_value("instance", "instance_slogan") def instance_slogan, do: config_cached_value("instance", "instance_slogan")
@spec contact :: String.t() | nil @spec contact :: String.t() | nil
def contact do def contact do
Mobilizon.Admin.get_admin_setting_value("instance", "contact") config_cached_value("instance", "contact")
end end
@spec instance_terms(String.t()) :: String.t() @spec instance_terms(String.t()) :: String.t()
def instance_terms(locale \\ "en") do def instance_terms(locale \\ "en") do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_terms", generate_terms(locale)) config_cached_value("instance", "instance_terms", generate_terms(locale))
end end
@spec instance_terms_type :: String.t() @spec instance_terms_type :: String.t()
def instance_terms_type do def instance_terms_type do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_terms_type", "DEFAULT") config_cached_value("instance", "instance_terms_type", "DEFAULT")
end end
@spec instance_terms_url :: String.t() | nil @spec instance_terms_url :: String.t() | nil
def instance_terms_url do def instance_terms_url do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_terms_url") config_cached_value("instance", "instance_terms_url")
end end
@spec instance_privacy(String.t()) :: String.t() @spec instance_privacy(String.t()) :: String.t()
def instance_privacy(locale \\ "en") do def instance_privacy(locale \\ "en") do
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"instance_privacy_policy", "instance_privacy_policy",
generate_privacy(locale) generate_privacy(locale)
@ -88,17 +146,17 @@ defmodule Mobilizon.Config do
@spec instance_privacy_type :: String.t() @spec instance_privacy_type :: String.t()
def instance_privacy_type do def instance_privacy_type do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_privacy_policy_type", "DEFAULT") config_cached_value("instance", "instance_privacy_policy_type", "DEFAULT")
end end
@spec instance_privacy_url :: String.t() @spec instance_privacy_url :: String.t()
def instance_privacy_url do def instance_privacy_url do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_privacy_policy_url") config_cached_value("instance", "instance_privacy_policy_url")
end end
@spec instance_rules :: String.t() @spec instance_rules :: String.t()
def instance_rules do def instance_rules do
Mobilizon.Admin.get_admin_setting_value("instance", "instance_rules") config_cached_value("instance", "instance_rules")
end end
@spec instance_version :: String.t() @spec instance_version :: String.t()
@ -113,7 +171,7 @@ defmodule Mobilizon.Config do
def instance_registrations_open?, def instance_registrations_open?,
do: do:
to_boolean( to_boolean(
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"registrations_open", "registrations_open",
instance_config()[:registrations_open] instance_config()[:registrations_open]
@ -123,7 +181,7 @@ defmodule Mobilizon.Config do
@spec instance_languages :: list(String.t()) @spec instance_languages :: list(String.t())
def instance_languages, def instance_languages,
do: do:
Mobilizon.Admin.get_admin_setting_value( config_cached_value(
"instance", "instance",
"instance_languages", "instance_languages",
instance_config()[:languages] instance_config()[:languages]
@ -322,8 +380,6 @@ defmodule Mobilizon.Config do
@spec anonymous_actor_id :: integer @spec anonymous_actor_id :: integer
def anonymous_actor_id, do: get_cached_value(:anonymous_actor_id) def anonymous_actor_id, do: get_cached_value(:anonymous_actor_id)
@spec admin_settings :: map
def admin_settings, do: get_cached_value(:admin_config)
@spec get(keys :: module | atom | [module | atom]) :: any @spec get(keys :: module | atom | [module | atom]) :: any
def get(key), do: get(key, nil) def get(key), do: get(key, nil)
@ -399,8 +455,11 @@ defmodule Mobilizon.Config do
end end
end end
defp create_cache(:admin_config) do defp create_cache(_), do: {:error, :cache_key_not_handled}
data = %{
@spec admin_settings :: map()
def admin_settings do
%{
instance_description: instance_description(), instance_description: instance_description(),
instance_long_description: instance_long_description(), instance_long_description: instance_long_description(),
instance_name: instance_name(), instance_name: instance_name(),
@ -416,8 +475,6 @@ defmodule Mobilizon.Config do
instance_rules: instance_rules(), instance_rules: instance_rules(),
instance_languages: instance_languages() instance_languages: instance_languages()
} }
{:ok, data}
end end
@spec clear_config_cache :: {:ok | :error, integer} @spec clear_config_cache :: {:ok | :error, integer}