From 7f9ddb40a1b920d2b1ec769e686ccab746246f34 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 5 Nov 2023 21:54:09 -0500 Subject: [PATCH] Feat: create user page, add user bio and avatar --- .../CommentContentBody.tsx | 91 ++++++++++++------- src/pages/api/beers/index.ts | 1 + src/pages/api/breweries/create.ts | 2 +- src/pages/users/[id].tsx | 68 ++++++++++---- .../migrations/20231106024511_/migration.sql | 57 ++++++++++++ src/prisma/schema.prisma | 43 ++++++--- src/prisma/seed/create/createAdminUser.ts | 11 +++ .../seed/create/createNewBreweryPosts.ts | 4 +- src/prisma/seed/create/createNewLocations.ts | 4 +- .../seed/create/createNewUserAvatars.ts | 38 ++++++++ src/prisma/seed/create/createNewUsers.ts | 4 +- src/prisma/seed/index.ts | 5 + .../BeerComment/createNewBeerComment.ts | 2 +- .../BeerComment/editBeerCommentById.ts | 4 +- .../BeerComment/findBeerCommentById.ts | 4 +- .../BeerComment/getAllBeerComments.ts | 4 +- .../createNewBeerStyleComment.ts | 4 +- .../getAllBeerStyleComments.ts | 4 +- .../BreweryComment/createNewBreweryComment.ts | 4 +- .../BreweryComment/getAllBreweryComments.ts | 4 +- src/services/User/createNewUser.ts | 2 + src/services/User/deleteUserById.ts | 2 + src/services/User/findUserById.ts | 11 +++ src/services/User/schema/GetUserSchema.ts | 11 +++ .../User/updateUserToBeConfirmedById.ts | 11 +++ .../CommentSchema/CommentQueryResult.ts | 8 ++ 26 files changed, 324 insertions(+), 79 deletions(-) create mode 100644 src/prisma/migrations/20231106024511_/migration.sql create mode 100644 src/prisma/seed/create/createNewUserAvatars.ts diff --git a/src/components/BeerBreweryComments/CommentContentBody.tsx b/src/components/BeerBreweryComments/CommentContentBody.tsx index 0864c39..747c43a 100644 --- a/src/components/BeerBreweryComments/CommentContentBody.tsx +++ b/src/components/BeerBreweryComments/CommentContentBody.tsx @@ -5,7 +5,7 @@ import { Dispatch, FC, SetStateAction, useContext } from 'react'; import { Rating } from 'react-daisyui'; import Link from 'next/link'; import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; - +import Image from 'next/image'; import { z } from 'zod'; import CommentCardDropdown from './CommentCardDropdown'; @@ -20,41 +20,64 @@ const CommentContentBody: FC = ({ comment, setInEditMod return (
-
-
-

- - {comment.postedBy.username} - -

- - posted{' '} - {' '} - ago - +
+
+
+ {comment.postedBy.userAvatar ? ( + {comment.postedBy.userAvatar.alt} + ) : ( +
+ {comment.postedBy.username[0]} +
+ )} +
+
+
+
+

+ + {comment.postedBy.username} + +

+ + posted{' '} + {' '} + ago + +
- {user && } -
- -
- - {Array.from({ length: 5 }).map((val, index) => ( - - ))} - -

{comment.content}

+ {user && ( + + )} +
+
+ + {Array.from({ length: 5 }).map((val, index) => ( + + ))} + +
+
+

{comment.content}

+
+
); diff --git a/src/pages/api/beers/index.ts b/src/pages/api/beers/index.ts index 8e6f919..6a5aa0a 100644 --- a/src/pages/api/beers/index.ts +++ b/src/pages/api/beers/index.ts @@ -20,6 +20,7 @@ const getBeerPosts = async ( const pageSize = parseInt(req.query.page_size, 10); const beerPosts = await getAllBeerPosts({ pageNum, pageSize }); + const beerPostCount = await DBClient.instance.beerPost.count(); res.setHeader('X-Total-Count', beerPostCount); diff --git a/src/pages/api/breweries/create.ts b/src/pages/api/breweries/create.ts index 07308f1..8cf3e04 100644 --- a/src/pages/api/breweries/create.ts +++ b/src/pages/api/breweries/create.ts @@ -33,7 +33,7 @@ const createBreweryPost = async ( const [latitude, longitude] = geocoded.center; - const location = await DBClient.instance.location.create({ + const location = await DBClient.instance.breweryLocation.create({ data: { address, city, diff --git a/src/pages/users/[id].tsx b/src/pages/users/[id].tsx index c180656..811ec10 100644 --- a/src/pages/users/[id].tsx +++ b/src/pages/users/[id].tsx @@ -1,33 +1,69 @@ +import useMediaQuery from '@/hooks/utilities/useMediaQuery'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; import findUserById from '@/services/User/findUserById'; import GetUserSchema from '@/services/User/schema/GetUserSchema'; import { format } from 'date-fns'; import { GetServerSideProps } from 'next'; +import Head from 'next/head'; import { FC } from 'react'; import { z } from 'zod'; +import Image from 'next/image'; interface UserInfoPageProps { user: z.infer; } -const UserInfoPage: FC = ({ user }) => { +const UserHeader: FC<{ user: z.infer }> = ({ user }) => { const timeDistance = useTimeDistance(new Date(user.createdAt)); + return ( -
-

- {user.firstName} {user.lastName} -

-

- joined{' '} - {' '} - ago -

-
+
+
+
+
+
+

+ {user.firstName} {user.lastName} +

+ +

+ joined{' '} + {timeDistance && ( + + {`${timeDistance} ago`} + + )} +

+
+
+
+
+
+ ); +}; + +const UserInfoPage: FC = ({ user }) => { + const isDesktop = useMediaQuery('(min-width: 1024px)'); + return ( + <> + + {user ? `${user.firstName} ${user.lastName}` : 'User Info'} + + + <> +
+ avatar +
+ + + {isDesktop ? <> : <> } +
+
+ + ); }; diff --git a/src/prisma/migrations/20231106024511_/migration.sql b/src/prisma/migrations/20231106024511_/migration.sql new file mode 100644 index 0000000..5dc7021 --- /dev/null +++ b/src/prisma/migrations/20231106024511_/migration.sql @@ -0,0 +1,57 @@ +/* + Warnings: + + - You are about to drop the `Location` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "BreweryPost" DROP CONSTRAINT "BreweryPost_locationId_fkey"; + +-- DropForeignKey +ALTER TABLE "Location" DROP CONSTRAINT "Location_postedById_fkey"; + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "bio" TEXT; + +-- DropTable +DROP TABLE "Location"; + +-- CreateTable +CREATE TABLE "UserAvatar" ( + "id" TEXT NOT NULL, + "path" TEXT NOT NULL, + "alt" TEXT NOT NULL, + "caption" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMPTZ(3), + + CONSTRAINT "UserAvatar_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BreweryLocation" ( + "id" TEXT NOT NULL, + "city" TEXT NOT NULL, + "stateOrProvince" TEXT, + "country" TEXT, + "coordinates" DOUBLE PRECISION[], + "address" TEXT NOT NULL, + "postedById" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMPTZ(3), + + CONSTRAINT "BreweryLocation_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "UserAvatar_userId_key" ON "UserAvatar"("userId"); + +-- AddForeignKey +ALTER TABLE "UserAvatar" ADD CONSTRAINT "UserAvatar_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BreweryLocation" ADD CONSTRAINT "BreweryLocation_postedById_fkey" FOREIGN KEY ("postedById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BreweryPost" ADD CONSTRAINT "BreweryPost_locationId_fkey" FOREIGN KEY ("locationId") REFERENCES "BreweryLocation"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 781e61b..e485041 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -29,19 +29,32 @@ model User { accountIsVerified Boolean @default(false) dateOfBirth DateTime role Role @default(USER) + bio String? beerPosts BeerPost[] beerStyles BeerStyle[] breweryPosts BreweryPost[] beerComments BeerComment[] breweryComments BreweryComment[] - BeerPostLikes BeerPostLike[] - BeerImage BeerImage[] - BreweryImage BreweryImage[] - BreweryPostLike BreweryPostLike[] - Location Location[] - Glassware Glassware[] - BeerStyleLike BeerStyleLike[] - BeerStyleComment BeerStyleComment[] + beerPostLikes BeerPostLike[] + beerImages BeerImage[] + breweryImages BreweryImage[] + breweryPostLikes BreweryPostLike[] + locations BreweryLocation[] + glasswares Glassware[] + beerStyleLikes BeerStyleLike[] + beerStyleComments BeerStyleComment[] + userAvatar UserAvatar? +} + +model UserAvatar { + id String @id @default(cuid()) + path String + alt String + caption String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String @unique + createdAt DateTime @default(now()) @db.Timestamptz(3) + updatedAt DateTime? @updatedAt @db.Timestamptz(3) } model BeerPost { @@ -60,7 +73,7 @@ model BeerPost { updatedAt DateTime? @updatedAt @db.Timestamptz(3) beerComments BeerComment[] beerImages BeerImage[] - BeerPostLikes BeerPostLike[] + beerPostLikes BeerPostLike[] } model BeerPostLike { @@ -108,8 +121,8 @@ model BeerStyle { abvRange Float[] ibuRange Float[] beerPosts BeerPost[] - BeerStyleLike BeerStyleLike[] - BeerStyleComment BeerStyleComment[] + beerStyleLike BeerStyleLike[] + beerStyleComment BeerStyleComment[] } model BeerStyleLike { @@ -142,10 +155,10 @@ model Glassware { updatedAt DateTime? @updatedAt @db.Timestamptz(3) postedBy User @relation(fields: [postedById], references: [id], onDelete: Cascade) postedById String - BeerStyle BeerStyle[] + beerStyle BeerStyle[] } -model Location { +model BreweryLocation { id String @id @default(cuid()) city String stateOrProvince String? @@ -154,7 +167,7 @@ model Location { address String postedBy User @relation(fields: [postedById], references: [id], onDelete: Cascade) postedById String - BreweryPost BreweryPost? + breweryPost BreweryPost? createdAt DateTime @default(now()) @db.Timestamptz(3) updatedAt DateTime? @updatedAt @db.Timestamptz(3) } @@ -162,7 +175,7 @@ model Location { model BreweryPost { id String @id @default(cuid()) name String - location Location @relation(fields: [locationId], references: [id]) + location BreweryLocation @relation(fields: [locationId], references: [id]) locationId String @unique beers BeerPost[] description String diff --git a/src/prisma/seed/create/createAdminUser.ts b/src/prisma/seed/create/createAdminUser.ts index 7de97ff..eeb3739 100644 --- a/src/prisma/seed/create/createAdminUser.ts +++ b/src/prisma/seed/create/createAdminUser.ts @@ -3,6 +3,7 @@ import { z } from 'zod'; import { hashPassword } from '../../../config/auth/passwordFns'; import DBClient from '../../DBClient'; import GetUserSchema from '../../../services/User/schema/GetUserSchema'; +import imageUrls from '../util/imageUrls'; const createAdminUser = async () => { const hash = await hashPassword('Pas!3word'); @@ -15,6 +16,14 @@ const createAdminUser = async () => { dateOfBirth: new Date('1990-01-01'), role: 'ADMIN', hash, + userAvatar: { + create: { + path: imageUrls[Math.floor(Math.random() * imageUrls.length)], + alt: 'Admin User', + caption: 'Admin User', + createdAt: new Date(), + }, + }, }, select: { id: true, @@ -27,6 +36,8 @@ const createAdminUser = async () => { accountIsVerified: true, updatedAt: true, role: true, + bio: true, + userAvatar: true, }, }); diff --git a/src/prisma/seed/create/createNewBreweryPosts.ts b/src/prisma/seed/create/createNewBreweryPosts.ts index 7e38426..016ae51 100644 --- a/src/prisma/seed/create/createNewBreweryPosts.ts +++ b/src/prisma/seed/create/createNewBreweryPosts.ts @@ -1,13 +1,13 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { faker } from '@faker-js/faker'; -import { Location, User } from '@prisma/client'; +import { BreweryLocation, User } from '@prisma/client'; import DBClient from '../../DBClient'; interface CreateNewBreweryPostsArgs { numberOfPosts: number; joinData: { users: User[]; - locations: Location[]; + locations: BreweryLocation[]; }; } diff --git a/src/prisma/seed/create/createNewLocations.ts b/src/prisma/seed/create/createNewLocations.ts index 1b09815..3341f42 100644 --- a/src/prisma/seed/create/createNewLocations.ts +++ b/src/prisma/seed/create/createNewLocations.ts @@ -47,9 +47,9 @@ const createNewLocations = async ({ }); } - await prisma.location.createMany({ data: locationData, skipDuplicates: true }); + await prisma.breweryLocation.createMany({ data: locationData, skipDuplicates: true }); - return prisma.location.findMany(); + return prisma.breweryLocation.findMany(); }; export default createNewLocations; diff --git a/src/prisma/seed/create/createNewUserAvatars.ts b/src/prisma/seed/create/createNewUserAvatars.ts new file mode 100644 index 0000000..84363e3 --- /dev/null +++ b/src/prisma/seed/create/createNewUserAvatars.ts @@ -0,0 +1,38 @@ +import { User } from '@prisma/client'; +import DBClient from '../../DBClient'; +import imageUrls from '../util/imageUrls'; + +interface CreateNewUserAvatarsArgs { + joinData: { users: User[] }; +} +interface UserAvatarData { + path: string; + alt: string; + caption: string; + userId: string; + createdAt: Date; +} + +const createNewUserAvatars = async ({ + joinData: { users }, +}: CreateNewUserAvatarsArgs) => { + const userAvatars: UserAvatarData[] = []; + + const path = imageUrls[Math.floor(Math.random() * imageUrls.length)]; + users.forEach((user) => { + userAvatars.push({ + path, + alt: `${user.firstName} ${user.lastName}`, + caption: `${user.firstName} ${user.lastName}`, + userId: user.id, + createdAt: new Date(), + }); + }); + + await DBClient.instance.userAvatar.createMany({ data: userAvatars }); + return DBClient.instance.userAvatar.findMany({ + where: { user: { role: { not: 'ADMIN' } } }, + }); +}; + +export default createNewUserAvatars; diff --git a/src/prisma/seed/create/createNewUsers.ts b/src/prisma/seed/create/createNewUsers.ts index c9c81f3..e61fcf6 100644 --- a/src/prisma/seed/create/createNewUsers.ts +++ b/src/prisma/seed/create/createNewUsers.ts @@ -71,7 +71,9 @@ const createNewUsers = async ({ numberOfUsers }: CreateNewUsersArgs) => { } await prisma.user.createMany({ data, skipDuplicates: true }); - return prisma.user.findMany(); + return prisma.user.findMany({ + where: { role: { not: 'ADMIN' } }, + }); }; export default createNewUsers; diff --git a/src/prisma/seed/index.ts b/src/prisma/seed/index.ts index 4377655..4139ba2 100644 --- a/src/prisma/seed/index.ts +++ b/src/prisma/seed/index.ts @@ -18,6 +18,7 @@ import logger from '../../config/pino/logger'; import createAdminUser from './create/createAdminUser'; import createNewBeerStyleComments from './create/createNewBeerStyleComments'; import createNewBeerStyleLikes from './create/createNewBeerStyleLikes'; +import createNewUserAvatars from './create/createNewUserAvatars'; (async () => { try { @@ -33,6 +34,9 @@ import createNewBeerStyleLikes from './create/createNewBeerStyleLikes'; const users = await createNewUsers({ numberOfUsers: 10000 }); logger.info('Users created successfully.'); + const userAvatars = await createNewUserAvatars({ joinData: { users } }); + logger.info('User avatars created successfully.'); + const locations = await createNewLocations({ numberOfLocations: 500, joinData: { users }, @@ -103,6 +107,7 @@ import createNewBeerStyleLikes from './create/createNewBeerStyleLikes'; logger.info('Database seeded successfully.'); logger.info({ numberOfUsers: users.length, + numberOfUserAvatars: userAvatars.length, numberOfBreweryPosts: breweryPosts.length, numberOfBeerPosts: beerPosts.length, numberOfBeerStyles: beerStyles.length, diff --git a/src/services/BeerComment/createNewBeerComment.ts b/src/services/BeerComment/createNewBeerComment.ts index dc65f90..9abba2b 100644 --- a/src/services/BeerComment/createNewBeerComment.ts +++ b/src/services/BeerComment/createNewBeerComment.ts @@ -27,7 +27,7 @@ const createNewBeerComment = async ({ id: true, content: true, rating: true, - postedBy: { select: { id: true, username: true } }, + postedBy: { select: { id: true, username: true, userAvatar: true } }, createdAt: true, updatedAt: true, }, diff --git a/src/services/BeerComment/editBeerCommentById.ts b/src/services/BeerComment/editBeerCommentById.ts index 42ec67f..2aa4e3c 100644 --- a/src/services/BeerComment/editBeerCommentById.ts +++ b/src/services/BeerComment/editBeerCommentById.ts @@ -22,7 +22,9 @@ const editBeerCommentById = async ({ rating: true, createdAt: true, updatedAt: true, - postedBy: { select: { id: true, username: true, createdAt: true } }, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BeerComment/findBeerCommentById.ts b/src/services/BeerComment/findBeerCommentById.ts index 0fb030b..f985414 100644 --- a/src/services/BeerComment/findBeerCommentById.ts +++ b/src/services/BeerComment/findBeerCommentById.ts @@ -17,7 +17,9 @@ const findBeerCommentById = async ({ rating: true, createdAt: true, updatedAt: true, - postedBy: { select: { id: true, username: true, createdAt: true } }, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BeerComment/getAllBeerComments.ts b/src/services/BeerComment/getAllBeerComments.ts index 92b5357..c7a30bd 100644 --- a/src/services/BeerComment/getAllBeerComments.ts +++ b/src/services/BeerComment/getAllBeerComments.ts @@ -24,7 +24,9 @@ const getAllBeerComments = async ({ rating: true, createdAt: true, updatedAt: true, - postedBy: { select: { id: true, username: true, createdAt: true } }, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BeerStyleComment/createNewBeerStyleComment.ts b/src/services/BeerStyleComment/createNewBeerStyleComment.ts index 0d84586..9d29ee2 100644 --- a/src/services/BeerStyleComment/createNewBeerStyleComment.ts +++ b/src/services/BeerStyleComment/createNewBeerStyleComment.ts @@ -27,9 +27,11 @@ const createNewBeerStyleComment = async ({ id: true, content: true, rating: true, - postedBy: { select: { id: true, username: true } }, createdAt: true, updatedAt: true, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BeerStyleComment/getAllBeerStyleComments.ts b/src/services/BeerStyleComment/getAllBeerStyleComments.ts index e8bdeff..77deced 100644 --- a/src/services/BeerStyleComment/getAllBeerStyleComments.ts +++ b/src/services/BeerStyleComment/getAllBeerStyleComments.ts @@ -24,7 +24,9 @@ const getAllBeerStyleComments = async ({ rating: true, createdAt: true, updatedAt: true, - postedBy: { select: { id: true, username: true, createdAt: true } }, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BreweryComment/createNewBreweryComment.ts b/src/services/BreweryComment/createNewBreweryComment.ts index 5687864..d161292 100644 --- a/src/services/BreweryComment/createNewBreweryComment.ts +++ b/src/services/BreweryComment/createNewBreweryComment.ts @@ -27,9 +27,11 @@ const createNewBreweryComment = async ({ id: true, content: true, rating: true, - postedBy: { select: { id: true, username: true } }, createdAt: true, updatedAt: true, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, }); }; diff --git a/src/services/BreweryComment/getAllBreweryComments.ts b/src/services/BreweryComment/getAllBreweryComments.ts index 57f7f7d..766f68d 100644 --- a/src/services/BreweryComment/getAllBreweryComments.ts +++ b/src/services/BreweryComment/getAllBreweryComments.ts @@ -23,7 +23,9 @@ const getAllBreweryComments = async ({ rating: true, createdAt: true, updatedAt: true, - postedBy: { select: { id: true, username: true, createdAt: true } }, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, }, orderBy: { createdAt: 'desc' }, }); diff --git a/src/services/User/createNewUser.ts b/src/services/User/createNewUser.ts index 4f84366..b34c61a 100644 --- a/src/services/User/createNewUser.ts +++ b/src/services/User/createNewUser.ts @@ -33,6 +33,8 @@ const createNewUser = async ({ accountIsVerified: true, updatedAt: true, role: true, + userAvatar: true, + bio: true, }, }); diff --git a/src/services/User/deleteUserById.ts b/src/services/User/deleteUserById.ts index b743772..dd62693 100644 --- a/src/services/User/deleteUserById.ts +++ b/src/services/User/deleteUserById.ts @@ -17,6 +17,8 @@ const deleteUserById = async (id: string) => { accountIsVerified: true, updatedAt: true, role: true, + userAvatar: true, + bio: true, }, }); diff --git a/src/services/User/findUserById.ts b/src/services/User/findUserById.ts index dbd4311..05b1182 100644 --- a/src/services/User/findUserById.ts +++ b/src/services/User/findUserById.ts @@ -17,6 +17,17 @@ const findUserById = async (id: string) => { accountIsVerified: true, updatedAt: true, role: true, + userAvatar: { + select: { + path: true, + alt: true, + caption: true, + createdAt: true, + id: true, + updatedAt: true, + }, + }, + bio: true, }, }); diff --git a/src/services/User/schema/GetUserSchema.ts b/src/services/User/schema/GetUserSchema.ts index 92c7789..eaf21b7 100644 --- a/src/services/User/schema/GetUserSchema.ts +++ b/src/services/User/schema/GetUserSchema.ts @@ -11,6 +11,17 @@ const GetUserSchema = z.object({ dateOfBirth: z.coerce.date(), accountIsVerified: z.boolean(), role: z.enum(['USER', 'ADMIN']), + bio: z.string().nullable(), + userAvatar: z + .object({ + id: z.string().cuid(), + path: z.string().url(), + alt: z.string(), + caption: z.string(), + createdAt: z.coerce.date(), + updatedAt: z.coerce.date().nullable(), + }) + .nullable(), }); export default GetUserSchema; diff --git a/src/services/User/updateUserToBeConfirmedById.ts b/src/services/User/updateUserToBeConfirmedById.ts index 3cb6425..4a8e7f3 100644 --- a/src/services/User/updateUserToBeConfirmedById.ts +++ b/src/services/User/updateUserToBeConfirmedById.ts @@ -17,6 +17,17 @@ const updateUserToBeConfirmedById = async (id: string) => { updatedAt: true, dateOfBirth: true, role: true, + bio: true, + userAvatar: { + select: { + id: true, + path: true, + alt: true, + caption: true, + createdAt: true, + updatedAt: true, + }, + }, }, }); diff --git a/src/services/schema/CommentSchema/CommentQueryResult.ts b/src/services/schema/CommentSchema/CommentQueryResult.ts index b03acde..bf94cd9 100644 --- a/src/services/schema/CommentSchema/CommentQueryResult.ts +++ b/src/services/schema/CommentSchema/CommentQueryResult.ts @@ -8,6 +8,14 @@ const CommentQueryResult = z.object({ postedBy: z.object({ id: z.string().cuid(), username: z.string().min(1).max(50), + userAvatar: z + .object({ + id: z.string().cuid(), + path: z.string().url(), + alt: z.string().min(1).max(50), + caption: z.string().min(1).max(50), + }) + .nullable(), }), updatedAt: z.coerce.date().nullable(), });