This PR contains the work done to introduce a _Fluent_-based persistence layer for the Website service, selectable at runtime alongside the existing in-memory default, plus the local dev tooling and docs to support it. To provide further details about the work: * Persistence package * The `Driver` and `TLS` enumerations * The `Configuration` type * The `Service` factory that builds the service * `PrepareDB` for migrations registration * The `Probe` for readiness checks. * App integration * Builds the driver, registers migrations, and attaches `Fluent` to the service lifecycle so it starts/stops with the HTTP server. * Migrate-on-boot is gated to the in-memory backend; MySQL/MariaDB is migrated out of band via --database-migrate so shared databases never race on startup. * The `ConfigReader+Properties` extension maps database.* config keys onto the driver. * Library * Added database configuration constants. * The `HealthController` controller gains a readiness probe: `GET /health/ready` checks whether the database is reachable, separate from the existing liveness check. * Others * Updated the `docker-compose` files to support a database service behind a database profile, and hardened for local development * New database targets on the `Makefile` file and overall documentation updated * Updated the `.env.local`, `Dockerfile`, and `README` files to document the persistence workflow, config keys, and local DB commands Reviewed-on: rock-n-code/loud-amsterdam#13 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
30 lines
1002 B
Swift
30 lines
1002 B
Swift
import HummingbirdFluent
|
|
|
|
/// A registrar declaring every migration against a `Fluent` service.
|
|
///
|
|
/// Built once around the application's `Fluent` service and called as a function — `await migrate()` —
|
|
/// during startup, before the migrations are applied.
|
|
public struct PrepareDB {
|
|
|
|
// MARK: Initializers
|
|
|
|
/// Creates a registrar for the migrations for a `Fluent` service.
|
|
public init() {}
|
|
|
|
// MARK: Methods
|
|
|
|
/// Registers every migration against the `Fluent` service, in order.
|
|
///
|
|
/// This is the single place migrations are declared: add each new migration here, in the order it must
|
|
/// run (migrations are applied in registration order and are append-only). Registering does not apply
|
|
/// them — the caller runs `fluent.migrate()` (or the executable's migrate-and-exit mode) to do that.
|
|
public func callAsFunction(
|
|
for fluent: Fluent
|
|
) async {
|
|
await fluent.migrations.add([
|
|
CreateExampleRecord()
|
|
])
|
|
}
|
|
|
|
}
|