Skip to content

v1.1.0

Choose a tag to compare

@miguejarias miguejarias released this 31 Mar 22:51
· 35 commits to main since this release

1.1.0

Case-Insensitive Validation Rules

Unique and Exists validation rules are now case-insensitive by default — "Admin@Example.COM" and "admin@example.com" are correctly treated as the same value. New UniqueSensitive and ExistsSensitive variants are available when exact casing matters (API keys, tokens, etc.).

  • Unique(DbPool, String) — case-insensitive uniqueness check (uses LOWER())
  • UniqueSensitive(DbPool, String) — case-sensitive uniqueness check
  • Exists(DbPool, String) — case-insensitive existence check (uses LOWER())
  • ExistsSensitive(DbPool, String) — case-sensitive existence check

Int Route Parameters

Route parameters typed as Int in controller function signatures are now automatically parsed from the URL string. If parsing fails, a 404 response is returned — no more manual int.parse boilerplate in every handler.

/// @get "/users/:id"
pub fn show(ctx: Context(App), id: Int) -> Response {
  // id is already an Int — no parsing needed
}

Flexible Controller Discovery

Controllers are no longer limited to src/app/http/controllers/. The route compiler now discovers controllers anywhere under src/ by naming convention:

  • *_controller.gleam — e.g., src/app/billing/invoice_controller.gleam
  • controller.gleam — e.g., src/app/billing/controller.gleam

The legacy src/app/http/controllers/ directory is still supported for backwards compatibility.

Bug Fixes

  • SQLite placeholder conversion — $1 placeholders inside SQL string literals (e.g., Argon2 hashes) are no longer incorrectly converted to ?
  • Database error message — missing database parameter errors now correctly reference .env and config/database.toml instead of the non-existent database_provider.gleam