80 lines
2.2 KiB
Elixir
80 lines
2.2 KiB
Elixir
defmodule Mv.Membership.Setting do
|
|
@moduledoc """
|
|
Ash resource representing global application settings.
|
|
|
|
## Overview
|
|
Settings is a singleton resource that stores global configuration for the association,
|
|
such as the club name and branding information. There should only ever be one settings
|
|
record in the database.
|
|
|
|
## Attributes
|
|
- `club_name` - The name of the association/club (required, cannot be empty)
|
|
|
|
## Singleton Pattern
|
|
This resource uses a singleton pattern - there should only be one settings record.
|
|
The resource is designed to be read and updated, but not created or destroyed
|
|
through normal CRUD operations. Initial settings should be seeded.
|
|
|
|
## Environment Variable Support
|
|
The `club_name` can be set via the `ASSOCIATION_NAME` environment variable.
|
|
If set, the environment variable value is used as a fallback when no database
|
|
value exists. Database values always take precedence over environment variables.
|
|
|
|
## Examples
|
|
|
|
# Get current settings
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
settings.club_name # => "My Club"
|
|
|
|
# Update club name
|
|
{:ok, updated} = Mv.Membership.update_settings(settings, %{club_name: "New Name"})
|
|
"""
|
|
use Ash.Resource,
|
|
domain: Mv.Membership,
|
|
data_layer: AshPostgres.DataLayer
|
|
|
|
postgres do
|
|
table "settings"
|
|
repo Mv.Repo
|
|
end
|
|
|
|
resource do
|
|
description "Global application settings (singleton resource)"
|
|
end
|
|
|
|
actions do
|
|
defaults [:read]
|
|
|
|
# Internal create action - not exposed via code interface
|
|
# Used only as fallback in get_settings/0 if settings don't exist
|
|
# Settings should normally be created via seed script
|
|
create :create do
|
|
accept [:club_name]
|
|
end
|
|
|
|
update :update do
|
|
primary? true
|
|
accept [:club_name]
|
|
end
|
|
end
|
|
|
|
validations do
|
|
validate present(:club_name), on: [:create, :update]
|
|
validate string_length(:club_name, min: 1), on: [:create, :update]
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key :id
|
|
|
|
attribute :club_name, :string,
|
|
allow_nil?: false,
|
|
public?: true,
|
|
description: "The name of the association/club",
|
|
constraints: [
|
|
trim?: true,
|
|
min_length: 1
|
|
]
|
|
|
|
timestamps()
|
|
end
|
|
end
|