Packages
phoenix_kit
1.7.201
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit/settings/queries.ex
defmodule PhoenixKit.Settings.Queries do
@moduledoc """
Ecto queries for Settings context.
This module encapsulates all database queries for settings management,
providing a centralized location for query logic.
"""
import Ecto.Query
alias PhoenixKit.RepoHelper
alias PhoenixKit.Settings.Setting
# Single record queries
@doc """
Gets a setting record by key.
## Examples
iex> PhoenixKit.Settings.Queries.get_setting_by_key("time_zone")
%Setting{key: "time_zone", value: "0"}
iex> PhoenixKit.Settings.Queries.get_setting_by_key("non_existent")
nil
"""
def get_setting_by_key(key) when is_binary(key) do
repo().get_by(Setting, key: key)
end
@doc """
Gets a setting record by UUID.
"""
def get_setting_by_uuid(uuid) when is_binary(uuid) do
repo().get(Setting, uuid)
end
# Multiple records queries
@doc """
Lists all settings ordered by key.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings()
[%Setting{key: "date_format", value: "Y-m-d"}, %Setting{key: "time_zone", value: "0"}, ...]
"""
def list_settings do
Setting
|> order_by([s], s.key)
|> repo().all()
end
@doc """
Gets all settings as a list of {key, value} tuples.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_key_values()
[{"time_zone", "0"}, {"date_format", "Y-m-d"}]
"""
def list_settings_key_values do
Setting
|> select([s], {s.key, s.value})
|> repo().all()
end
@doc """
Lists settings for specific keys as a list of {key, value} tuples.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_key_values_by_keys(["time_zone", "date_format"])
[{"time_zone", "0"}, {"date_format", "Y-m-d"}]
"""
def list_settings_key_values_by_keys(keys) when is_list(keys) do
Setting
|> where([s], s.key in ^keys)
|> select([s], {s.key, s.value})
|> repo().all()
end
@doc """
Lists setting records for specific keys.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_by_keys(["time_zone"])
[%Setting{key: "time_zone", value: "0"}]
"""
def list_settings_by_keys(keys) when is_list(keys) do
Setting
|> where([s], s.key in ^keys)
|> repo().all()
end
@doc """
Lists settings by keys with JSON priority as a list of {key, value} tuples.
Returns a list where value_json is used if present, otherwise falls back to
the string value.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_with_json_priority_by_keys(["theme"])
[{"theme", %{"primary" => "#3b82f6"}}]
"""
def list_settings_with_json_priority_by_keys(keys) when is_list(keys) do
Setting
|> where([s], s.key in ^keys)
|> repo().all()
|> Enum.map(fn setting ->
value = if setting.value_json, do: setting.value_json, else: setting.value
{setting.key, value}
end)
end
@doc """
Lists settings whose keys start with the given prefix.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_by_key_prefix("integration:google:")
[%Setting{key: "integration:google:default", ...}, %Setting{key: "integration:google:personal", ...}]
"""
def list_settings_by_key_prefix(prefix) when is_binary(prefix) do
like_pattern = prefix <> "%"
Setting
|> where([s], like(s.key, ^like_pattern))
|> order_by([s], s.key)
|> repo().all()
end
@doc """
Lists settings whose keys match any of the given prefixes in a single query.
More efficient than calling `list_settings_by_key_prefix/1` in a loop.
## Examples
iex> PhoenixKit.Settings.Queries.list_settings_by_key_prefixes(["integration:google:", "integration:openrouter:"])
[%Setting{key: "integration:google:default", ...}, %Setting{key: "integration:openrouter:default", ...}]
"""
def list_settings_by_key_prefixes([]), do: []
def list_settings_by_key_prefixes(prefixes) when is_list(prefixes) do
conditions =
Enum.reduce(prefixes, dynamic(false), fn prefix, acc ->
like_pattern = prefix <> "%"
dynamic([s], ^acc or like(s.key, ^like_pattern))
end)
Setting
|> where(^conditions)
|> order_by([s], s.key)
|> repo().all()
end
@doc """
Deletes a setting by key. Returns `{:ok, setting}` or `{:error, :not_found}`.
"""
def delete_setting_by_key(key) when is_binary(key) do
case get_setting_by_key(key) do
nil -> {:error, :not_found}
setting -> repo().delete(setting)
end
end
# Write operations
@doc """
Inserts a new setting.
## Examples
iex> %Setting{} |> Setting.changeset(%{key: "theme", value: "dark"})
...> |> PhoenixKit.Settings.Queries.insert_setting()
{:ok, %Setting{}}
"""
def insert_setting(changeset) do
repo().insert(changeset)
end
@doc """
Updates an existing setting.
## Examples
iex> setting |> Setting.update_changeset(%{value: "light"})
...> |> PhoenixKit.Settings.Queries.update_setting()
{:ok, %Setting{}}
"""
def update_setting(changeset) do
repo().update(changeset)
end
# Transaction
@doc """
Executes a transaction with multiple operations.
## Examples
iex> Ecto.Multi.new()
...> |> multi_operation()
...> |> PhoenixKit.Settings.Queries.transaction()
{:ok, result}
"""
def transaction(multi) do
repo().transaction(multi)
end
# Private functions
defp repo do
RepoHelper.repo()
end
end