83 lines
2.2 KiB
Swift
83 lines
2.2 KiB
Swift
import DatabaseClientLive
|
|
import Dependencies
|
|
import Fluent
|
|
import FluentSQLiteDriver
|
|
import NIOSSL
|
|
import SharedModels
|
|
import Vapor
|
|
@preconcurrency import VaporRouting
|
|
|
|
// configures your application
|
|
public func configure(_ app: Application) async throws {
|
|
// cors middleware should come before default error middleware using `at: .beginning`
|
|
let corsConfiguration = CORSMiddleware.Configuration(
|
|
allowedOrigin: .all,
|
|
allowedMethods: [.GET, .POST, .PUT, .OPTIONS, .DELETE, .PATCH],
|
|
allowedHeaders: [.accept, .authorization, .contentType, .origin,
|
|
.xRequestedWith, .userAgent, .accessControlAllowOrigin]
|
|
)
|
|
let cors = CORSMiddleware(configuration: corsConfiguration)
|
|
app.middleware.use(cors, at: .beginning)
|
|
|
|
app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
|
|
app.middleware.use(app.sessions.middleware)
|
|
app.middleware.use(DependenciesMiddleware())
|
|
|
|
#if DEBUG
|
|
app.lifecycle.use(BrowserSyncHandler())
|
|
#endif
|
|
|
|
switch app.environment {
|
|
case .production, .development:
|
|
let dbFileName = Environment.get("SQLITE_FILENAME") ?? "db.sqlite"
|
|
app.databases.use(DatabaseConfigurationFactory.sqlite(.file(dbFileName)), as: .sqlite)
|
|
default:
|
|
app.databases.use(DatabaseConfigurationFactory.sqlite(.memory), as: .sqlite)
|
|
}
|
|
|
|
let databaseClient = DatabaseClient.live(database: app.db)
|
|
try await app.migrations.add(databaseClient.migrations())
|
|
|
|
app.mount(
|
|
SiteRoute.router,
|
|
middleware: { $0.middleware() },
|
|
use: siteHandler
|
|
)
|
|
|
|
try await app.autoMigrate()
|
|
|
|
#if DEBUG
|
|
app.asyncCommands.use(SeedCommand(), as: "seed")
|
|
#endif
|
|
app.asyncCommands.use(GenerateAdminUserCommand(), as: "generate-admin")
|
|
}
|
|
|
|
extension SiteRoute {
|
|
|
|
func middleware() -> [any Middleware]? {
|
|
switch self {
|
|
case let .api(route):
|
|
return route.middleware
|
|
case .health:
|
|
return nil
|
|
case let .view(route):
|
|
return route.middleware
|
|
}
|
|
}
|
|
}
|
|
|
|
@Sendable
|
|
func siteHandler(
|
|
request: Request,
|
|
route: SiteRoute
|
|
) async throws -> any AsyncResponseEncodable {
|
|
switch route {
|
|
case let .api(route):
|
|
return try await route.handle(request: request)
|
|
case .health:
|
|
return HTTPStatus.ok
|
|
case let .view(route):
|
|
return try await route.handle(request: request)
|
|
}
|
|
}
|