Files
bDS2/lib/bds/settings.ex

46 lines
1.1 KiB
Elixir

defmodule BDS.Settings do
@moduledoc """
Persistence layer for global application settings stored as key-value pairs in the database.
"""
import Ecto.Query, only: [from: 2]
alias BDS.Persistence
alias BDS.Repo
alias BDS.Settings.Setting
@spec list_global_settings() :: [{String.t(), String.t()}]
def list_global_settings do
Repo.all(from setting in Setting, order_by: setting.key, select: {setting.key, setting.value})
end
@spec get_global_setting(String.t()) :: String.t() | nil
def get_global_setting(key) do
case Repo.get(Setting, key) do
%Setting{value: value} -> value
_other -> nil
end
end
@spec put_global_setting(String.t(), term()) :: :ok | {:error, Ecto.Changeset.t()}
def put_global_setting(key, value) do
setting = Repo.get(Setting, key) || %Setting{}
setting
|> Setting.changeset(%{
key: key,
value: to_string(value || ""),
updated_at: Persistence.now_ms()
})
|> Repo.insert_or_update()
|> case do
{:ok, _setting} ->
:ok = BDS.Events.settings_changed(key)
:ok
{:error, reason} ->
{:error, reason}
end
end
end