diff --git a/apps/scandic-web/server/routers/contentstack/metadata/input.ts b/apps/scandic-web/server/routers/contentstack/metadata/input.ts index 54359f9fd..836a4645e 100644 --- a/apps/scandic-web/server/routers/contentstack/metadata/input.ts +++ b/apps/scandic-web/server/routers/contentstack/metadata/input.ts @@ -3,4 +3,5 @@ import { z } from "zod" export const getMetadataInput = z.object({ subpage: z.string().optional(), filterFromUrl: z.string().optional(), + noIndex: z.boolean().default(false), }) diff --git a/apps/scandic-web/server/routers/contentstack/metadata/output.ts b/apps/scandic-web/server/routers/contentstack/metadata/output.ts index 898492210..9b207999c 100644 --- a/apps/scandic-web/server/routers/contentstack/metadata/output.ts +++ b/apps/scandic-web/server/routers/contentstack/metadata/output.ts @@ -120,7 +120,7 @@ export const metadataSchema = rawMetadataSchema.transform(async (data) => { if (noIndex) { metadata.robots = { index: false, - follow: true, + follow: false, } } return metadata diff --git a/apps/scandic-web/server/routers/contentstack/metadata/query.ts b/apps/scandic-web/server/routers/contentstack/metadata/query.ts index d46fc4cf8..8b1757c8a 100644 --- a/apps/scandic-web/server/routers/contentstack/metadata/query.ts +++ b/apps/scandic-web/server/routers/contentstack/metadata/query.ts @@ -95,10 +95,7 @@ const fetchMetadata = cache(async function fetchMemoizedMetadata( return response.data }) -async function getTransformedMetadata( - data: unknown, - alternates: Metadata["alternates"] -) { +async function getTransformedMetadata(data: unknown) { transformMetadataCounter.add(1) console.info("contentstack.metadata transform start") const validatedMetadata = await metadataSchema.safeParseAsync(data) @@ -120,9 +117,6 @@ async function getTransformedMetadata( transformMetadataSuccessCounter.add(1) console.info("contentstack.metadata transform success") - if (alternates) { - validatedMetadata.data.alternates = alternates - } return validatedMetadata.data } @@ -163,39 +157,41 @@ export const metadataQueryRouter = router({ } } + let metadata: Metadata | null = null + switch (ctx.contentType) { case PageContentTypeEnum.accountPage: const accountPageResponse = await fetchMetadata<{ account_page: RawMetadataSchema }>(GetAccountPageMetadata, variables) - return getTransformedMetadata( - accountPageResponse.account_page, - alternates + metadata = await getTransformedMetadata( + accountPageResponse.account_page ) + break case PageContentTypeEnum.collectionPage: const collectionPageResponse = await fetchMetadata<{ collection_page: RawMetadataSchema }>(GetCollectionPageMetadata, variables) - return getTransformedMetadata( - collectionPageResponse.collection_page, - alternates + metadata = await getTransformedMetadata( + collectionPageResponse.collection_page ) + break case PageContentTypeEnum.contentPage: const contentPageResponse = await fetchMetadata<{ content_page: RawMetadataSchema }>(GetContentPageMetadata, variables) - return getTransformedMetadata( - contentPageResponse.content_page, - alternates + metadata = await getTransformedMetadata( + contentPageResponse.content_page ) + break case PageContentTypeEnum.destinationOverviewPage: const destinationOverviewPageResponse = await fetchMetadata<{ destination_overview_page: RawMetadataSchema }>(GetDestinationOverviewPageMetadata, variables) - return getTransformedMetadata( - destinationOverviewPageResponse.destination_overview_page, - alternates + metadata = await getTransformedMetadata( + destinationOverviewPageResponse.destination_overview_page ) + break case PageContentTypeEnum.destinationCountryPage: const destinationCountryPageResponse = await fetchMetadata<{ destination_country_page: RawMetadataSchema @@ -206,13 +202,11 @@ export const metadataQueryRouter = router({ ctx.serviceToken, ctx.lang ) - return getTransformedMetadata( - { - ...destinationCountryPageResponse.destination_country_page, - ...countryData, - }, - alternates - ) + metadata = await getTransformedMetadata({ + ...destinationCountryPageResponse.destination_country_page, + ...countryData, + }) + break case PageContentTypeEnum.destinationCityPage: const destinationCityPageResponse = await fetchMetadata<{ destination_city_page: RawMetadataSchema @@ -223,21 +217,19 @@ export const metadataQueryRouter = router({ ctx.serviceToken, ctx.lang ) - return getTransformedMetadata( - { - ...destinationCityPageResponse.destination_city_page, - ...cityData, - }, - alternates - ) + metadata = await getTransformedMetadata({ + ...destinationCityPageResponse.destination_city_page, + ...cityData, + }) + break case PageContentTypeEnum.loyaltyPage: const loyaltyPageResponse = await fetchMetadata<{ loyalty_page: RawMetadataSchema }>(GetLoyaltyPageMetadata, variables) - return getTransformedMetadata( - loyaltyPageResponse.loyalty_page, - alternates + metadata = await getTransformedMetadata( + loyaltyPageResponse.loyalty_page ) + break case PageContentTypeEnum.hotelPage: const hotelPageResponse = await fetchMetadata<{ hotel_page: RawMetadataSchema @@ -254,23 +246,32 @@ export const metadataQueryRouter = router({ ) : null - return getTransformedMetadata( - { - ...hotelPageData, - hotelData: hotelData?.hotel, - }, - alternates - ) + metadata = await getTransformedMetadata({ + ...hotelPageData, + hotelData: hotelData?.hotel, + }) + break case PageContentTypeEnum.startPage: const startPageResponse = await fetchMetadata<{ start_page: RawMetadataSchema }>(GetStartPageMetadata, variables) - return getTransformedMetadata( - startPageResponse.start_page, - alternates - ) + metadata = await getTransformedMetadata(startPageResponse.start_page) default: - return null + break } + + if (metadata) { + if (alternates) { + metadata.alternates = alternates + } + if (input.noIndex) { + metadata.robots = { + index: false, + follow: false, + } + } + } + + return metadata }), }) diff --git a/apps/scandic-web/utils/generateMetadata.ts b/apps/scandic-web/utils/generateMetadata.ts index 90d39d3d3..6a6c1ca3a 100644 --- a/apps/scandic-web/utils/generateMetadata.ts +++ b/apps/scandic-web/utils/generateMetadata.ts @@ -13,10 +13,14 @@ export async function generateMetadata({ LangParams & ContentTypeParams & UIDParams, { subpage?: string; filterFromUrl?: string } >) { - const { subpage, filterFromUrl } = searchParams + const { subpage, filterFromUrl, ...otherSearchParams } = searchParams + // If there are other (real) search params, we don't want to index the page as this will + // cause duplicate content issues. + const noIndexOnSearchParams = !!Object.keys(otherSearchParams).length const metadata = await serverClient().contentstack.metadata.get({ subpage, filterFromUrl, + noIndex: noIndexOnSearchParams, }) return metadata }