From 2eb2626d54f0bd298d01d8592c411d81a27a9fe4 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Thu, 11 May 2023 22:20:51 -0400 Subject: [PATCH] Updates to user schema, account page Renamed isAccountVerified to accountIsVerified, add account info to account page --- src/pages/account/index.tsx | 159 ++++++++++++++++-- src/pages/api/users/confirm.ts | 2 +- .../migrations/20230510010306_/migration.sql | 9 + src/prisma/schema.prisma | 2 +- src/services/User/createNewUser.ts | 2 +- src/services/User/findUserById.ts | 2 +- src/services/User/schema/GetUserSchema.ts | 2 +- .../User/updateUserToBeConfirmedById.ts | 4 +- 8 files changed, 160 insertions(+), 22 deletions(-) create mode 100644 src/prisma/migrations/20230510010306_/migration.sql diff --git a/src/pages/account/index.tsx b/src/pages/account/index.tsx index 4ee92a8..0a925da 100644 --- a/src/pages/account/index.tsx +++ b/src/pages/account/index.tsx @@ -1,16 +1,121 @@ -import UserContext from '@/contexts/userContext'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import { NextPage } from 'next'; -import { useContext } from 'react'; -import { Tab } from '@headlessui/react'; +import { FC, useState } from 'react'; +import { Switch, Tab } from '@headlessui/react'; import Head from 'next/head'; +import FormInfo from '@/components/ui/forms/FormInfo'; +import FormLabel from '@/components/ui/forms/FormLabel'; +import FormError from '@/components/ui/forms/FormError'; +import FormTextInput from '@/components/ui/forms/FormTextInput'; +import { zodResolver } from '@hookform/resolvers/zod'; +import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; +import DBClient from '@/prisma/DBClient'; -interface AccountPageProps {} +interface AccountPageProps { + user: z.infer; +} -const AccountPage: NextPage = () => { - const { user } = useContext(UserContext); +const AccountInfo: FC<{ + user: z.infer; +}> = ({ user }) => { + const { register, handleSubmit, formState, reset } = useForm< + z.infer + >({ + resolver: zodResolver(GetUserSchema), + defaultValues: { + username: 'test', + email: 'test@example.com', + firstName: 'test', + lastName: 'icle', + dateOfBirth: new Date(), + }, + }); + const [inEditMode, setInEditMode] = useState(false); + + return ( +
+
+
+ + { + setInEditMode((editMode) => !editMode); + reset(); + }} + id="edit-toggle" + /> +
+ +
{})}> +
+ + Username + {formState.errors.username?.message} + + + + Email + {''} + + + +
+
+ + First Name + {formState.errors.firstName?.message} + + +
+
+ + Last Name + {formState.errors.lastName?.message} + + +
+
+
+ {inEditMode && } +
+
+
+ ); +}; + +const AccountPage: NextPage = ({ user }) => { return ( <> @@ -28,7 +133,7 @@ const AccountPage: NextPage = () => {
-

Hello, {user?.username}!

+

Hello, {user.username}!

Welcome to your account page.

@@ -36,19 +141,17 @@ const AccountPage: NextPage = () => {
- - Settings - - + Account Info - + Your Posts - Content 1 - Content 2 + + + Content 3 @@ -61,4 +164,30 @@ const AccountPage: NextPage = () => { export default AccountPage; -export const getServerSideProps = withPageAuthRequired(); +export const getServerSideProps = withPageAuthRequired(async (context, session) => { + const { id } = session; + + const user: z.infer | null = + await DBClient.instance.user.findUnique({ + where: { id }, + select: { + username: true, + email: true, + accountIsVerified: true, + firstName: true, + lastName: true, + dateOfBirth: true, + id: true, + createdAt: true, + }, + }); + + if (!user) { + return { redirect: { destination: '/login', permanent: false } }; + } + return { + props: { + user: JSON.parse(JSON.stringify(user)), + }, + }; +}); diff --git a/src/pages/api/users/confirm.ts b/src/pages/api/users/confirm.ts index bdcd0c6..af3f7fa 100644 --- a/src/pages/api/users/confirm.ts +++ b/src/pages/api/users/confirm.ts @@ -27,7 +27,7 @@ const confirmUser = async (req: ConfirmUserRequest, res: NextApiResponse) => { throw new ServerError('Could not confirm user.', 401); } - if (user.isAccountVerified) { + if (user.accountIsVerified) { throw new ServerError('User is already verified.', 400); } diff --git a/src/prisma/migrations/20230510010306_/migration.sql b/src/prisma/migrations/20230510010306_/migration.sql new file mode 100644 index 0000000..2a591a2 --- /dev/null +++ b/src/prisma/migrations/20230510010306_/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `isAccountVerified` on the `User` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "User" DROP COLUMN "isAccountVerified", +ADD COLUMN "accountIsVerified" BOOLEAN NOT NULL DEFAULT false; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 6a84268..d9e0c98 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -21,7 +21,7 @@ model User { email String @unique createdAt DateTime @default(now()) @db.Timestamptz(3) updatedAt DateTime? @updatedAt @db.Timestamptz(3) - isAccountVerified Boolean @default(false) + accountIsVerified Boolean @default(false) dateOfBirth DateTime beerPosts BeerPost[] beerTypes BeerType[] diff --git a/src/services/User/createNewUser.ts b/src/services/User/createNewUser.ts index 6af41b4..c77c82f 100644 --- a/src/services/User/createNewUser.ts +++ b/src/services/User/createNewUser.ts @@ -30,7 +30,7 @@ const createNewUser = async ({ lastName: true, dateOfBirth: true, createdAt: true, - isAccountVerified: true, + accountIsVerified: true, }, }); diff --git a/src/services/User/findUserById.ts b/src/services/User/findUserById.ts index 0396f6a..211317f 100644 --- a/src/services/User/findUserById.ts +++ b/src/services/User/findUserById.ts @@ -14,7 +14,7 @@ const findUserById = async (id: string) => { lastName: true, dateOfBirth: true, createdAt: true, - isAccountVerified: true, + accountIsVerified: true, }, }); diff --git a/src/services/User/schema/GetUserSchema.ts b/src/services/User/schema/GetUserSchema.ts index 68b86a4..5e1df4e 100644 --- a/src/services/User/schema/GetUserSchema.ts +++ b/src/services/User/schema/GetUserSchema.ts @@ -9,7 +9,7 @@ const GetUserSchema = z.object({ firstName: z.string(), lastName: z.string(), dateOfBirth: z.coerce.date(), - isAccountVerified: z.boolean(), + accountIsVerified: z.boolean(), }); export default GetUserSchema; diff --git a/src/services/User/updateUserToBeConfirmedById.ts b/src/services/User/updateUserToBeConfirmedById.ts index 6aa0fcd..34478f7 100644 --- a/src/services/User/updateUserToBeConfirmedById.ts +++ b/src/services/User/updateUserToBeConfirmedById.ts @@ -5,12 +5,12 @@ import { z } from 'zod'; const updateUserToBeConfirmedById = async (id: string) => { const user: z.infer = await DBClient.instance.user.update({ where: { id }, - data: { isAccountVerified: true, updatedAt: new Date() }, + data: { accountIsVerified: true, updatedAt: new Date() }, select: { id: true, username: true, email: true, - isAccountVerified: true, + accountIsVerified: true, createdAt: true, firstName: true, lastName: true,