Skip to main content

CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [1.0.0] — 2026-05-30

### Added

#### Core Infrastructure
- `Railsr.Config` — `NimbleOptions`-validated runtime config with `:play`, `:play_live`, `:live` environment support
- `Railsr.Auth` — OAuth 2.0 client-credentials token fetch
- `Railsr.Auth.TokenCache` — ETS-backed `GenServer` with automatic pre-expiry refresh and full-jitter exponential back-off on failures
- `Railsr.HTTP` — Core request pipeline with automatic `Authorization: Bearer` injection, idempotency key generation, retry logic, telemetry emission, and circuit breaker integration
- `Railsr.Error` — Structured error type with `type`, `code`, `request_id`, `retryable?` fields
- `Railsr.Types` — Full struct definitions for all Railsr domain objects

#### Middleware
- `Railsr.Middleware.RateLimiter` — Client-side token-bucket rate limiter (ETS-backed, lock-free reads)
- `Railsr.Middleware.CircuitBreaker` — Three-state circuit breaker (closed / open / half-open)
- `Railsr.Middleware.IdempotencyKey` — Automatic 128-bit random idempotency key generation on all mutating requests

#### Telemetry
- `Railsr.Telemetry` — Emits `[:railsr, :request, :start | :stop | :exception]` events compatible with `Telemetry.Metrics`
- `Railsr.Telemetry.attach_logger/1` — Development convenience logger attachment

#### Resources — complete coverage of every Railsr v1/v2 endpoint group
- `Railsr.Resources.Endusers` — v2 enduser CRUD, KYC trigger/retrieval, compliance firewall recalculation, `wait_for_status/3` polling helper
- `Railsr.Resources.Ledgers` — GBP/EUR/virtual ledger CRUD, account/IBAN lookup, entry history, virtual credit/debit, PLAY-only dev credit, `wait_for_active/2`
- `Railsr.Resources.Transactions` — send money, inter-ledger, FX, quarantine list/approve/reject, retry, `wait_for_terminal/2`
- `Railsr.Resources.Beneficiaries` — CRUD, Confirmation of Payee (CoP), firewall recalculation
- `Railsr.Resources.Cards` — virtual/physical card create, full lifecycle (activate/freeze/unfreeze/cancel/suspend), replace, PAN retrieval, PIN reset, card transaction history, spend rules (amount limit, MCC block, country block), card programmes, digital wallet token provisioning (Labs)
- `Railsr.Resources.Mandates` — BACS Direct Debit mandate CRUD, cancel, `wait_for_active/2`
- `Railsr.Resources.Payments` — Direct Debit payment create/get/list
- `Railsr.Resources.Firewall` — Rule set CRUD, dataset CRUD, functions reference
- `Railsr.Resources.Webhooks` — Endpoint configuration, delivery history, retry, HMAC-SHA256 signature verification, event catalogue (31 event types), `parse_event/1`
- `Railsr.Resources.Customer` — Get/update customer account, list products, list customer-level ledgers

#### Testing (≥90% coverage target)
- Full Bypass-based HTTP interception tests for all resource modules
- Retry behaviour, circuit breaker state, rate limiter bucket tests
- Config validation, type deserialisation, error classification tests
- Webhook signature verification edge cases

#### Developer Experience
- GitHub Actions CI: test matrix (Elixir 1.15/1.16 × OTP 25/26), format check, Credo strict, Dialyzer, Coveralls
- ExDoc documentation with module groups, `@spec` on all public functions
- `mix ci` alias: format + credo + dialyzer + test --cover