import Hummingbird /// Serves the website's root routes. /// /// The controller exposes its routes as a `RouteCollection` so they can be added to a router /// (or a sub-group) by the application that composes it: /// /// ```swift /// router.addRoutes(RootController().routes) /// ``` /// /// - Note: `Context` is the request context the routes are resolved against, and must match the /// context of the router the routes are added to. public struct RootController: Sendable { // MARK: Properties /// The landing page, rendered once at initialization and reused for every request. private let cache: CachedHTMLResponse // MARK: Initializers /// Creates a root controller. public init() { self.cache = .init(IndexPage()) } // MARK: Computed /// The routes served by the controller. /// /// Serves a `GET` request for the root path (`/`) by rendering the ``IndexPage``. public var routes: RouteCollection { let routes = RouteCollection(context: Context.self) routes.get( .Root.index, use: index ) return routes } } // MARK: - Helpers private extension RootController { // MARK: Methods /// Handles a request for the landing page. /// - Parameters: /// - request: the incoming request. /// - context: the context the request is resolved against. /// - Returns: the cached ``IndexPage`` response. @Sendable func index( request: Request, context: some RequestContext ) -> Response { cache.response() } } // MARK: - Constants private extension RouterPath { /// A namespace for the ``RootController`` route paths. enum Root { /// The path of the landing page. static let index: RouterPath = "/" } }