mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-02-16 18:52:06 +00:00
Feat: create user page, add user bio and avatar
This commit is contained in:
57
src/prisma/migrations/20231106024511_/migration.sql
Normal file
57
src/prisma/migrations/20231106024511_/migration.sql
Normal 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;
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -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[];
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
38
src/prisma/seed/create/createNewUserAvatars.ts
Normal file
38
src/prisma/seed/create/createNewUserAvatars.ts
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user