Merged in feat/sw-2863-move-contentstack-router-to-trpc-package (pull request #2389)
feat(SW-2863): Move contentstack router to trpc package * Add exports to packages and lint rule to prevent relative imports * Add env to trpc package * Add eslint to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package Approved-by: Linus Flood
This commit is contained in:
266
packages/trpc/lib/routers/contentstack/breadcrumbs/query.ts
Normal file
266
packages/trpc/lib/routers/contentstack/breadcrumbs/query.ts
Normal file
@@ -0,0 +1,266 @@
|
||||
import { cache } from "react"
|
||||
|
||||
import { createCounter } from "@scandic-hotels/common/telemetry"
|
||||
import { notFound } from "@scandic-hotels/trpc/errors"
|
||||
import { contentstackExtendedProcedureUID } from "@scandic-hotels/trpc/procedures"
|
||||
|
||||
import { router } from "../../.."
|
||||
import { PageContentTypeEnum } from "../../../enums/contentType"
|
||||
import {
|
||||
GetMyPagesBreadcrumbs,
|
||||
GetMyPagesBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/AccountPage.graphql"
|
||||
import {
|
||||
GetCampaignOverviewPageBreadcrumbs,
|
||||
GetCampaignOverviewPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/CampaignOverviewPage.graphql"
|
||||
import {
|
||||
GetCampaignPageBreadcrumbs,
|
||||
GetCampaignPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/CampaignPage.graphql"
|
||||
import {
|
||||
GetCollectionPageBreadcrumbs,
|
||||
GetCollectionPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/CollectionPage.graphql"
|
||||
import {
|
||||
GetContentPageBreadcrumbs,
|
||||
GetContentPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/ContentPage.graphql"
|
||||
import {
|
||||
GetDestinationCityPageBreadcrumbs,
|
||||
GetDestinationCityPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/DestinationCityPage.graphql"
|
||||
import {
|
||||
GetDestinationCountryPageBreadcrumbs,
|
||||
GetDestinationCountryPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/DestinationCountryPage.graphql"
|
||||
import {
|
||||
GetDestinationOverviewPageBreadcrumbs,
|
||||
GetDestinationOverviewPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/DestinationOverviewPage.graphql"
|
||||
import {
|
||||
GetHotelPageBreadcrumbs,
|
||||
GetHotelPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/HotelPage.graphql"
|
||||
import {
|
||||
GetLoyaltyPageBreadcrumbs,
|
||||
GetLoyaltyPageBreadcrumbsRefs,
|
||||
} from "../../../graphql/Query/Breadcrumbs/LoyaltyPage.graphql"
|
||||
import { request } from "../../../graphql/request"
|
||||
import { generateRefsResponseTag } from "../../../utils/generateTag"
|
||||
import { breadcrumbsRefsSchema, breadcrumbsSchema } from "./output"
|
||||
import { getTags } from "./utils"
|
||||
|
||||
import type { Lang } from "@scandic-hotels/common/constants/language"
|
||||
|
||||
import type {
|
||||
BreadcrumbsRefsSchema,
|
||||
RawBreadcrumbsSchema,
|
||||
} from "../../../types/breadcrumbs"
|
||||
|
||||
interface BreadcrumbsPageData<T> {
|
||||
dataKey: keyof T
|
||||
refQuery: string
|
||||
query: string
|
||||
}
|
||||
|
||||
const getBreadcrumbs = cache(async function fetchMemoizedBreadcrumbs<T>(
|
||||
{ dataKey, refQuery, query }: BreadcrumbsPageData<T>,
|
||||
{ uid, lang }: { uid: string; lang: Lang }
|
||||
) {
|
||||
const getBreadcrumbsRefsCounter = createCounter(
|
||||
"trpc.contentstack",
|
||||
"breadcrumbs.get.refs"
|
||||
)
|
||||
const metricsGetBreadcrumbsRefs = getBreadcrumbsRefsCounter.init({
|
||||
lang,
|
||||
uid,
|
||||
})
|
||||
|
||||
metricsGetBreadcrumbsRefs.start()
|
||||
|
||||
const refsResponse = await request<{ [K in keyof T]: BreadcrumbsRefsSchema }>(
|
||||
refQuery,
|
||||
{ locale: lang, uid },
|
||||
{
|
||||
key: generateRefsResponseTag(lang, uid, "breadcrumbs"),
|
||||
ttl: "max",
|
||||
}
|
||||
)
|
||||
|
||||
const validatedRefsData = breadcrumbsRefsSchema.safeParse(
|
||||
refsResponse.data[dataKey]
|
||||
)
|
||||
|
||||
if (!validatedRefsData.success) {
|
||||
metricsGetBreadcrumbsRefs.validationError(validatedRefsData.error)
|
||||
return []
|
||||
}
|
||||
|
||||
metricsGetBreadcrumbsRefs.success()
|
||||
|
||||
const tags = getTags(validatedRefsData.data, lang)
|
||||
|
||||
const getBreadcrumbsCounter = createCounter(
|
||||
"trpc.contentstack",
|
||||
"breadcrumbs.get"
|
||||
)
|
||||
const metricsGetBreadcrumbs = getBreadcrumbsCounter.init({
|
||||
lang,
|
||||
uid,
|
||||
})
|
||||
|
||||
metricsGetBreadcrumbs.start()
|
||||
|
||||
const response = await request<T>(
|
||||
query,
|
||||
{ locale: lang, uid },
|
||||
{
|
||||
key: tags,
|
||||
ttl: "max",
|
||||
}
|
||||
)
|
||||
|
||||
if (!response.data) {
|
||||
const notFoundError = notFound(response)
|
||||
metricsGetBreadcrumbs.noDataError()
|
||||
throw notFoundError
|
||||
}
|
||||
|
||||
const validatedBreadcrumbs = breadcrumbsSchema.safeParse(
|
||||
response.data[dataKey]
|
||||
)
|
||||
|
||||
if (!validatedBreadcrumbs.success) {
|
||||
metricsGetBreadcrumbs.validationError(validatedBreadcrumbs.error)
|
||||
return []
|
||||
}
|
||||
|
||||
metricsGetBreadcrumbs.success()
|
||||
|
||||
return validatedBreadcrumbs.data
|
||||
})
|
||||
|
||||
export const breadcrumbsQueryRouter = router({
|
||||
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
|
||||
const variables = {
|
||||
lang: ctx.lang,
|
||||
uid: ctx.uid,
|
||||
}
|
||||
|
||||
switch (ctx.contentType) {
|
||||
case PageContentTypeEnum.accountPage:
|
||||
return await getBreadcrumbs<{
|
||||
account_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "account_page",
|
||||
refQuery: GetMyPagesBreadcrumbsRefs,
|
||||
query: GetMyPagesBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.campaignOverviewPage:
|
||||
return await getBreadcrumbs<{
|
||||
campaign_overview_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "campaign_overview_page",
|
||||
refQuery: GetCampaignOverviewPageBreadcrumbsRefs,
|
||||
query: GetCampaignOverviewPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.campaignPage:
|
||||
return await getBreadcrumbs<{
|
||||
campaign_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "campaign_page",
|
||||
refQuery: GetCampaignPageBreadcrumbsRefs,
|
||||
query: GetCampaignPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.collectionPage:
|
||||
return await getBreadcrumbs<{
|
||||
collection_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "collection_page",
|
||||
refQuery: GetCollectionPageBreadcrumbsRefs,
|
||||
query: GetCollectionPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.contentPage:
|
||||
return await getBreadcrumbs<{
|
||||
content_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "content_page",
|
||||
refQuery: GetContentPageBreadcrumbsRefs,
|
||||
query: GetContentPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.destinationOverviewPage:
|
||||
return await getBreadcrumbs<{
|
||||
destination_overview_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "destination_overview_page",
|
||||
refQuery: GetDestinationOverviewPageBreadcrumbsRefs,
|
||||
query: GetDestinationOverviewPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.destinationCountryPage:
|
||||
return await getBreadcrumbs<{
|
||||
destination_country_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "destination_country_page",
|
||||
refQuery: GetDestinationCountryPageBreadcrumbsRefs,
|
||||
query: GetDestinationCountryPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.destinationCityPage:
|
||||
return await getBreadcrumbs<{
|
||||
destination_city_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "destination_city_page",
|
||||
refQuery: GetDestinationCityPageBreadcrumbsRefs,
|
||||
query: GetDestinationCityPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.hotelPage:
|
||||
return await getBreadcrumbs<{
|
||||
hotel_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "hotel_page",
|
||||
refQuery: GetHotelPageBreadcrumbsRefs,
|
||||
query: GetHotelPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
case PageContentTypeEnum.loyaltyPage:
|
||||
return await getBreadcrumbs<{
|
||||
loyalty_page: RawBreadcrumbsSchema
|
||||
}>(
|
||||
{
|
||||
dataKey: "loyalty_page",
|
||||
refQuery: GetLoyaltyPageBreadcrumbsRefs,
|
||||
query: GetLoyaltyPageBreadcrumbs,
|
||||
},
|
||||
variables
|
||||
)
|
||||
default:
|
||||
return []
|
||||
}
|
||||
}),
|
||||
})
|
||||
Reference in New Issue
Block a user