From b3f599fbffed7dd449811700bbde245152ee330b Mon Sep 17 00:00:00 2001 From: DIYgod Date: Fri, 16 Sep 2022 20:57:04 +0100 Subject: [PATCH] feat: force redirect to custom domain --- src/components/site/SiteHome.tsx | 2 +- src/lib/tenant.server.ts | 29 ++++++++++++++++++++++++++--- src/pages/_middleware.ts | 10 ++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/components/site/SiteHome.tsx b/src/components/site/SiteHome.tsx index 2b209eaf..ba8a2b42 100644 --- a/src/components/site/SiteHome.tsx +++ b/src/components/site/SiteHome.tsx @@ -31,8 +31,8 @@ export const SiteHome: React.FC<{
- {/* eslint-disable-next-line @next/next/no-img-element */} {post.cover && ( + /* eslint-disable-next-line @next/next/no-img-element */ cover { } if (search.has("tenant")) { - return search.get("tenant") + return { + subdomain: search.get("tenant"), + } } const OUR_DOMAIN_SUFFIX = `.${OUR_DOMAIN}` @@ -18,7 +20,26 @@ export const getTenant = async (request: Request, search: URLSearchParams) => { } if (host.endsWith(OUR_DOMAIN_SUFFIX)) { const subdomain = host.replace(OUR_DOMAIN_SUFFIX, "") - return subdomain + const res = await fetch( + `https://indexer.crossbell.io/v1/handles/${subdomain}/character`, + ) + const char = await res.json() + const customDomain = + char?.metadata?.content?.attributes?.find( + (a: any) => a.trait_type === "xlog_custom_domain", + )?.value || "" + if (customDomain) { + return { + redirect: /^https?:\/\//.test(customDomain) + ? customDomain + : `https://${customDomain}`, + subdomain: subdomain, + } + } else { + return { + subdomain: subdomain, + } + } } if (host !== OUR_DOMAIN) { const res = await fetch( @@ -41,7 +62,9 @@ export const getTenant = async (request: Request, search: URLSearchParams) => { (a: any) => a.trait_type === "xlog_custom_domain", )?.value || "" if (customDomain && customDomain === host) { - return tenant + return { + subdomain: tenant, + } } } } diff --git a/src/pages/_middleware.ts b/src/pages/_middleware.ts index 1e4861f2..1bd9e0fc 100644 --- a/src/pages/_middleware.ts +++ b/src/pages/_middleware.ts @@ -41,14 +41,20 @@ export default async function middleware(req: NextRequest) { const tenant = await getTenant(req, req.nextUrl.searchParams) + if (tenant?.redirect && IS_PROD) { + return NextResponse.redirect( + `${tenant.redirect}${req.nextUrl.pathname}${req.nextUrl.search}`, + ) + } + if (pathname.startsWith("/api/") || pathname.startsWith("/dashboard")) { return NextResponse.next() } - if (tenant) { + if (tenant?.subdomain) { const url = req.nextUrl.clone() if (url.pathname !== "/ipfs-gateway-sw.js") { - url.pathname = `/_site/${tenant}${url.pathname}` + url.pathname = `/_site/${tenant?.subdomain}${url.pathname}` } return NextResponse.rewrite(url) }