diff --git a/lib/graphql/resolvers/admin.ex b/lib/graphql/resolvers/admin.ex index 512d059f7..772ae944d 100644 --- a/lib/graphql/resolvers/admin.ex +++ b/lib/graphql/resolvers/admin.ex @@ -280,6 +280,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do :ok <- eventually_update_instance_actor(res) do Config.clear_config_cache() + # add external_urls + urls = Map.get(res, :external_urls, []) + external_urls = Enum.map(urls, &Config.transform_external_url/1) + res = Map.put(res, :external_urls, external_urls) + {:ok, res} end end diff --git a/lib/graphql/resolvers/config.ex b/lib/graphql/resolvers/config.ex index 162954b76..0d9d36eb8 100644 --- a/lib/graphql/resolvers/config.ex +++ b/lib/graphql/resolvers/config.ex @@ -88,6 +88,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do get_in(Application.get_env(:web_push_encryption, :vapid_details), [:public_key]) %{ + external_urls: Config.external_urls(), name: Config.instance_name(), registrations_open: Config.instance_registrations_open?(), registrations_moderation: Config.instance_registrations_moderation?(), diff --git a/lib/graphql/schema/admin.ex b/lib/graphql/schema/admin.ex index 97b2eada0..72a1af32c 100644 --- a/lib/graphql/schema/admin.ex +++ b/lib/graphql/schema/admin.ex @@ -159,6 +159,24 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do ) field(:instance_languages, list_of(:string), description: "The instance's languages") + + field(:external_urls, list_of(:external_url), + description: "List of URL that will be shown to users" + ) + end + + object :external_url do + meta(:authorize, :all) + field(:label, non_null(:string), description: "A human-readable label for the external URL") + field(:url, non_null(:string), description: "The actual external URL") + field(:enabled, non_null(:boolean), description: "Whether the external URL is enabled") + end + + input_object :external_url_input do + meta(:authorize, :administrator) + field(:label, non_null(:string)) + field(:url, non_null(:string)) + field(:enabled, non_null(:boolean)) end @desc "The acceptable values for the instance's terms type" @@ -475,6 +493,11 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do ) arg(:instance_languages, list_of(:string), description: "The instance's languages") + + arg(:external_urls, list_of(:external_url_input), + description: "Array of external URLs with label, status, and id" + ) + middleware(Rajska.QueryAuthorization, permit: :administrator) resolve(&Admin.save_settings/3) end diff --git a/lib/graphql/schema/config.ex b/lib/graphql/schema/config.ex index 751c02c50..e244f76a7 100644 --- a/lib/graphql/schema/config.ex +++ b/lib/graphql/schema/config.ex @@ -103,6 +103,10 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do ) field(:search, :search_settings, description: "The instance's search settings") + + field(:external_urls, list_of(:external_url), + description: "List of URL that will be shown to users" + ) end @desc """ diff --git a/lib/mobilizon/config.ex b/lib/mobilizon/config.ex index c6ad94d4b..d9159f7eb 100644 --- a/lib/mobilizon/config.ex +++ b/lib/mobilizon/config.ex @@ -59,6 +59,20 @@ defmodule Mobilizon.Config do instance_config()[:name] ) + @spec external_urls :: String.t() + def external_urls do + config_cached_value("instance", "external_urls", []) + |> Enum.map(&transform_external_url/1) + end + + def transform_external_url(map) do + %{ + enabled: Map.fetch!(map, "enabled"), + label: Map.fetch!(map, "label"), + url: Map.fetch!(map, "url") + } + end + @spec instance_description :: String.t() def instance_description, do: @@ -475,7 +489,8 @@ defmodule Mobilizon.Config do instance_privacy_policy_type: instance_privacy_type(), instance_privacy_policy_url: instance_privacy_url(), instance_rules: instance_rules(), - instance_languages: instance_languages() + instance_languages: instance_languages(), + external_urls: external_urls() } end