Feat: create user page, add user bio and avatar

This commit is contained in:
Aaron William Po
2023-11-05 21:54:09 -05:00
parent fcc43c305c
commit 7f9ddb40a1
26 changed files with 324 additions and 79 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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,
},
});

View File

@@ -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[];
};
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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,