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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user