towerops/lib/towerops/settings.ex

117 lines
2.7 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.
## 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 ->
{:error, :setting_not_found}
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)
end