diff --git a/src/components/BeerIndex/BeerCard.tsx b/src/components/BeerIndex/BeerCard.tsx index 3747f7e..962829e 100644 --- a/src/components/BeerIndex/BeerCard.tsx +++ b/src/components/BeerIndex/BeerCard.tsx @@ -39,7 +39,12 @@ const BeerCard: FC<{ post: z.infer }> = ({ post }) =
-

{post.style.name}

+ + {post.style.name} +
{post.abv.toFixed(1)}% ABV {post.ibu.toFixed(1)} IBU diff --git a/src/components/BeerStyle/BeerStyleCard.tsx b/src/components/BeerStyle/BeerStyleCard.tsx index 4c265fb..68d3a62 100644 --- a/src/components/BeerStyle/BeerStyleCard.tsx +++ b/src/components/BeerStyle/BeerStyleCard.tsx @@ -11,7 +11,7 @@ const BeerStyleCard: FC<{ beerStyle: z.infer }> = (
- +

{beerStyle.name}

@@ -20,7 +20,7 @@ const BeerStyleCard: FC<{ beerStyle: z.infer }> = (
ABV Range:{' '} - {beerStyle.abvRange[0].toFixed(1)}% - {beerStyle.abvRange[1].toFixed(1)}% + {beerStyle.abvRange[0].toFixed(1)}% - {beerStyle.abvRange[0].toFixed(1)}%
@@ -31,8 +31,8 @@ const BeerStyleCard: FC<{ beerStyle: z.infer }> = (
-
-

{beerStyle.description}

+
+

{beerStyle.description}

diff --git a/src/pages/api/beers/styles/[id].ts b/src/pages/api/beers/styles/[id].ts new file mode 100644 index 0000000..e72e8c1 --- /dev/null +++ b/src/pages/api/beers/styles/[id].ts @@ -0,0 +1,41 @@ +import validateRequest from '@/config/nextConnect/middleware/validateRequest'; +import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; + +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { createRouter } from 'next-connect'; +import { z } from 'zod'; + +interface GetBeerStyleByIdRequest extends NextApiRequest { + query: { id: string }; +} + +const getBeerStyle = async ( + req: GetBeerStyleByIdRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const beerStyle = await getBeerStyleById(id); + + res.status(200).json({ + message: 'Beer types retrieved successfully', + statusCode: 200, + payload: beerStyle, + success: true, + }); +}; + +const router = createRouter< + GetBeerStyleByIdRequest, + NextApiResponse> +>(); + +router.get( + validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), + getBeerStyle, +); + +const handler = router.handler(); + +export default handler; diff --git a/src/pages/beers/styles/[id]/index.tsx b/src/pages/beers/styles/[id]/index.tsx new file mode 100644 index 0000000..2f99284 --- /dev/null +++ b/src/pages/beers/styles/[id]/index.tsx @@ -0,0 +1,33 @@ +import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import { GetServerSideProps, NextPage } from 'next'; +import { z } from 'zod'; + +interface BeerStylePageProps { + beerStyle: z.infer; +} + +const BeerStylePage: NextPage = ({ beerStyle }) => { + return ( +
+

{beerStyle.name}

+

{beerStyle.description}

+
+ ); +}; + +export default BeerStylePage; + +export const getServerSideProps: GetServerSideProps = async ( + context, +) => { + const beerStyle = await getBeerStyleById(context.params!.id! as string); + + if (!beerStyle) { + return { + notFound: true, + }; + } + + return { props: { beerStyle: JSON.parse(JSON.stringify(beerStyle)) } }; +}; diff --git a/src/pages/beers/styles/index.tsx b/src/pages/beers/styles/index.tsx index a4bf4da..92bac39 100644 --- a/src/pages/beers/styles/index.tsx +++ b/src/pages/beers/styles/index.tsx @@ -38,7 +38,7 @@ const BeerStylePage: NextPage = () => {

The Biergarten App

-

Types

+

Styles

diff --git a/src/prisma/seed/util/beerStyles.ts b/src/prisma/seed/util/beerStyles.ts index 5cee9f4..d257414 100644 --- a/src/prisma/seed/util/beerStyles.ts +++ b/src/prisma/seed/util/beerStyles.ts @@ -1,4 +1,4 @@ -interface IBeerStyle { +interface BeerStyle { name: string; description: string; glassware: string; @@ -6,7 +6,7 @@ interface IBeerStyle { ibuRange: [number, number]; } -const beerStyles: IBeerStyle[] = [ +const beerStyles: BeerStyle[] = [ { name: 'Bock', description: diff --git a/src/prisma/seed/util/canadianCities.ts b/src/prisma/seed/util/canadianCities.ts index 12ca6c2..2369741 100755 --- a/src/prisma/seed/util/canadianCities.ts +++ b/src/prisma/seed/util/canadianCities.ts @@ -1,4 +1,11 @@ -export default [ +interface City { + city: string; + province: string; + latitude: number; + longitude: number; +} + +const canadianCities: City[] = [ { city: 'Toronto', province: 'Ontario', @@ -10423,3 +10430,5 @@ export default [ longitude: -110.4739, }, ]; + +export default canadianCities; diff --git a/src/services/BeerStyles/getBeerStyleById.ts b/src/services/BeerStyles/getBeerStyleById.ts new file mode 100644 index 0000000..a81c66f --- /dev/null +++ b/src/services/BeerStyles/getBeerStyleById.ts @@ -0,0 +1,24 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import BeerStyleQueryResult from './schema/BeerStyleQueryResult'; + +const getBeerStyleById = async (id: string) => { + const beerStyle = (await DBClient.instance.beerStyle.findUnique({ + where: { id }, + select: { + id: true, + name: true, + postedBy: { select: { id: true, username: true } }, + createdAt: true, + updatedAt: true, + abvRange: true, + ibuRange: true, + description: true, + glassware: { select: { id: true, name: true } }, + }, + })) as z.infer | null; + + return beerStyle; +}; + +export default getBeerStyleById;