Implemented phase 5 for the POC prototype in the Website service.
This commit is contained in:
1 parent
89a7a7b8e5
commit
31d2d98d49
46 files changed
+4039
-162
No files matched your search
@@ -19,17 +19,14 @@ public struct RootController<Context: RequestContext> {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
/// What a page rendered per request is built from, the same as the cached ones.
|
||||
private let page: @Sendable (Locale, Viewer?) -> IndexPage
|
||||
|
||||
/// The store the signed-in viewer is read from, or `nil` to serve everyone the cached page.
|
||||
private let sessions: SessionStore?
|
||||
/// The landing pages. Whatever changes the catalogue refreshes them through it.
|
||||
public let home: HomePages
|
||||
|
||||
/// Negotiates the language the bare route answers in.
|
||||
private let negotiate: Negotiate
|
||||
|
||||
/// The landing page, rendered once per supported language and reused for every request.
|
||||
private let responses: LocalizedHTMLCollectionResponse
|
||||
/// The store the signed-in viewer is read from, or `nil` to serve everyone the cached page.
|
||||
private let sessions: SessionStore?
|
||||
|
||||
// MARK: Initializers
|
||||
|
||||
@@ -47,28 +44,14 @@ public struct RootController<Context: RequestContext> {
|
||||
listings: HomeListings = .init(),
|
||||
sessions: SessionStore? = nil
|
||||
) {
|
||||
let page: @Sendable (Locale, Viewer?) -> IndexPage = {
|
||||
.init(
|
||||
locale: $0,
|
||||
assetVersion: assetVersion,
|
||||
siteOrigin: siteOrigin,
|
||||
analytics: analytics,
|
||||
listings: listings,
|
||||
viewer: $1
|
||||
)
|
||||
}
|
||||
|
||||
self.home = .init(
|
||||
assetVersion: assetVersion,
|
||||
siteOrigin: siteOrigin,
|
||||
analytics: analytics,
|
||||
listings: listings
|
||||
)
|
||||
self.negotiate = .init(bundle: .module)
|
||||
self.page = page
|
||||
self.sessions = sessions
|
||||
// The bare route negotiates, so the pages declare `Vary: Accept-Language`; the prefixed editions share the cache
|
||||
// and carry it too.
|
||||
self.responses = .init(
|
||||
bundle: .module,
|
||||
variesOnAcceptLanguage: true
|
||||
) {
|
||||
page($0, nil)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -156,14 +139,19 @@ private extension RootController {
|
||||
context: Context
|
||||
) async -> Response {
|
||||
guard let viewer = await sessions?.viewer(for: request) else {
|
||||
return responses.response(
|
||||
for: language,
|
||||
return await home.response(
|
||||
in: language,
|
||||
request: request
|
||||
)
|
||||
}
|
||||
|
||||
return HTMLResponse(additionalHeaders: .perViewer) { [page] in
|
||||
page(.init(identifier: language), viewer)
|
||||
let page = await home.page(
|
||||
in: language,
|
||||
for: viewer
|
||||
)
|
||||
|
||||
return HTMLResponse(additionalHeaders: .perViewer) {
|
||||
page
|
||||
}
|
||||
.response(from: request, context: context)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user