From 27477de14e5981ee7aaef93185838951da81bc97 Mon Sep 17 00:00:00 2001 From: Jonas Braathen Date: Wed, 14 Aug 2024 22:13:49 +0200 Subject: [PATCH] improve graphql error handling --- web/src/app/[...url]/page.tsx | 27 ++++++++++++++-------- web/src/app/aktuelt/[slug]/page.tsx | 28 +++++++++++++++-------- web/src/app/aktuelt/page.tsx | 13 +++++++---- web/src/app/arrangementer/[slug]/page.tsx | 25 ++++++++++++++------ web/src/app/arrangementer/page.tsx | 22 +++++++++++++++--- web/src/app/foreninger/[slug]/page.tsx | 25 ++++++++++++++------ web/src/app/foreninger/page.tsx | 19 +++++++++++---- web/src/app/kontakt/page.tsx | 18 ++++++++++++--- web/src/app/lokaler/[slug]/page.tsx | 25 ++++++++++++++------ web/src/app/lokaler/page.tsx | 17 +++++++++++--- web/src/app/utleie/page.tsx | 17 +++++++++++--- 11 files changed, 175 insertions(+), 61 deletions(-) diff --git a/web/src/app/[...url]/page.tsx b/web/src/app/[...url]/page.tsx index b089db0..4e0676d 100644 --- a/web/src/app/[...url]/page.tsx +++ b/web/src/app/[...url]/page.tsx @@ -51,12 +51,14 @@ export async function generateStaticParams() { } `); const { data, error } = await getClient().query(allGenericSlugsQuery, {}); - - if (data === undefined || error) { - throw new Error("failed to generate static params"); + if (error) { + throw new Error(error.message); + } + if (!data?.pages) { + throw new Error("Failed to generate static params for generic subpages"); } - return data?.pages.map((page: any) => { + return data.pages.map((page: any) => { // wagtail-grapple prepends the home page slug to the full path on multisite setups // we also strip the trailing slash const urlPath: string[] = page.urlPath @@ -79,12 +81,14 @@ export async function generateMetadata( urlPath: urlPath, }); - const page = (data?.page ?? []) as GenericFragment; - - if (!page) { + if (error) { + throw new Error(error.message); + } + if (!data?.page) { return null; } + const page = data.page as GenericFragment; const metadata = await getSeoMetadata(page, parent); return metadata; } @@ -95,13 +99,16 @@ export default async function Page({ params }: { params: { url: string[] } }) { const { data, error } = await getClient().query(genericPageByUrlPathQuery, { urlPath: urlPath, }); + if (error) { + throw new Error(error.message); + } - const page = (data?.page ?? []) as GenericFragment; - - if (!page) { + if (!data?.page) { return notFound(); } + const page = data?.page as GenericFragment; + return ( <>
diff --git a/web/src/app/aktuelt/[slug]/page.tsx b/web/src/app/aktuelt/[slug]/page.tsx index b905abf..370a1ac 100644 --- a/web/src/app/aktuelt/[slug]/page.tsx +++ b/web/src/app/aktuelt/[slug]/page.tsx @@ -30,11 +30,16 @@ export async function generateStaticParams() { `); const { data, error } = await getClient().query(allNewsSlugsQuery, {}); - if (data === undefined || error) { - throw new Error("failed to generate static params"); + if (error) { + throw new Error(error.message); + } + if (!data?.pages) { + throw new Error( + "Failed to generate static params for subpages of /aktuelt" + ); } - return data?.pages.map((page: any) => ({ + return data.pages.map((page: any) => ({ slug: page.slug, })); } @@ -46,12 +51,13 @@ export async function generateMetadata( const { data, error } = await getClient().query(newsBySlugQuery, { slug: params.slug, }); - const news = (data?.news ?? []) as NewsFragment[]; - - if (!news) { + if (error) { + throw new Error(error.message); + } + if (!data?.news) { return null; } - + const news = data.news as NewsFragment; const metadata = await getSeoMetadata(news, parent); return metadata; } @@ -61,13 +67,15 @@ export default async function Page({ params }: { params: { slug: string } }) { slug: params.slug, }); - if (data?.news === null || error) { + if (error) { + throw new Error(error.message); + } + if (!data?.news) { return notFound(); } - const news = (data?.news ?? {}) as NewsFragment; + const news = data?.news as NewsFragment; const featuredImage: any = news.featuredImage; - return (
diff --git a/web/src/app/aktuelt/page.tsx b/web/src/app/aktuelt/page.tsx index d9b23bc..81a9e6d 100644 --- a/web/src/app/aktuelt/page.tsx +++ b/web/src/app/aktuelt/page.tsx @@ -10,20 +10,25 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(newsQuery, {}); - const index = (data?.index ?? []) as NewsIndexFragment; - - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = data.index as NewsIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } export default async function Page() { const { data, error } = await getClient().query(newsQuery, {}); + if (error) { + throw new Error(error.message); + } const news = (data?.news ?? []) as NewsFragment[]; - const index = (data?.index ?? []) as NewsIndexFragment; + const index = data?.index as NewsIndexFragment; return (
diff --git a/web/src/app/arrangementer/[slug]/page.tsx b/web/src/app/arrangementer/[slug]/page.tsx index b8ff7f0..a97fb57 100644 --- a/web/src/app/arrangementer/[slug]/page.tsx +++ b/web/src/app/arrangementer/[slug]/page.tsx @@ -31,11 +31,16 @@ export async function generateStaticParams() { `); const { data, error } = await getClient().query(allEventSlugsQuery, {}); - if (data === undefined || error) { - throw new Error("failed to generate static params"); + if (error) { + throw new Error(error.message); + } + if (!data?.pages) { + throw new Error( + "Failed to generate static params for subpages of /arrangementer" + ); } - return data?.pages.map((page: any) => ({ + return data.pages.map((page: any) => ({ slug: page.slug, })); } @@ -47,12 +52,15 @@ export async function generateMetadata( const { data, error } = await getClient().query(eventBySlugQuery, { slug: params.slug, }); - const event = (data?.event ?? []) as EventFragment[]; - if (!event) { + if (error) { + throw new Error(error.message); + } + if (!data?.event) { return null; } + const event = data.event as EventFragment; const metadata = await getSeoMetadata(event, parent); return metadata; } @@ -62,11 +70,14 @@ export default async function Page({ params }: { params: { slug: string } }) { slug: params.slug, }); - if (data?.event === null || error) { + if (error) { + throw new Error(error.message); + } + if (!data?.event) { return notFound(); } - const event = (data?.event ?? {}) as EventFragment; + const event = data.event as EventFragment; const eventPig = getEventPig(event); return ( diff --git a/web/src/app/arrangementer/page.tsx b/web/src/app/arrangementer/page.tsx index 3a6fee5..cedc60b 100644 --- a/web/src/app/arrangementer/page.tsx +++ b/web/src/app/arrangementer/page.tsx @@ -18,19 +18,35 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(eventIndexMetadataQuery, {}); - const index = (data?.index ?? []) as EventIndexFragment; - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = data.index as EventIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } export default async function Page() { const { data, error } = await getClient().query(eventsOverviewQuery, {}); - const index = (data?.index ?? []) as EventIndexFragment; + if (error) { + throw new Error(error.message); + } + if ( + !data?.index || + !data?.events?.futureEvents || + !data?.eventCategories || + !data?.eventOrganizers || + !data?.venues + ) { + throw new Error("Failed to render /arrangementer"); + } + + const index = data?.index as EventIndexFragment; const events = (data?.events?.futureEvents ?? []) as EventFragment[]; const eventCategories = (data?.eventCategories ?? []) as EventCategory[]; const eventOrganizers = (data?.eventOrganizers ?? []) as EventOrganizer[]; diff --git a/web/src/app/foreninger/[slug]/page.tsx b/web/src/app/foreninger/[slug]/page.tsx index cfdcf12..795b7db 100644 --- a/web/src/app/foreninger/[slug]/page.tsx +++ b/web/src/app/foreninger/[slug]/page.tsx @@ -27,12 +27,15 @@ export async function generateMetadata( const { data, error } = await getClient().query(associationBySlugQuery, { slug: params.slug, }); - const association = (data?.association ?? []) as AssociationFragment[]; - if (!association) { + if (error) { + throw new Error(error.message); + } + if (!data?.association) { return null; } + const association = data.association as AssociationFragment; const metadata = await getSeoMetadata(association, parent); return metadata; } @@ -48,11 +51,16 @@ export async function generateStaticParams() { `); const { data, error } = await getClient().query(allAssociationSlugsQuery, {}); - if (data === undefined || error) { - throw new Error("failed to generate static params"); + if (error) { + throw new Error(error.message); + } + if (!data?.pages) { + throw new Error( + "Failed to generate static params for subpages of /foreninger" + ); } - return data?.pages.map((page: any) => ({ + return data.pages.map((page: any) => ({ slug: page.slug, })); } @@ -62,11 +70,14 @@ export default async function Page({ params }: { params: { slug: string } }) { slug: params.slug, }); - if (data?.association === null || error) { + if (error) { + throw new Error(error.message); + } + if (!data?.association) { return notFound(); } - const association = (data?.association ?? {}) as AssociationFragment; + const association = data.association as AssociationFragment; return (
diff --git a/web/src/app/foreninger/page.tsx b/web/src/app/foreninger/page.tsx index f10139e..8f4bb0a 100644 --- a/web/src/app/foreninger/page.tsx +++ b/web/src/app/foreninger/page.tsx @@ -30,12 +30,15 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(allAssociationsQuery, {}); - const index = (data?.index ?? []) as AssociationIndexFragment; - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = data.index as AssociationIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } @@ -79,8 +82,16 @@ const AssociationFragmentDefinition = graphql(` export default async function Page() { const { data, error } = await getClient().query(allAssociationsQuery, {}); - const associations = (data?.associations ?? []) as AssociationFragment[]; - const index = (data?.index ?? []) as AssociationIndexFragment; + + if (error) { + throw new Error(error.message); + } + if (!data?.associations || !data.index) { + throw new Error("Failed to render /foreninger"); + } + + const associations = data.associations as AssociationFragment[]; + const index = data.index as AssociationIndexFragment; return (
diff --git a/web/src/app/kontakt/page.tsx b/web/src/app/kontakt/page.tsx index 8a76f51..542ecf6 100644 --- a/web/src/app/kontakt/page.tsx +++ b/web/src/app/kontakt/page.tsx @@ -1,4 +1,5 @@ import { Metadata, ResolvingMetadata } from "next"; +import { notFound } from "next/navigation"; import { graphql } from "@/gql"; import { ContactIndexFragment } from "@/gql/graphql"; import { getClient } from "@/app/client"; @@ -36,19 +37,30 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(contactQuery, {}); - const index = (data?.index ?? []) as ContactIndexFragment; - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = data.index as ContactIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } export default async function Page() { const { data, error } = await getClient().query(contactQuery, {}); - const index = (data?.index ?? []) as ContactIndexFragment; + + if (error) { + throw new Error(error.message); + } + if (!data?.index) { + return notFound(); + } + + const index = data.index as ContactIndexFragment; return (
diff --git a/web/src/app/lokaler/[slug]/page.tsx b/web/src/app/lokaler/[slug]/page.tsx index 151ddf8..14c4f99 100644 --- a/web/src/app/lokaler/[slug]/page.tsx +++ b/web/src/app/lokaler/[slug]/page.tsx @@ -27,12 +27,15 @@ export async function generateMetadata( const { data, error } = await getClient().query(venueBySlugQuery, { slug: params.slug, }); - const venue = (data?.venue ?? []) as VenueFragment[]; - if (!venue) { + if (error) { + throw new Error(error.message); + } + if (!data?.venue) { return null; } + const venue = data.venue as VenueFragment; const metadata = await getSeoMetadata(venue, parent); return metadata; } @@ -48,11 +51,16 @@ export async function generateStaticParams() { `); const { data, error } = await getClient().query(allVenueSlugsQuery, {}); - if (data === undefined || error) { - throw new Error("failed to generate static params"); + if (error) { + throw new Error(error.message); + } + if (!data?.pages) { + throw new Error( + "Failed to generate static params for subpages of /lokaler" + ); } - return data?.pages.map((page: any) => ({ + return data.pages.map((page: any) => ({ slug: page.slug, })); } @@ -62,11 +70,14 @@ export default async function Page({ params }: { params: { slug: string } }) { slug: params.slug, }); - if (data?.venue === null || error) { + if (error) { + throw new Error(error.message); + } + if (!data?.venue) { return notFound(); } - const venue = (data?.venue ?? {}) as VenueFragment; + const venue = data.venue as VenueFragment; const featuredImage: any = venue.featuredImage; return ( diff --git a/web/src/app/lokaler/page.tsx b/web/src/app/lokaler/page.tsx index ad69555..374f6e0 100644 --- a/web/src/app/lokaler/page.tsx +++ b/web/src/app/lokaler/page.tsx @@ -74,19 +74,30 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(venueIndexQuery, {}); - const index = (data?.index ?? []) as VenueIndexFragment; - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = (data?.index ?? []) as VenueIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } export default async function Page() { const { data, error } = await getClient().query(venueIndexQuery, {}); - const index = (data?.index ?? []) as VenueIndexFragment; + + if (error) { + throw new Error(error.message); + } + if (!data?.index || !data?.venues) { + throw new Error("Failed to render /lokaler"); + } + + const index = data.index as VenueIndexFragment; const venues = (data?.venues ?? []) as VenueFragment[]; const visibleVenues = venues.filter((x) => x.showInOverview); diff --git a/web/src/app/utleie/page.tsx b/web/src/app/utleie/page.tsx index 143e687..0611953 100644 --- a/web/src/app/utleie/page.tsx +++ b/web/src/app/utleie/page.tsx @@ -42,19 +42,30 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const { data, error } = await getClient().query(venueRentalIndexQuery, {}); - const index = (data?.index ?? []) as VenueRentalIndexFragment; - if (!index) { + if (error) { + throw new Error(error.message); + } + if (!data?.index) { return null; } + const index = data.index as VenueRentalIndexFragment; const metadata = await getSeoMetadata(index, parent); return metadata; } export default async function Page() { const { data, error } = await getClient().query(venueRentalIndexQuery, {}); - const index = (data?.index ?? []) as VenueRentalIndexFragment; + + if (error) { + throw new Error(error.message); + } + if (!data?.index || !data?.venues) { + throw new Error("Failed to render /utleie"); + } + + const index = data.index as VenueRentalIndexFragment; const venues = (data?.venues ?? []) as VenueFragment[]; const bookableVenues = venues.filter((venue) => venue.showAsBookable);