diff --git a/schema.svg b/schema.svg index d32df12..37c0e2f 100644 --- a/schema.svg +++ b/schema.svg @@ -1,2086 +1,2103 @@ - - + + 1 - * - + - 1 - * - + - * 1 - + 1 - * - + 1 - * - + - 1 - * - + 1 - * - + - * - 1 - + - * - 1 - + 1 - * - + * - 1 - + 1 - * - + 1 - * - + - 1 - 1 - + - * 1 - + 1 - * - + 1 - * - + 1 - * - + 1 - * - + - 1 - * - + 1 - * - + User - + id - String - + username - - - - String - + firstName - - - - String - + lastName - - - - String - + hash - - - - String - + email - - - - String - + createdAt - - - - DateTime - + updatedAt - DateTime - + accountIsVerified - - - - Boolean - + dateOfBirth - - - - DateTime - + + role + + + + + + Role + + + beerPosts - - - - BeerPost - - + + beerStyles - - - - BeerStyle - - + + breweryPosts - - - - BreweryPost - - + + beerComments - - - - BeerComment - - + + breweryComments - - - - BreweryComment - - + + BeerPostLikes - - - - BeerPostLike - - - - BeerImage - - - - - BeerImage - - + - BreweryImage - + - - - - BreweryImage + BeerImage - + - BreweryPostLike - + - - - - BreweryPostLike + BreweryImage - + - Location - + - - - - Location + BreweryPostLike - + + + Location + + + + + Location + + + Glassware - - - - Glassware - - + + BeerPost - - + + id - String - - + + name - - - - String - - + + ibu - - - - Float - - + + abv - - - - Float - - + + description - - - - String - - + + postedBy - - - - User - - + + postedById - - - - String - - + + brewery - - - - BreweryPost - - + + breweryId - - - - String - - + + style - - - - BeerStyle - - + + styleId - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + beerComments - - - - BeerComment - - + + beerImages - - - - BeerImage - - + + BeerPostLikes - - - - BeerPostLike - - + + BeerPostLike - - + + id - String - - + + beerPost - - - - BeerPost - - + + beerPostId - - - - String - - + + likedBy - - - - User - - + + likedById - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + BreweryPostLike - - + + id - String - - + + breweryPost - - - - BreweryPost - - + + breweryPostId - - - - String - - + + likedBy - - - - User - - + + likedById - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + BeerComment - - + + id - String - - + + rating - - - - Int - - + + beerPost - - - - BeerPost - - + + beerPostId - - - - String - - + + postedBy - - - - User - - + + postedById - - - - String - - - - content - - - - String - + + content + + + + String + + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + BeerStyle - - + + id - String - - + + name - - - - String - - + + description - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + postedBy - - - - User - - + + glassware - - - - Glassware - - + + glasswareId - - - - String - - + + postedById - - - - String - - + + abvRange - - - - Float[] - - + + ibuRange - - - - Float[] - - + + beerPosts - - - - BeerPost - - + + Glassware - - + + id - String - - + + name - - - - String - - + + description - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + postedBy - - - - User - - + + postedById - - - - String - - + + BeerStyle - - - - BeerStyle - - + + Location - - + + id - String - - + + city - - - - String - - + + stateOrProvince - String - - + + country - String - - + + coordinates - - - - Float[] - - + + address - - - - String - - + + postedBy - - - - User - - + + postedById - - - - String - - + + BreweryPost - BreweryPost - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + BreweryPost - - + + id - String - - + + name - - - - String - - + + location - - - - Location - - + + locationId - - - - String - - + + beers - - - - BeerPost - - + + description - - - - String - - + + createdAt - - - - - DateTime - - - - - updatedAt - DateTime - + - postedBy - - - - User - - - - - postedById - - - - String - - - - - breweryComments - - - - - BreweryComment - - - - - breweryImages - - - - - BreweryImage - - - - - breweryPostLike - - - - - BreweryPostLike - - - - - dateEstablished - - - - + DateTime - - + + + + postedBy + + + + User + + + + + postedById + + + + String + + + + + breweryComments + + + + + BreweryComment + + + + + breweryImages + + + + + BreweryImage + + + + + breweryPostLike + + + + + BreweryPostLike + + + + + dateEstablished + + + + + DateTime + + + BreweryComment - - + + id - String - - + + rating - - - - Int - - + + breweryPost - - - - BreweryPost - - + + breweryPostId - - - - String - - + + postedBy - - - - User - - + + postedById - - - - String - - + + content - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + BeerImage - - + + id - String - - + + beerPost - - - - BeerPost - - + + beerPostId - - - - String - - + + path - - - - String - - + + alt - - - - String - - + + caption - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + postedBy - - - - User - - + + postedById - - - - String - - + + BreweryImage - - + + id - String - - + + breweryPost - - - - BreweryPost - - + + breweryPostId - - - - String - - + + path - - - - String - - + + createdAt - - - - DateTime - - + + updatedAt - DateTime - - + + caption - - - - String - - + + alt - - - - String - - + + postedBy - - - - User - - + + postedById - - - - String \ No newline at end of file diff --git a/src/prisma/migrations/20230923043953_/migration.sql b/src/prisma/migrations/20230923043953_/migration.sql new file mode 100644 index 0000000..ca8b984 --- /dev/null +++ b/src/prisma/migrations/20230923043953_/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "Role" AS ENUM ('USER', 'ADMIN'); + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "role" "Role" NOT NULL DEFAULT 'USER'; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 5b3d642..d5d660e 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -12,6 +12,11 @@ datasource db { shadowDatabaseUrl = env("SHADOW_DATABASE_URL") } +enum Role { + USER + ADMIN +} + model User { id String @id @default(cuid()) username String @unique @@ -23,6 +28,7 @@ model User { updatedAt DateTime? @updatedAt @db.Timestamptz(3) accountIsVerified Boolean @default(false) dateOfBirth DateTime + role Role @default(USER) beerPosts BeerPost[] beerStyles BeerStyle[] breweryPosts BreweryPost[] diff --git a/src/prisma/seed/create/createAdminUser.ts b/src/prisma/seed/create/createAdminUser.ts new file mode 100644 index 0000000..7de97ff --- /dev/null +++ b/src/prisma/seed/create/createAdminUser.ts @@ -0,0 +1,36 @@ +import { z } from 'zod'; + +import { hashPassword } from '../../../config/auth/passwordFns'; +import DBClient from '../../DBClient'; +import GetUserSchema from '../../../services/User/schema/GetUserSchema'; + +const createAdminUser = async () => { + const hash = await hashPassword('Pas!3word'); + const adminUser: z.infer = await DBClient.instance.user.create({ + data: { + username: 'admin', + email: 'admin@example.com', + firstName: 'Admin', + lastName: 'User', + dateOfBirth: new Date('1990-01-01'), + role: 'ADMIN', + hash, + }, + select: { + id: true, + username: true, + email: true, + firstName: true, + lastName: true, + dateOfBirth: true, + createdAt: true, + accountIsVerified: true, + updatedAt: true, + role: true, + }, + }); + + return adminUser; +}; + +export default createAdminUser; diff --git a/src/prisma/seed/create/createNewUsers.ts b/src/prisma/seed/create/createNewUsers.ts index 3fec708..c9c81f3 100644 --- a/src/prisma/seed/create/createNewUsers.ts +++ b/src/prisma/seed/create/createNewUsers.ts @@ -16,6 +16,8 @@ interface UserData { dateOfBirth: Date; createdAt: Date; hash: string; + accountIsVerified: boolean; + role: 'USER' | 'ADMIN'; } const createNewUsers = async ({ numberOfUsers }: CreateNewUsersArgs) => { @@ -53,7 +55,7 @@ const createNewUsers = async ({ numberOfUsers }: CreateNewUsersArgs) => { const dateOfBirth = faker.date.birthdate({ mode: 'age', min: 19 }); const createdAt = faker.date.past({ years: 4 }); - const user = { + const user: UserData = { firstName, lastName, email, @@ -62,6 +64,7 @@ const createNewUsers = async ({ numberOfUsers }: CreateNewUsersArgs) => { createdAt, hash, accountIsVerified: true, + role: 'USER', }; data.push(user); diff --git a/src/prisma/seed/index.ts b/src/prisma/seed/index.ts index e7d0715..b0c14b6 100644 --- a/src/prisma/seed/index.ts +++ b/src/prisma/seed/index.ts @@ -15,6 +15,7 @@ import createNewUsers from './create/createNewUsers'; import createNewBreweryPostLikes from './create/createNewBreweryPostLikes'; import createNewLocations from './create/createNewLocations'; import logger from '../../config/pino/logger'; +import createAdminUser from './create/createAdminUser'; (async () => { try { @@ -24,6 +25,9 @@ import logger from '../../config/pino/logger'; await cleanDatabase(); logger.info('Database cleared successfully, preparing to seed.'); + await createAdminUser(); + logger.info('Admin user created successfully.'); + const users = await createNewUsers({ numberOfUsers: 10000 }); logger.info('Users created successfully.'); diff --git a/src/services/User/createNewUser.ts b/src/services/User/createNewUser.ts index b07124c..4f84366 100644 --- a/src/services/User/createNewUser.ts +++ b/src/services/User/createNewUser.ts @@ -32,6 +32,7 @@ const createNewUser = async ({ createdAt: true, accountIsVerified: true, updatedAt: true, + role: true, }, }); diff --git a/src/services/User/deleteUserById.ts b/src/services/User/deleteUserById.ts index 89ca262..b743772 100644 --- a/src/services/User/deleteUserById.ts +++ b/src/services/User/deleteUserById.ts @@ -16,6 +16,7 @@ const deleteUserById = async (id: string) => { createdAt: true, accountIsVerified: true, updatedAt: true, + role: true, }, }); diff --git a/src/services/User/findUserById.ts b/src/services/User/findUserById.ts index fb962b2..dbd4311 100644 --- a/src/services/User/findUserById.ts +++ b/src/services/User/findUserById.ts @@ -16,6 +16,7 @@ const findUserById = async (id: string) => { createdAt: true, accountIsVerified: true, updatedAt: true, + role: true, }, }); diff --git a/src/services/User/schema/GetUserSchema.ts b/src/services/User/schema/GetUserSchema.ts index b14f8fd..92c7789 100644 --- a/src/services/User/schema/GetUserSchema.ts +++ b/src/services/User/schema/GetUserSchema.ts @@ -10,6 +10,7 @@ const GetUserSchema = z.object({ lastName: z.string(), dateOfBirth: z.coerce.date(), accountIsVerified: z.boolean(), + role: z.enum(['USER', 'ADMIN']), }); export default GetUserSchema; diff --git a/src/services/User/updateUserToBeConfirmedById.ts b/src/services/User/updateUserToBeConfirmedById.ts index 0cf8e7f..3cb6425 100644 --- a/src/services/User/updateUserToBeConfirmedById.ts +++ b/src/services/User/updateUserToBeConfirmedById.ts @@ -16,6 +16,7 @@ const updateUserToBeConfirmedById = async (id: string) => { lastName: true, updatedAt: true, dateOfBirth: true, + role: true, }, });