Plugin | Uni Ecto
Uni Ecto Plugin offers a clean, extensible, and Elixir‑idiomatic way to add cross-cutting database behaviours. By moving from ad‑hoc macros to a standard behaviour -based plugin system, we reduce boilerplate, improve composability, and keep Ecto’s explicit philosophy intact. We invite the community to contribute plugins and feedback.
changeset = User.changeset(%User{}, %name: "Mary", email: "mary@example.com") :error, changeset = Repo.insert(changeset) changeset.errors #=> [email: "has already been taken", []]
Automatically translates C# primitive types, vectors, and classes into Elixir structs and Ecto types. uni ecto plugin
Internally, this uses fragment SQL if the UNI is stored as text, or separate generated columns.
: The plugin includes "Pulse" settings (Speed and Intensity) that allow the light to flicker or throb, adding a "living" quality to titles or logos. Key Technical Features Uni Ecto Plugin offers a clean, extensible, and
: Uni.Ecto isolates its distortion to the edges of visible imagery, making it incredibly responsive to custom shapes, logo paths, and typographic contours.
Unlike basic foreign key scoping ( WHERE tenant_id = ? ), the uni_ecto_plugin often supports (separate schemas or separate databases). It seamlessly switches between tenants at the connection level. changeset = User
defmodule MyApp.User do use Ecto.Schema use Uni.Ecto.Plugin, plugins: [ Uni.Plugin.SoftDelete, column: :deleted_at, Uni.Plugin.Encryption, fields: [:email], key: :app_key ]
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ SoftDelete │ │ Encryption │ │ AuditTrail │ │ Plugin │ │ Plugin │ │ Plugin │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ └──────────────────┼──────────────────┘ ▼ ┌──────────────────┐ │ Uni.Plugin.Engine│ (compile-time) └────────┬─────────┘ ▼ Your Ecto.Schema (with plugin calls)
In a true SaaS app, tenants are created on the fly via a signup form.
defmodule MyApp.Accounts.User do use UniEctoPlugin.Schema schema "users" do field :name, :string field :email, :string uni_timestamps() # Automatically injects audited timestamp fields end end Use code with caution. Advanced Use Cases Automated Soft Deletes