Merged in feat/sw-2403-mystay-webview (pull request #1828)

Feat/sw-2403 - Adding webview for MyStay

* feat/webview - added for my stay

* wip

* Passing headers so we can get the lang

* Cleanup

* Refactored and some performance improvements


Approved-by: Christian Andolf
This commit is contained in:
Linus Flood
2025-04-17 08:48:52 +00:00
parent 3ce3063973
commit cfa8c166a3
7 changed files with 169 additions and 56 deletions

View File

@@ -3,6 +3,7 @@ import { type NextMiddleware, NextResponse } from "next/server"
import {
loyaltyPagesWebviews,
myPagesWebviews,
myStayWebviews,
refreshWebviews,
webviews,
} from "@/constants/routes/webviews"
@@ -16,6 +17,7 @@ import { findLang } from "@/utils/languages"
import { getDefaultRequestHeaders } from "./utils"
import type { MiddlewareMatcher } from "@/types/middleware"
import type { Lang } from "@/constants/languages"
export const middleware: NextMiddleware = async (request) => {
const { nextUrl } = request
@@ -62,41 +64,17 @@ export const middleware: NextMiddleware = async (request) => {
)
}
const pathNameWithoutLang = nextUrl.pathname.replace(`/${lang}/webview`, "")
const { uid } = await fetchAndCacheEntry(pathNameWithoutLang, lang)
if (!uid) {
throw notFound(
`Unable to resolve CMS entry for locale "${lang}": ${pathNameWithoutLang}`
)
}
headers.set("x-uid", uid)
const webviewToken = request.cookies.get("webviewToken")
if (webviewToken) {
// since the token exists, this is a subsequent visit
// we're done, allow it
if (myPagesWebviews.includes(nextUrl.pathname)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/account-page/${uid}`, nextUrl),
{
request: {
headers,
},
}
)
} else if (loyaltyPagesWebviews.includes(nextUrl.pathname)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/loyalty-page/${uid}`, nextUrl),
{
request: {
headers,
},
}
)
} else {
return notFound()
}
return handleWebviewRewrite({
nextUrl,
headers,
decryptedData: null,
lang,
setCookie: false,
})
}
try {
@@ -124,31 +102,13 @@ export const middleware: NextMiddleware = async (request) => {
headers.append("Cookie", `webviewToken=${decryptedData}`)
if (myPagesWebviews.includes(nextUrl.pathname)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/account-page/${uid}`, nextUrl),
{
headers: {
"Set-Cookie": `webviewToken=${decryptedData}; Secure; HttpOnly; Path=/; SameSite=Strict;`,
},
request: {
headers,
},
}
)
} else if (loyaltyPagesWebviews.includes(nextUrl.pathname)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/loyalty-page/${uid}`, nextUrl),
{
headers: {
"Set-Cookie": `webviewToken=${decryptedData}; Secure; HttpOnly; Path=/; SameSite=Strict;`,
},
request: {
headers,
},
}
)
}
return handleWebviewRewrite({
nextUrl,
headers,
decryptedData,
lang,
setCookie: true,
})
} catch (e) {
if (e instanceof Error) {
console.error("Error in webView middleware")
@@ -159,6 +119,63 @@ export const middleware: NextMiddleware = async (request) => {
}
}
async function handleWebviewRewrite({
nextUrl,
headers,
decryptedData,
lang,
setCookie,
}: {
nextUrl: URL
headers: Headers
decryptedData: string | null
lang: Lang
setCookie: boolean
}) {
const path = nextUrl.pathname
if (myStayWebviews.includes(path)) {
return NextResponse.next({ request: { headers } })
}
const pathNameWithoutLang = path.replace(`/${lang}/webview`, "")
const { uid } = await fetchAndCacheEntry(pathNameWithoutLang, lang)
if (uid) {
headers.set("x-uid", uid)
}
if (myPagesWebviews.includes(path)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/account-page/${uid}`, nextUrl),
{
request: { headers },
...(setCookie && {
headers: {
"Set-Cookie": `webviewToken=${decryptedData}; Secure; HttpOnly; Path=/; SameSite=Strict;`,
},
}),
}
)
}
if (loyaltyPagesWebviews.includes(path)) {
return NextResponse.rewrite(
new URL(`/${lang}/webview/loyalty-page/${uid}`, nextUrl),
{
request: { headers },
...(setCookie && {
headers: {
"Set-Cookie": `webviewToken=${decryptedData}; Secure; HttpOnly; Path=/; SameSite=Strict;`,
},
}),
}
)
}
return notFound()
}
export const matcher: MiddlewareMatcher = (request) => {
const { nextUrl } = request