103 lines
2.5 KiB
Swift
103 lines
2.5 KiB
Swift
import DatabaseClient
|
|
import DatabaseClientLive
|
|
import FluentSQLiteDriver
|
|
import Hummingbird
|
|
import HummingbirdFluent
|
|
import Logging
|
|
|
|
public protocol AppArguments {
|
|
var inMemoryDatabase: Bool { get }
|
|
var migrate: Bool { get }
|
|
var revert: Bool { get }
|
|
var hostname: String { get }
|
|
var port: Int { get }
|
|
var logLevel: Logger.Level? { get }
|
|
}
|
|
|
|
/// Build application
|
|
/// - Parameter arguments: application arguments
|
|
public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol {
|
|
let environment = Environment()
|
|
|
|
let logger = {
|
|
var logger = Logger(label: "PurchaseOrders")
|
|
logger.logLevel = arguments.logLevel ??
|
|
environment.get("LOG_LEVEL").map { Logger.Level(rawValue: $0) ?? .info } ??
|
|
.info
|
|
|
|
return logger
|
|
}()
|
|
let fluent = Fluent(logger: logger)
|
|
if arguments.inMemoryDatabase {
|
|
fluent.databases.use(.sqlite(.memory), as: .sqlite)
|
|
} else {
|
|
fluent.databases.use(.sqlite(.file("hdb.sqlite")), as: .sqlite)
|
|
}
|
|
let dbClient = DatabaseClient.live(database: fluent.db())
|
|
try await fluent.migrations.add(dbClient.migrations())
|
|
|
|
if arguments.revert {
|
|
try await fluent.revert()
|
|
}
|
|
|
|
if arguments.migrate || arguments.inMemoryDatabase {
|
|
try await fluent.migrate()
|
|
}
|
|
|
|
let fluentPersist = await FluentPersistDriver(fluent: fluent)
|
|
|
|
let router = Router()
|
|
|
|
// Add middleware
|
|
|
|
// logging middleware
|
|
router.add(middleware: LogRequestsMiddleware(.info))
|
|
router.add(middleware: FileMiddleware(logger: logger))
|
|
router.add(middleware: CORSMiddleware(
|
|
allowOrigin: .originBased,
|
|
allowHeaders: [.contentType],
|
|
allowMethods: [.get, .options, .post, .delete, .put, .patch]
|
|
))
|
|
|
|
// Add health endpoint
|
|
router.get("/health") { _, _ -> HTTPResponse.Status in
|
|
return .ok
|
|
}
|
|
|
|
UserController(db: dbClient.users).addRoutes(to: router.group("api/users"))
|
|
|
|
// let router = buildRouter()
|
|
//
|
|
var app = Application(
|
|
router: router,
|
|
configuration: .init(
|
|
address: .hostname(arguments.hostname, port: arguments.port),
|
|
serverName: "Purchase-Orders"
|
|
),
|
|
logger: logger
|
|
)
|
|
|
|
app.addServices(fluent, fluentPersist)
|
|
return app
|
|
}
|
|
|
|
// Build router
|
|
// func buildRouter() -> Router<AppRequestContext> {
|
|
// let router = Router()
|
|
//
|
|
// // Add middleware
|
|
//
|
|
// router.addMiddleware {
|
|
// // logging middleware
|
|
// LogRequestsMiddleware(.info)
|
|
// }
|
|
//
|
|
// // Add health endpoint
|
|
//
|
|
// router.get("/health") { _, _ -> HTTPResponse.Status in
|
|
// return .ok
|
|
// }
|
|
//
|
|
// return router
|
|
// }
|