towerops/lib/towerops/settings.ex

130 lines
3.2 KiB
Elixir

defmodule Towerops.Settings do
@moduledoc """
The Settings context for application-wide configuration.
Provides functions for reading and updating global settings that affect
the entire application. Only accessible by superadmins.
"""
import Ecto.Query, warn: false
alias Towerops.Repo
alias Towerops.Settings.ApplicationSetting
@doc """
Gets a setting by key and returns the parsed value.
Returns nil if the setting doesn't exist or has a nil value.
## Examples
iex> get_setting("global_default_cloud_poller_id")
"abc-123-uuid"
iex> get_setting("nonexistent_key")
nil
"""
def get_setting(key) when is_binary(key) do
case Repo.get_by(ApplicationSetting, key: key) do
nil -> nil
setting -> ApplicationSetting.parse_value(setting)
end
end
@doc """
Gets the raw ApplicationSetting record by key.
## Examples
iex> get_setting_record("global_default_cloud_poller_id")
%ApplicationSetting{key: "global_default_cloud_poller_id", value: "abc-123"}
"""
def get_setting_record(key) when is_binary(key) do
Repo.get_by(ApplicationSetting, key: key)
end
@doc """
Updates a setting value, creating it if it doesn't exist.
## Examples
iex> update_setting("global_default_cloud_poller_id", "new-uuid")
{:ok, %ApplicationSetting{}}
iex> update_setting("global_default_cloud_poller_id", nil)
{:ok, %ApplicationSetting{value: nil}}
"""
def update_setting(key, value) when is_binary(key) do
case get_setting_record(key) do
nil ->
# Create the setting if it doesn't exist
attrs = %{
key: key,
value: to_string_or_nil(value),
value_type: infer_value_type(key)
}
%ApplicationSetting{}
|> ApplicationSetting.changeset(attrs)
|> Repo.insert()
setting ->
setting
|> ApplicationSetting.changeset(%{value: to_string_or_nil(value)})
|> Repo.update()
end
end
@doc """
Gets the global default cloud poller agent token ID.
Returns nil if not configured.
## Examples
iex> get_global_default_cloud_poller()
"abc-123-uuid"
iex> get_global_default_cloud_poller()
nil
"""
def get_global_default_cloud_poller do
get_setting("global_default_cloud_poller_id")
end
@doc """
Sets the global default cloud poller agent token ID.
## Examples
iex> set_global_default_cloud_poller("agent-token-uuid")
{:ok, %ApplicationSetting{}}
iex> set_global_default_cloud_poller(nil)
{:ok, %ApplicationSetting{value: nil}}
"""
def set_global_default_cloud_poller(agent_token_id) do
update_setting("global_default_cloud_poller_id", agent_token_id)
end
@doc """
Lists all application settings.
## Examples
iex> list_all_settings()
[%ApplicationSetting{}, ...]
"""
def list_all_settings do
Repo.all(ApplicationSetting)
end
# Private helpers
defp to_string_or_nil(nil), do: nil
defp to_string_or_nil(value), do: to_string(value)
# Infer the value type based on the setting key
defp infer_value_type("global_default_cloud_poller_id"), do: "uuid"
defp infer_value_type(_key), do: "string"
end