import { NextFetchEvent, NextMiddleware, NextResponse } from 'next/server'; import settings from 'settings'; import { PzNextRequest } from '.'; import logger from '../utils/log'; import { urlLocaleMatcherRegex } from '../utils'; import { getUrlPathWithLocale } from '../utils/localization'; const withCheckoutProvider = (middleware: NextMiddleware) => async (req: PzNextRequest, event: NextFetchEvent) => { const url = req.nextUrl.clone(); const ip = req.headers.get('x-forwarded-for') ?? ''; const pathnameWithoutLocale = url.pathname.replace( urlLocaleMatcherRegex, '' ); const searchParams = new URLSearchParams(url.search); if (pathnameWithoutLocale.startsWith('/orders/checkout-provider/')) { try { const request = await fetch( `${encodeURI(settings.commerceUrl)}${url.pathname.replace( urlLocaleMatcherRegex, '' )}?${searchParams.toString()}`, { next: { revalidate: 0 }, headers: { Cookie: req.headers.get('cookie') || '', Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' } } ); return NextResponse.json(await request.json()); } catch (error) { logger.error('withCheckoutProvider error', { error, ip }); return NextResponse.next(); } } if (pathnameWithoutLocale.startsWith('/orders/checkout-provider-cancel')) { try { const request = await fetch( `${settings.commerceUrl}${pathnameWithoutLocale}${url.search}`, { redirect: 'manual', next: { revalidate: 0 }, headers: { Cookie: req.headers.get('cookie') || '' } } ); if (request.headers.get('location')) { const location = request.headers.get('location'); const redirectUrl = new URL( request.headers.get('location'), location.startsWith('http') ? '' : url.origin ); redirectUrl.pathname = getUrlPathWithLocale( redirectUrl.pathname, req.middlewareParams.rewrites.locale ); return Response.redirect(redirectUrl.toString(), request.status); } } catch (error) { logger.error('withCheckoutProvider error', { error, ip }); } } return middleware(req, event); }; export default withCheckoutProvider;