From 57c70c229262430de8d910e9235887d6c65d7051 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 15:01:47 -0500 Subject: [PATCH] refactor: finish extracting comment controller logic out of router --- .../{ => comments}/beerComments/index.ts | 59 ++++++++++++++- .../{ => comments}/beerStyleComments/index.ts | 63 +++++++++++++++- .../{ => comments}/breweryComments/index.ts | 65 ++++++++++++++++- .../{requestTypes => comments/types}/index.ts | 6 +- src/pages/api/beer-comments/[id].ts | 4 +- src/pages/api/beer-style-comments/[id].ts | 4 +- src/pages/api/beers/[id]/comments/index.ts | 73 ++----------------- .../api/beers/styles/[id]/comments/index.ts | 66 +---------------- .../api/breweries/[id]/comments/index.ts | 73 +------------------ src/pages/api/brewery-comments/[id].ts | 11 +-- 10 files changed, 205 insertions(+), 219 deletions(-) rename src/controllers/{ => comments}/beerComments/index.ts (53%) rename src/controllers/{ => comments}/beerStyleComments/index.ts (51%) rename src/controllers/{ => comments}/breweryComments/index.ts (50%) rename src/controllers/{requestTypes => comments/types}/index.ts (62%) diff --git a/src/controllers/beerComments/index.ts b/src/controllers/comments/beerComments/index.ts similarity index 53% rename from src/controllers/beerComments/index.ts rename to src/controllers/comments/beerComments/index.ts index 8d532e9..25192df 100644 --- a/src/controllers/beerComments/index.ts +++ b/src/controllers/comments/beerComments/index.ts @@ -6,7 +6,13 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; +import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; +import getAllBeerComments from '@/services/BeerComment/getAllBeerComments'; +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBeerCommentOwner = async ( req: T, @@ -29,7 +35,7 @@ export const checkIfBeerCommentOwner = async ( }; export const editBeerPostComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const { id } = req.query; @@ -64,3 +70,52 @@ export const deleteBeerPostComment = async ( statusCode: 200, }); }; + +export const createBeerPostComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const beerPostId = req.query.id; + + const newBeerComment = await createNewBeerComment({ + content, + rating, + beerPostId, + userId: req.user!.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBeerComment, + success: true, + }); +}; + +export const getAllBeerPostComments = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const beerPostId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBeerComments({ + beerPostId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.beerComment.count({ where: { beerPostId } }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/beerStyleComments/index.ts b/src/controllers/comments/beerStyleComments/index.ts similarity index 51% rename from src/controllers/beerStyleComments/index.ts rename to src/controllers/comments/beerStyleComments/index.ts index 62c10b0..a070af8 100644 --- a/src/controllers/beerStyleComments/index.ts +++ b/src/controllers/comments/beerStyleComments/index.ts @@ -5,7 +5,16 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; + +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import createNewBeerStyleComment from '@/services/BeerStyleComment/createNewBeerStyleComment'; +import getAllBeerStyleComments from '@/services/BeerStyleComment/getAllBeerStyleComments'; + +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBeerStyleCommentOwner = async < CommentRequestType extends CommentRequest, @@ -35,7 +44,7 @@ export const checkIfBeerStyleCommentOwner = async < }; export const editBeerStyleComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const updated = await updateBeerStyleCommentById({ @@ -65,3 +74,53 @@ export const deleteBeerStyleComment = async ( statusCode: 200, }); }; + +export const createComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const newBeerStyleComment: z.infer = + await createNewBeerStyleComment({ + content, + rating, + beerStyleId: req.query.id, + userId: req.user!.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBeerStyleComment, + success: true, + }); +}; + +export const getAll = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const beerStyleId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBeerStyleComments({ + beerStyleId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.beerStyleComment.count({ + where: { beerStyleId }, + }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/breweryComments/index.ts b/src/controllers/comments/breweryComments/index.ts similarity index 50% rename from src/controllers/breweryComments/index.ts rename to src/controllers/comments/breweryComments/index.ts index 2a28b45..956e3d0 100644 --- a/src/controllers/breweryComments/index.ts +++ b/src/controllers/comments/breweryComments/index.ts @@ -5,7 +5,14 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import createNewBreweryComment from '@/services/BreweryComment/createNewBreweryComment'; +import getAllBreweryComments from '@/services/BreweryComment/getAllBreweryComments'; +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBreweryCommentOwner = async < CommentRequestType extends CommentRequest, @@ -30,7 +37,7 @@ export const checkIfBreweryCommentOwner = async < }; export const editBreweryPostComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const { id } = req.query; @@ -66,3 +73,57 @@ export const deleteBreweryPostComment = async ( statusCode: 200, }); }; + +export const createComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const breweryPostId = req.query.id; + + const user = req.user!; + + const newBreweryComment: z.infer = + await createNewBreweryComment({ + content, + rating, + breweryPostId, + userId: user.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBreweryComment, + success: true, + }); +}; + +export const getAll = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const breweryPostId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBreweryComments({ + id: breweryPostId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.breweryComment.count({ + where: { breweryPostId }, + }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/requestTypes/index.ts b/src/controllers/comments/types/index.ts similarity index 62% rename from src/controllers/requestTypes/index.ts rename to src/controllers/comments/types/index.ts index 7f02e52..f56f153 100644 --- a/src/controllers/requestTypes/index.ts +++ b/src/controllers/comments/types/index.ts @@ -6,6 +6,10 @@ export interface CommentRequest extends UserExtendedNextApiRequest { query: { id: string }; } -export interface EditCommentRequest extends CommentRequest { +export interface EditAndCreateCommentRequest extends CommentRequest { body: z.infer; } + +export interface GetAllCommentsRequest extends UserExtendedNextApiRequest { + query: { id: string; page_size: string; page_num: string }; +} diff --git a/src/pages/api/beer-comments/[id].ts b/src/pages/api/beer-comments/[id].ts index bfead50..93ae8ab 100644 --- a/src/pages/api/beer-comments/[id].ts +++ b/src/pages/api/beer-comments/[id].ts @@ -8,12 +8,12 @@ import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest } from '@/controllers/requestTypes'; +import { CommentRequest } from '@/controllers/comments/types'; import { checkIfBeerCommentOwner, deleteBeerPostComment, editBeerPostComment, -} from '@/controllers/beerComments'; +} from '@/controllers/comments/beerComments'; const router = createRouter< CommentRequest, diff --git a/src/pages/api/beer-style-comments/[id].ts b/src/pages/api/beer-style-comments/[id].ts index 835f536..61d7680 100644 --- a/src/pages/api/beer-style-comments/[id].ts +++ b/src/pages/api/beer-style-comments/[id].ts @@ -5,8 +5,8 @@ import { checkIfBeerStyleCommentOwner, deleteBeerStyleComment, editBeerStyleComment, -} from '@/controllers/beerStyleComments'; -import { CommentRequest } from '@/controllers/requestTypes'; +} from '@/controllers/comments/beerStyleComments'; +import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/[id]/comments/index.ts b/src/pages/api/beers/[id]/comments/index.ts index 596d9d4..a9a5c87 100644 --- a/src/pages/api/beers/[id]/comments/index.ts +++ b/src/pages/api/beers/[id]/comments/index.ts @@ -1,78 +1,19 @@ -import DBClient from '@/prisma/DBClient'; -import getAllBeerComments from '@/services/BeerComment/getAllBeerComments'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; - import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const beerPostId = req.query.id; - - const newBeerComment = await createNewBeerComment({ - content, - rating, - beerPostId, - userId: req.user!.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBeerComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const beerPostId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBeerComments({ - beerPostId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.beerComment.count({ where: { beerPostId } }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { + createBeerPostComment, + getAllBeerPostComments, +} from '@/controllers/comments/beerComments'; const router = createRouter< - // I don't want to use any, but I can't figure out how to get the types to work + // @TODO: Fix this any type any, NextApiResponse> >(); @@ -83,7 +24,7 @@ router.post( querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - createComment, + createBeerPostComment, ); router.get( @@ -94,7 +35,7 @@ router.get( page_num: z.coerce.number().int().positive(), }), }), - getAll, + getAllBeerPostComments, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/styles/[id]/comments/index.ts b/src/pages/api/beers/styles/[id]/comments/index.ts index 4e44ac2..2a88610 100644 --- a/src/pages/api/beers/styles/[id]/comments/index.ts +++ b/src/pages/api/beers/styles/[id]/comments/index.ts @@ -1,77 +1,13 @@ -import DBClient from '@/prisma/DBClient'; - import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import createNewBeerStyleComment from '@/services/BeerStyleComment/createNewBeerStyleComment'; -import getAllBeerStyleComments from '@/services/BeerStyleComment/getAllBeerStyleComments'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const newBeerStyleComment: z.infer = - await createNewBeerStyleComment({ - content, - rating, - beerStyleId: req.query.id, - userId: req.user!.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBeerStyleComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const beerStyleId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBeerStyleComments({ - beerStyleId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.beerStyleComment.count({ - where: { beerStyleId }, - }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { createComment, getAll } from '@/controllers/comments/beerStyleComments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/breweries/[id]/comments/index.ts b/src/pages/api/breweries/[id]/comments/index.ts index 00f4e12..a2ae7b9 100644 --- a/src/pages/api/breweries/[id]/comments/index.ts +++ b/src/pages/api/breweries/[id]/comments/index.ts @@ -1,11 +1,5 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import DBClient from '@/prisma/DBClient'; - -import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; - import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; @@ -13,73 +7,8 @@ import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import getAllBreweryComments from '@/services/BreweryComment/getAllBreweryComments'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import createNewBreweryComment from '@/services/BreweryComment/createNewBreweryComment'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const breweryPostId = req.query.id; - - const user = req.user!; - - const newBreweryComment: z.infer = - await createNewBreweryComment({ - content, - rating, - breweryPostId, - userId: user.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBreweryComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const breweryPostId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBreweryComments({ - id: breweryPostId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.breweryComment.count({ - where: { breweryPostId }, - }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { createComment, getAll } from '@/controllers/comments/breweryComments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/brewery-comments/[id].ts b/src/pages/api/brewery-comments/[id].ts index a452e6f..ae26802 100644 --- a/src/pages/api/brewery-comments/[id].ts +++ b/src/pages/api/brewery-comments/[id].ts @@ -1,12 +1,13 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import { checkIfBeerCommentOwner } from '@/controllers/beerComments'; + import { + checkIfBreweryCommentOwner, deleteBreweryPostComment, editBreweryPostComment, -} from '@/controllers/breweryComments'; -import { CommentRequest } from '@/controllers/requestTypes'; +} from '@/controllers/comments/breweryComments'; +import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; @@ -26,7 +27,7 @@ router querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - checkIfBeerCommentOwner, + checkIfBreweryCommentOwner, deleteBreweryPostComment, ) .put( @@ -35,7 +36,7 @@ router bodySchema: CreateCommentValidationSchema, }), getCurrentUser, - checkIfBeerCommentOwner, + checkIfBreweryCommentOwner, editBreweryPostComment, );