diff --git a/src/pages/api/beers/styles/[id]/beers/getAllBeersByBeerStyle.ts b/src/pages/api/beers/styles/[id]/beers/getAllBeersByBeerStyle.ts new file mode 100644 index 0000000..1524073 --- /dev/null +++ b/src/pages/api/beers/styles/[id]/beers/getAllBeersByBeerStyle.ts @@ -0,0 +1,45 @@ +import DBClient from '@/prisma/DBClient'; +import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { z } from 'zod'; +import { GetAllBeersByBeerStyleRequest } from '.'; + +export const getAllBeersByBeerStyle = async ( + req: GetAllBeersByBeerStyleRequest, + res: NextApiResponse>, +) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num, id } = req.query; + + const beers: z.infer[] = + await DBClient.instance.beerPost.findMany({ + where: { styleId: id }, + take: parseInt(page_size, 10), + skip: parseInt(page_num, 10) * parseInt(page_size, 10), + select: { + id: true, + name: true, + ibu: true, + abv: true, + createdAt: true, + updatedAt: true, + description: true, + postedBy: { select: { username: true, id: true } }, + brewery: { select: { name: true, id: true } }, + style: { select: { name: true, id: true, description: true } }, + beerImages: { select: { alt: true, path: true, caption: true, id: true } }, + }, + }); + + const pageCount = await DBClient.instance.beerPost.count({ where: { styleId: id } }); + + res.setHeader('X-Total-Count', pageCount); + + res.status(200).json({ + message: 'Beers fetched successfully', + statusCode: 200, + payload: beers, + success: true, + }); +}; diff --git a/src/pages/api/beers/styles/[id]/beers/index.ts b/src/pages/api/beers/styles/[id]/beers/index.ts index ca66936..532c903 100644 --- a/src/pages/api/beers/styles/[id]/beers/index.ts +++ b/src/pages/api/beers/styles/[id]/beers/index.ts @@ -1,7 +1,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import getBeerPostsByBeerStyleId from '@/services/BeerPost/getBeerPostsByBeerStyleId'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiRequest, NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; @@ -18,25 +18,11 @@ const getAllBeersByBeerStyle = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num, id } = req.query; - const beers: z.infer[] = - await DBClient.instance.beerPost.findMany({ - where: { styleId: id }, - take: parseInt(page_size, 10), - skip: parseInt(page_num, 10) * parseInt(page_size, 10), - select: { - id: true, - name: true, - ibu: true, - abv: true, - createdAt: true, - updatedAt: true, - description: true, - postedBy: { select: { username: true, id: true } }, - brewery: { select: { name: true, id: true } }, - style: { select: { name: true, id: true, description: true } }, - beerImages: { select: { alt: true, path: true, caption: true, id: true } }, - }, - }); + const beers = getBeerPostsByBeerStyleId({ + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + styleId: id, + }); const pageCount = await DBClient.instance.beerPost.count({ where: { styleId: id } }); diff --git a/src/services/BeerPost/getBeerPostsByBeerStyleId.ts b/src/services/BeerPost/getBeerPostsByBeerStyleId.ts new file mode 100644 index 0000000..adc1fc7 --- /dev/null +++ b/src/services/BeerPost/getBeerPostsByBeerStyleId.ts @@ -0,0 +1,38 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import BeerPostQueryResult from './schema/BeerPostQueryResult'; + +interface GetBeerPostsByBeerStyleIdArgs { + styleId: string; + pageSize: number; + pageNum: number; +} + +const getBeerPostsByBeerStyleId = async ({ + pageNum, + pageSize, + styleId, +}: GetBeerPostsByBeerStyleIdArgs): Promise[]> => { + const beers = await DBClient.instance.beerPost.findMany({ + where: { styleId }, + take: pageSize, + skip: pageNum * pageSize, + select: { + id: true, + name: true, + ibu: true, + abv: true, + createdAt: true, + updatedAt: true, + description: true, + postedBy: { select: { username: true, id: true } }, + brewery: { select: { name: true, id: true } }, + style: { select: { name: true, id: true, description: true } }, + beerImages: { select: { alt: true, path: true, caption: true, id: true } }, + }, + }); + + return beers; +}; + +export default getBeerPostsByBeerStyleId; diff --git a/src/services/BeerPost/getBeerPostsByBreweryId.ts b/src/services/BeerPost/getBeerPostsByBreweryId.ts new file mode 100644 index 0000000..910391b --- /dev/null +++ b/src/services/BeerPost/getBeerPostsByBreweryId.ts @@ -0,0 +1,38 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import BeerPostQueryResult from './schema/BeerPostQueryResult'; + +interface GetBeerPostsByBeerStyleIdArgs { + breweryId: string; + pageSize: number; + pageNum: number; +} + +const getBeerPostsByBeerStyleId = async ({ + pageNum, + pageSize, + breweryId, +}: GetBeerPostsByBeerStyleIdArgs): Promise[]> => { + const beers = await DBClient.instance.beerPost.findMany({ + where: { breweryId }, + take: pageSize, + skip: pageNum * pageSize, + select: { + id: true, + name: true, + ibu: true, + abv: true, + createdAt: true, + updatedAt: true, + description: true, + postedBy: { select: { username: true, id: true } }, + brewery: { select: { name: true, id: true } }, + style: { select: { name: true, id: true, description: true } }, + beerImages: { select: { alt: true, path: true, caption: true, id: true } }, + }, + }); + + return beers; +}; + +export default getBeerPostsByBeerStyleId;