2026-08-04 15:42:49 +02:00
import FluentPostgresDriver
2026-07-11 09:15:58 +00:00
import FluentSQLiteDriver
import HummingbirdFluent
import Logging
/// A factory building the `Fluent` service the application persists through.
///
2026-07-30 06:33:57 +00:00
/// Built once around the driver the executable picks at startup and called as a function to produce the configured service: `let fluent = service()`.
2026-07-11 09:15:58 +00:00
public struct Service : Sendable {
// MARK: Properties
/// The persistence backend to register.
private let driver : Driver
/// The logger the database emits through.
private let logger : Logger
// MARK: Initializers
/// Creates a factory for a `Fluent` service backed by the given driver.
/// - Parameters:
/// - driver: the persistence backend to register.
/// - logger: the logger the database emits through.
public init (
driver : Driver ,
logger : Logger
) {
self . driver = driver
self . logger = logger
}
// MARK: Methods
/// Builds a `Fluent` service configured for the driver.
///
2026-07-30 06:33:57 +00:00
/// The selected backend is registered as the *default* database, so repositories resolve it with a plain `fluent.db()` and stay agnostic of which
/// driver is in use. The returned service is not yet running; add it to the application's service group (`app.addServices(_:)`) so it starts and shuts
/// its connection pool down alongside the server.
2026-08-04 15:42:49 +02:00
/// - Throws: an error when the TLS context for the PostgreSQL backend cannot be built.
2026-07-11 09:15:58 +00:00
/// - Returns: the configured `Fluent` service, ready to be added to the service group.
2026-08-04 15:42:49 +02:00
public func callAsFunction () throws -> Fluent {
2026-07-11 09:15:58 +00:00
let fluent = Fluent (
logger : logger
)
switch driver {
2026-08-04 15:42:49 +02:00
case . postgres ( let configuration ):
2026-07-11 09:15:58 +00:00
fluent . databases . use (
2026-08-04 15:42:49 +02:00
. postgres (
2026-07-11 09:15:58 +00:00
configuration : . init (
hostname : configuration . host ,
port : configuration . port ,
username : configuration . username ,
password : configuration . password ,
database : configuration . name ,
2026-08-04 15:42:49 +02:00
tls : try configuration . tls . postgresTLS ()
2026-07-11 09:15:58 +00:00
),
maxConnectionsPerEventLoop : configuration . maxConnectionsPerEventLoop
),
2026-08-04 15:42:49 +02:00
as : . psql ,
2026-07-11 09:15:58 +00:00
isDefault : true
)
case . inMemory :
2026-07-30 06:33:57 +00:00
// A single connection keeps every query pointed at the same in-memory store, rather than each pooled
// connection getting its own private database.
2026-07-11 09:15:58 +00:00
fluent . databases . use (
. sqlite (. memory , maxConnectionsPerEventLoop : 1 ),
as : . sqlite ,
isDefault : true
)
}
return fluent
}
}