From 7126c74d5d4ee4db871b8ca82f2297f4e75e00ce Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Mon, 27 Feb 2023 18:13:38 -0500 Subject: [PATCH] Add edit beer post, 500 page, and redirectIfLoggedIn getServerSideProps. Implement edit beer post functionality. Register, edit and create beer post forms are now using the same layout found in components/ui/forms/BeerPostFormPageLayout. All forms are now extracted into their own components and are now found in components. Added redirectIfLoggedIn getServerSidesProp fn for login and register pages. --- .../{BeerForm.tsx => CreateBeerPostForm.tsx} | 124 +++++------- components/EditBeerPostForm.tsx | 141 ++++++++++++++ components/RegisterUserForm.tsx | 171 +++++++++++++++++ .../ui/forms/BeerPostFormPageLayout.tsx | 28 +++ components/ui/forms/Button.tsx | 2 +- getServerSideProps/redirectIfLoggedIn.ts | 18 ++ .../withPageAuthRequired.ts | 2 +- pages/500.tsx | 20 ++ pages/api/beers/[id]/index.ts | 55 ++++++ pages/beers/[id]/edit.tsx | 39 ++-- pages/beers/create.tsx | 19 +- pages/breweries/[id].tsx | 5 +- pages/login/index.tsx | 20 +- pages/register/index.tsx | 176 ++---------------- pages/user/current.tsx | 2 +- requests/sendEditBeerPostRequest.ts | 26 +++ services/BeerPost/editBeerPostById.ts | 14 ++ .../schema/EditBeerPostValidationSchema.ts | 9 + 18 files changed, 588 insertions(+), 283 deletions(-) rename components/{BeerForm.tsx => CreateBeerPostForm.tsx} (73%) create mode 100644 components/EditBeerPostForm.tsx create mode 100644 components/RegisterUserForm.tsx create mode 100644 components/ui/forms/BeerPostFormPageLayout.tsx create mode 100644 getServerSideProps/redirectIfLoggedIn.ts rename {config/auth => getServerSideProps}/withPageAuthRequired.ts (94%) create mode 100644 pages/500.tsx create mode 100644 pages/api/beers/[id]/index.ts create mode 100644 requests/sendEditBeerPostRequest.ts create mode 100644 services/BeerPost/editBeerPostById.ts create mode 100644 services/BeerPost/schema/EditBeerPostValidationSchema.ts diff --git a/components/BeerForm.tsx b/components/CreateBeerPostForm.tsx similarity index 73% rename from components/BeerForm.tsx rename to components/CreateBeerPostForm.tsx index 95beaa6..5ca2b01 100644 --- a/components/BeerForm.tsx +++ b/components/CreateBeerPostForm.tsx @@ -17,19 +17,14 @@ import FormSelect from './ui/forms/FormSelect'; import FormTextArea from './ui/forms/FormTextArea'; import FormTextInput from './ui/forms/FormTextInput'; -type BeerPostT = z.infer; +type CreateBeerPostSchema = z.infer; interface BeerFormProps { - formType: 'edit' | 'create'; - // eslint-disable-next-line react/require-default-props - defaultValues?: BeerPostT; - breweries?: BreweryPostQueryResult[]; - types?: BeerType[]; + breweries: BreweryPostQueryResult[]; + types: BeerType[]; } -const BeerForm: FunctionComponent = ({ - formType, - defaultValues, +const CreateBeerPostForm: FunctionComponent = ({ breweries = [], types = [], }) => { @@ -37,47 +32,30 @@ const BeerForm: FunctionComponent = ({ register, handleSubmit, formState: { errors }, - } = useForm({ + } = useForm({ resolver: zodResolver(CreateBeerPostValidationSchema), - defaultValues: { - name: defaultValues?.name, - description: defaultValues?.description, - abv: defaultValues?.abv, - ibu: defaultValues?.ibu, - }, }); const [error, setError] = useState(''); - const [isSubmitting, setIsSubmitting] = useState(false); - const onSubmit: SubmitHandler = async (data) => { - setIsSubmitting(true); - switch (formType) { - case 'create': { - try { - const response = await sendCreateBeerPostRequest(data); - router.push(`/beers/${response.id}`); - break; - } catch (e) { - if (e instanceof Error) { - setError(e.message); - } - break; - } + const onSubmit: SubmitHandler = async (data) => { + try { + setIsSubmitting(true); + const response = await sendCreateBeerPostRequest(data); + router.push(`/beers/${response.id}`); + } catch (e) { + if (!(e instanceof Error)) { + setError('Something went wrong'); + return; } - case 'edit': - break; - default: - break; + setError(e.message); } }; return (
-
- {error && } -
+
{error && }
Name {errors.name?.message} @@ -92,8 +70,9 @@ const BeerForm: FunctionComponent = ({ disabled={isSubmitting} /> - {formType === 'create' && breweries.length && ( - <> + +
+
Brewery {errors.breweryId?.message} @@ -112,10 +91,30 @@ const BeerForm: FunctionComponent = ({ message="Pick a brewery" /> - - )} +
+
+ + Type + {errors.typeId?.message} + + + ({ + value: beerType.id, + text: beerType.name, + }))} + placeholder="Beer type" + message="Pick a beer type" + /> + +
+
-
+
ABV @@ -161,44 +160,13 @@ const BeerForm: FunctionComponent = ({ /> - {formType === 'create' && types.length && ( - <> - - Type - {errors.typeId?.message} - - - ({ - value: beerType.id, - text: beerType.name, - }))} - placeholder="Beer type" - message="Pick a beer type" - /> - - - )} - - {!isSubmitting && ( - - )} - - {isSubmitting && ( +
- )} +
); }; -export default BeerForm; +export default CreateBeerPostForm; diff --git a/components/EditBeerPostForm.tsx b/components/EditBeerPostForm.tsx new file mode 100644 index 0000000..ee8185a --- /dev/null +++ b/components/EditBeerPostForm.tsx @@ -0,0 +1,141 @@ +import sendEditBeerPostRequest from '@/requests/sendEditBeerPostRequest'; +import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { FC, useState } from 'react'; +import { useForm, SubmitHandler } from 'react-hook-form'; +import { z } from 'zod'; +import ErrorAlert from './ui/alerts/ErrorAlert'; +import Button from './ui/forms/Button'; +import FormError from './ui/forms/FormError'; +import FormInfo from './ui/forms/FormInfo'; +import FormLabel from './ui/forms/FormLabel'; +import FormSegment from './ui/forms/FormSegment'; +import FormTextArea from './ui/forms/FormTextArea'; +import FormTextInput from './ui/forms/FormTextInput'; + +type EditBeerPostSchema = z.infer; + +interface EditBeerPostFormProps { + previousValues: EditBeerPostSchema; +} + +const EditBeerPostForm: FC = ({ previousValues }) => { + const router = useRouter(); + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(EditBeerPostValidationSchema), + defaultValues: previousValues, + }); + + const [error, setError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + + const onSubmit: SubmitHandler = async (data) => { + try { + setIsSubmitting(true); + await sendEditBeerPostRequest(data); + router.push(`/beers/${data.id}`); + } catch (e) { + setIsSubmitting(false); + if (!(e instanceof Error)) { + setError('Something went wrong'); + return; + } + setError(e.message); + } + }; + + return ( +
+
+ {error && } +
+ + Name + {errors.name?.message} + + + + + +
+
+ + ABV + {errors.abv?.message} + + +
+
+ + IBU + {errors.ibu?.message} + + +
+
+ + + Description + {errors.description?.message} + + + + + +
+
+ + Discard Changes + +
+ +
+ +
+
+
+ ); +}; + +export default EditBeerPostForm; diff --git a/components/RegisterUserForm.tsx b/components/RegisterUserForm.tsx new file mode 100644 index 0000000..140ad78 --- /dev/null +++ b/components/RegisterUserForm.tsx @@ -0,0 +1,171 @@ +import sendRegisterUserRequest from '@/requests/sendRegisterUserRequest'; +import CreateUserValidationSchema from '@/services/User/schema/CreateUserValidationSchema'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useRouter } from 'next/router'; +import { FC, useState } from 'react'; + +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; +import ErrorAlert from './ui/alerts/ErrorAlert'; +import Button from './ui/forms/Button'; +import FormError from './ui/forms/FormError'; +import FormInfo from './ui/forms/FormInfo'; +import FormLabel from './ui/forms/FormLabel'; +import FormSegment from './ui/forms/FormSegment'; +import FormTextInput from './ui/forms/FormTextInput'; + +const RegisterUserForm: FC = () => { + const router = useRouter(); + const { reset, register, handleSubmit, formState } = useForm< + z.infer + >({ resolver: zodResolver(CreateUserValidationSchema) }); + + const { errors } = formState; + const [serverResponseError, setServerResponseError] = useState(''); + + const onSubmit = async (data: z.infer) => { + try { + await sendRegisterUserRequest(data); + reset(); + router.push('/', undefined, { shallow: true }); + } catch (error) { + setServerResponseError( + error instanceof Error + ? error.message + : 'Something went wrong. We could not register your account.', + ); + } + }; + return ( +
+
+ {serverResponseError && ( + + )} +
+
+
+
+ + First name + {errors.firstName?.message} + + + + +
+ +
+ + Last name + {errors.lastName?.message} + + + + +
+
+ +
+
+ + email + {errors.email?.message} + + + + +
+
+ + username + {errors.username?.message} + + + + +
+
+ +
+
+ + password + {errors.password?.message} + + + + +
+
+ + confirm password + {errors.confirmPassword?.message} + + + + +
+
+ + Date of birth + {errors.dateOfBirth?.message} + + + + +
+ +
+
+
+ ); +}; + +export default RegisterUserForm; diff --git a/components/ui/forms/BeerPostFormPageLayout.tsx b/components/ui/forms/BeerPostFormPageLayout.tsx new file mode 100644 index 0000000..7a4a955 --- /dev/null +++ b/components/ui/forms/BeerPostFormPageLayout.tsx @@ -0,0 +1,28 @@ +import { ReactNode, FC } from 'react'; +import { IconType } from 'react-icons'; + +interface FormPageLayoutProps { + children: ReactNode; + headingText: string; + headingIcon: IconType; +} + +const FormPageLayout: FC = ({ + children: FormComponent, + headingIcon, + headingText, +}) => { + return ( +
+
+
+ {headingIcon({ className: 'text-4xl' })} +

{headingText}

+
+
{FormComponent}
+
+
+ ); +}; + +export default FormPageLayout; diff --git a/components/ui/forms/Button.tsx b/components/ui/forms/Button.tsx index 7f3dd8d..8072faa 100644 --- a/components/ui/forms/Button.tsx +++ b/components/ui/forms/Button.tsx @@ -14,7 +14,7 @@ const Button: FunctionComponent = ({ // eslint-disable-next-line react/button-has-type diff --git a/getServerSideProps/redirectIfLoggedIn.ts b/getServerSideProps/redirectIfLoggedIn.ts new file mode 100644 index 0000000..61bdfca --- /dev/null +++ b/getServerSideProps/redirectIfLoggedIn.ts @@ -0,0 +1,18 @@ +import { GetServerSideProps, GetServerSidePropsContext, Redirect } from 'next'; +import { getLoginSession } from '@/config/auth/session'; + +const redirectIfLoggedIn = (redirect: Redirect) => { + const fn: GetServerSideProps = async (context: GetServerSidePropsContext) => { + try { + const { req } = context; + await getLoginSession(req); + return { redirect }; + } catch { + return { props: {} }; + } + }; + + return fn; +}; + +export default redirectIfLoggedIn; diff --git a/config/auth/withPageAuthRequired.ts b/getServerSideProps/withPageAuthRequired.ts similarity index 94% rename from config/auth/withPageAuthRequired.ts rename to getServerSideProps/withPageAuthRequired.ts index 2791e56..fa90173 100644 --- a/config/auth/withPageAuthRequired.ts +++ b/getServerSideProps/withPageAuthRequired.ts @@ -1,6 +1,6 @@ import { GetServerSidePropsContext, GetServerSidePropsResult, PreviewData } from 'next'; import { ParsedUrlQuery } from 'querystring'; -import { getLoginSession } from './session'; +import { getLoginSession } from '../config/auth/session'; export type ExtendedGetServerSideProps< P extends { [key: string]: any } = { [key: string]: any }, diff --git a/pages/500.tsx b/pages/500.tsx new file mode 100644 index 0000000..53fcf9e --- /dev/null +++ b/pages/500.tsx @@ -0,0 +1,20 @@ +import Layout from '@/components/ui/Layout'; +import { NextPage } from 'next'; +import Head from 'next/head'; + +const ServerErrorPage: NextPage = () => { + return ( + + + 500 Internal Server Error + + +
+

Error: 500

+

Internal Server Error

+
+
+ ); +}; + +export default ServerErrorPage; diff --git a/pages/api/beers/[id]/index.ts b/pages/api/beers/[id]/index.ts new file mode 100644 index 0000000..407eab6 --- /dev/null +++ b/pages/api/beers/[id]/index.ts @@ -0,0 +1,55 @@ +import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; +import getBeerPostById from '@/services/BeerPost/getBeerPostById'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; +import editBeerPostById from '@/services/BeerPost/editBeerPostById'; +import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { createRouter } from 'next-connect'; +import { z } from 'zod'; +import ServerError from '@/config/util/ServerError'; + +interface EditBeerPostRequest extends UserExtendedNextApiRequest { + query: { id: string }; + body: z.infer; +} + +const editBeerPost = async ( + req: EditBeerPostRequest, + res: NextApiResponse>, +) => { + const { body, user, query } = req; + const { id } = query; + + const beerPost = await getBeerPostById(id); + + if (!beerPost) { + throw new ServerError('Beer post not found', 404); + } + + if (beerPost.postedBy.id !== user!.id) { + throw new ServerError('You cannot edit that beer post.', 403); + } + + const updated = await editBeerPostById(id, body); + + console.log(updated); + + res.status(200).json({ + message: 'Beer post updated successfully', + success: true, + statusCode: 200, + }); +}; + +const router = createRouter< + EditBeerPostRequest, + NextApiResponse> +>(); + +router.put(getCurrentUser, editBeerPost); + +const handler = router.handler(NextConnectOptions); + +export default handler; diff --git a/pages/beers/[id]/edit.tsx b/pages/beers/[id]/edit.tsx index f273774..6341b88 100644 --- a/pages/beers/[id]/edit.tsx +++ b/pages/beers/[id]/edit.tsx @@ -1,23 +1,40 @@ +import { NextPage } from 'next'; import Head from 'next/head'; import React from 'react'; import Layout from '@/components/ui/Layout'; -import { NextPage } from 'next'; -import withPageAuthRequired from '@/config/auth/withPageAuthRequired'; +import withPageAuthRequired from '@/getServerSideProps/withPageAuthRequired'; import getBeerPostById from '@/services/BeerPost/getBeerPostById'; import { BeerPostQueryResult } from '@/services/BeerPost/schema/BeerPostQueryResult'; +import EditBeerPostForm from '@/components/EditBeerPostForm'; +import FormPageLayout from '@/components/ui/forms/BeerPostFormPageLayout'; +import { BiBeer } from 'react-icons/bi'; interface EditPageProps { beerPost: BeerPostQueryResult; } const EditPage: NextPage = ({ beerPost }) => { + const pageTitle = `Edit "${beerPost.name}"`; + return ( - Edit {beerPost.name} - + {pageTitle} + + + + + ); }; @@ -36,16 +53,8 @@ export const getServerSideProps = withPageAuthRequired( const isBeerPostOwner = beerPost.postedBy.id === userId; - if (!isBeerPostOwner) { - return { - redirect: { destination: `/beers/${beerPostId}`, permanent: false }, - }; - } - - return { - props: { - beerPost: JSON.parse(JSON.stringify(beerPost)), - }, - }; + return isBeerPostOwner + ? { props: { beerPost: JSON.parse(JSON.stringify(beerPost)) } } + : { redirect: { destination: `/beers/${beerPostId}`, permanent: false } }; }, ); diff --git a/pages/beers/create.tsx b/pages/beers/create.tsx index 8879a78..734a5de 100644 --- a/pages/beers/create.tsx +++ b/pages/beers/create.tsx @@ -1,13 +1,12 @@ -import BeerForm from '@/components/BeerForm'; +import CreateBeerPostForm from '@/components/CreateBeerPostForm'; +import FormPageLayout from '@/components/ui/forms/BeerPostFormPageLayout'; import Layout from '@/components/ui/Layout'; -import withPageAuthRequired from '@/config/auth/withPageAuthRequired'; - +import withPageAuthRequired from '@/getServerSideProps/withPageAuthRequired'; import DBClient from '@/prisma/DBClient'; import getAllBreweryPosts from '@/services/BreweryPost/getAllBreweryPosts'; import BreweryPostQueryResult from '@/services/BreweryPost/types/BreweryPostQueryResult'; import { BeerType } from '@prisma/client'; import { NextPage } from 'next'; - import { BiBeer } from 'react-icons/bi'; interface CreateBeerPageProps { @@ -18,15 +17,9 @@ interface CreateBeerPageProps { const Create: NextPage = ({ breweries, types }) => { return ( -
-
-
- -

Create a New Beer

-
- -
-
+ + +
); }; diff --git a/pages/breweries/[id].tsx b/pages/breweries/[id].tsx index 13d42bc..db0d094 100644 --- a/pages/breweries/[id].tsx +++ b/pages/breweries/[id].tsx @@ -1,3 +1,4 @@ +import Layout from '@/components/ui/Layout'; import { BeerPostQueryResult } from '@/services/BeerPost/schema/BeerPostQueryResult'; import getBreweryPostById from '@/services/BreweryPost/getBreweryPostById'; import { GetServerSideProps, NextPage } from 'next'; @@ -8,9 +9,9 @@ interface BreweryPageProps { const BreweryByIdPage: NextPage = ({ breweryPost }) => { return ( - <> +

{breweryPost.name}

- +
); }; diff --git a/pages/login/index.tsx b/pages/login/index.tsx index dcff7fa..0eb5836 100644 --- a/pages/login/index.tsx +++ b/pages/login/index.tsx @@ -1,27 +1,14 @@ import { NextPage } from 'next'; -import { useEffect } from 'react'; -import { useRouter } from 'next/router'; import Layout from '@/components/ui/Layout'; -import useUser from '@/hooks/useUser'; import LoginForm from '@/components/Login/LoginForm'; import Image from 'next/image'; import { FaUserCircle } from 'react-icons/fa'; import Head from 'next/head'; import Link from 'next/link'; +import redirectIfLoggedIn from '@/getServerSideProps/redirectIfLoggedIn'; const LoginPage: NextPage = () => { - const { user } = useUser(); - const router = useRouter(); - - useEffect(() => { - if (!user) { - return; - } - - router.push(`/user/current`); - }, [user, router]); - return ( @@ -65,3 +52,8 @@ const LoginPage: NextPage = () => { }; export default LoginPage; + +export const getServerSideProps = redirectIfLoggedIn({ + destination: '/', + permanent: false, +}); diff --git a/pages/register/index.tsx b/pages/register/index.tsx index 160c589..b6e937a 100644 --- a/pages/register/index.tsx +++ b/pages/register/index.tsx @@ -1,168 +1,28 @@ -import ErrorAlert from '@/components/ui/alerts/ErrorAlert'; -import Button from '@/components/ui/forms/Button'; -import FormError from '@/components/ui/forms/FormError'; -import FormInfo from '@/components/ui/forms/FormInfo'; -import FormLabel from '@/components/ui/forms/FormLabel'; -import FormSegment from '@/components/ui/forms/FormSegment'; -import FormTextInput from '@/components/ui/forms/FormTextInput'; +import RegisterUserForm from '@/components/RegisterUserForm'; +import FormPageLayout from '@/components/ui/forms/BeerPostFormPageLayout'; import Layout from '@/components/ui/Layout'; -import sendRegisterUserRequest from '@/requests/sendRegisterUserRequest'; -import CreateUserValidationSchema from '@/services/User/schema/CreateUserValidationSchema'; -import { zodResolver } from '@hookform/resolvers/zod'; +import redirectIfLoggedIn from '@/getServerSideProps/redirectIfLoggedIn'; import { NextPage } from 'next'; -import { useRouter } from 'next/router'; -import { useState } from 'react'; -import { useForm } from 'react-hook-form'; -import { FaUserCircle } from 'react-icons/fa'; -import { z } from 'zod'; - -interface RegisterUserProps {} - -const RegisterUserPage: NextPage = () => { - const router = useRouter(); - const { reset, register, handleSubmit, formState } = useForm< - z.infer - >({ - resolver: zodResolver(CreateUserValidationSchema), - }); - - const { errors } = formState; - - const [serverResponseError, setServerResponseError] = useState(''); - - const onSubmit = async (data: z.infer) => { - try { - await sendRegisterUserRequest(data); - reset(); - router.push('/', undefined, { shallow: true }); - } catch (error) { - setServerResponseError( - error instanceof Error - ? error.message - : 'Something went wrong. We could not register your account.', - ); - } - }; +import Head from 'next/head'; +import { BiUser } from 'react-icons/bi'; +const RegisterUserPage: NextPage = () => { return ( -
-
- -

Register

-
-
- {serverResponseError && ( - - )} -
-
-
- - First name - {errors.firstName?.message} - - - - -
- -
- - Last name - {errors.lastName?.message} - - - - -
-
- - username - {errors.username?.message} - - - - - - email - {errors.email?.message} - - - - - - password - {errors.password?.message} - - - - - - confirm password - {errors.confirmPassword?.message} - - - - - - Date of birth - {errors.dateOfBirth?.message} - - - - - -
- -
+ + Register User + + + + +
); }; export default RegisterUserPage; + +export const getServerSideProps = redirectIfLoggedIn({ + destination: '/', + permanent: false, +}); diff --git a/pages/user/current.tsx b/pages/user/current.tsx index 0e6159e..90b31f5 100644 --- a/pages/user/current.tsx +++ b/pages/user/current.tsx @@ -1,6 +1,6 @@ import Layout from '@/components/ui/Layout'; import Spinner from '@/components/ui/Spinner'; -import withPageAuthRequired from '@/config/auth/withPageAuthRequired'; +import withPageAuthRequired from '@/getServerSideProps/withPageAuthRequired'; import UserContext from '@/contexts/userContext'; import { GetServerSideProps, NextPage } from 'next'; diff --git a/requests/sendEditBeerPostRequest.ts b/requests/sendEditBeerPostRequest.ts new file mode 100644 index 0000000..276e324 --- /dev/null +++ b/requests/sendEditBeerPostRequest.ts @@ -0,0 +1,26 @@ +import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { z } from 'zod'; + +async function sendEditBeerPostRequest( + data: z.infer, +) { + const response = await fetch(`/api/beers/${data.id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }); + + if (!response.ok) { + throw new Error('something went wrong'); + } + + const json = await response.json(); + const parsed = APIResponseValidationSchema.safeParse(json); + + if (!parsed.success) { + throw new Error(parsed.error.message); + } +} + +export default sendEditBeerPostRequest; diff --git a/services/BeerPost/editBeerPostById.ts b/services/BeerPost/editBeerPostById.ts new file mode 100644 index 0000000..58971d9 --- /dev/null +++ b/services/BeerPost/editBeerPostById.ts @@ -0,0 +1,14 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import EditBeerPostValidationSchema from './schema/EditBeerPostValidationSchema'; + +const schema = EditBeerPostValidationSchema.omit({ id: true }); + +export default async function editBeerPostById(id: string, data: z.infer) { + const beerPost = await DBClient.instance.beerPost.update({ + where: { id }, + data, + }); + + return beerPost; +} diff --git a/services/BeerPost/schema/EditBeerPostValidationSchema.ts b/services/BeerPost/schema/EditBeerPostValidationSchema.ts new file mode 100644 index 0000000..ab11b77 --- /dev/null +++ b/services/BeerPost/schema/EditBeerPostValidationSchema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import CreateBeerPostValidationSchema from './CreateBeerPostValidationSchema'; + +const EditBeerPostValidationSchema = CreateBeerPostValidationSchema.omit({ + breweryId: true, + typeId: true, +}).extend({ id: z.string().uuid() }); + +export default EditBeerPostValidationSchema;