Packages

phoenix_kit

1.2.4
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
phoenix_kit lib phoenix_kit settings setting.ex
Raw

lib/phoenix_kit/settings/setting.ex

defmodule PhoenixKit.Settings.Setting do
@moduledoc """
Setting schema for PhoenixKit system settings.
This schema defines system-wide settings that can be configured through
the admin panel. Settings are stored as key-value pairs with timestamps.
## Fields
- `key`: Setting identifier (unique, required)
- `value`: Setting value (string format)
- `module`: Module/feature identifier for organization (optional)
- `date_added`: When the setting was first created
- `date_updated`: When the setting was last modified
## Default Settings
PhoenixKit includes three default system settings:
- **time_zone**: System timezone offset (default: "0" for UTC)
- **date_format**: Date display format (default: "Y-m-d")
- **time_format**: Time display format (default: "H:i" for 24-hour)
## Usage Examples
# Create a new setting
%Setting{}
|> Setting.changeset(%{key: "theme", value: "dark"})
|> Repo.insert()
# Update existing setting
setting
|> Setting.changeset(%{value: "light"})
|> Repo.update()
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :id, autogenerate: true}
schema "phoenix_kit_settings" do
field :key, :string
field :value, :string
field :module, :string
field :date_added, :utc_datetime_usec
field :date_updated, :utc_datetime_usec
end
@doc """
Creates a changeset for setting creation and updates.
Validates that key and value are present and key is unique.
Automatically sets date_updated to current time on updates.
"""
def changeset(setting, attrs) do
setting
|> cast(attrs, [:key, :value, :module, :date_added, :date_updated])
|> validate_required([:key, :value])
|> validate_length(:key, min: 1, max: 255)
|> validate_length(:value, min: 1, max: 1000)
|> validate_length(:module, max: 255)
|> unique_constraint(:key, name: :phoenix_kit_settings_key_uidx)
|> maybe_set_timestamps()
end
@doc """
Creates a changeset for updating only the value field.
This is used when updating existing settings through the admin panel.
Automatically updates the date_updated timestamp.
"""
def update_changeset(setting, attrs) do
setting
|> cast(attrs, [:value, :module])
|> validate_required([:value])
|> validate_length(:value, min: 1, max: 1000)
|> validate_length(:module, max: 255)
|> put_change(:date_updated, DateTime.utc_now())
end
# Private helper to set timestamps on new records
defp maybe_set_timestamps(changeset) do
case get_field(changeset, :id) do
nil ->
now = DateTime.utc_now()
changeset
|> put_change(:date_added, now)
|> put_change(:date_updated, now)
_id ->
put_change(changeset, :date_updated, DateTime.utc_now())
end
end
end