From 991a9ed583792b07035ec8a7290bceb7bdf3f55c Mon Sep 17 00:00:00 2001 From: Sianida26 Date: Sun, 28 Jan 2024 23:52:31 +0700 Subject: [PATCH] Add seeder --- package.json | 4 ++ pnpm-lock.yaml | 92 ++++++++++++++++++++++++++++--- prisma/seed.ts | 20 +++++++ prisma/seeds/permissionSeed.ts | 99 ++++++++++++++++++++++++++++++++++ prisma/seeds/roleSeed.ts | 30 +++++++++++ 5 files changed, 239 insertions(+), 6 deletions(-) create mode 100644 prisma/seed.ts create mode 100644 prisma/seeds/permissionSeed.ts create mode 100644 prisma/seeds/roleSeed.ts diff --git a/package.json b/package.json index de00b0c..3be7249 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "start": "next start", "lint": "next lint" }, + "prisma": { + "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" + }, "dependencies": { "@auth/prisma-adapter": "^1.1.0", "@mantine/core": "^7.5.0", @@ -37,6 +40,7 @@ "sass": "^1.70.0", "server-only": "^0.0.1", "superjson": "^2.2.1", + "ts-node": "^10.9.2", "zod": "^3.22.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91d688e..a0cc7ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ dependencies: superjson: specifier: ^2.2.1 version: 2.2.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.11.7)(typescript@5.3.3) zod: specifier: ^3.22.4 version: 3.22.4 @@ -126,7 +129,7 @@ devDependencies: version: 5.8.1 tailwindcss: specifier: ^3.4.1 - version: 3.4.1 + version: 3.4.1(ts-node@10.9.2) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -176,6 +179,12 @@ packages: dependencies: regenerator-runtime: 0.14.1 + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -291,7 +300,6 @@ packages: /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} @@ -300,7 +308,6 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true /@jridgewell/trace-mapping@0.3.22: resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} @@ -309,6 +316,12 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + /@mantine/core@7.5.0(@mantine/hooks@7.5.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-0Qfn4oLCs6Qrli+JK6Q325xhNblVEPSKOB4sDMUkvKYUlCt/2lsIhwUXarVBgiIV3X+rKccf0/LcEWmpn/dYuw==} peerDependencies: @@ -668,6 +681,18 @@ packages: resolution: {integrity: sha512-2Fwzv6nqpE0Ie/G7PeS0EVR89zLm+c1Mw7T+RAGtU807j4oaUx0zGkBXTu5u9AI+j+BYNN2GZxJcuDTAecbr1A==} dev: false + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: @@ -861,6 +886,10 @@ packages: dependencies: acorn: 8.11.3 + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -926,6 +955,9 @@ packages: readable-stream: 3.6.2 dev: false + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true @@ -1220,6 +1252,9 @@ packages: is-what: 4.1.16 dev: false + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1306,6 +1341,10 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2424,6 +2463,9 @@ packages: semver: 6.3.1 dev: false + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + /mantine-form-zod-resolver@1.1.0(@mantine/form@7.5.0)(zod@3.22.4): resolution: {integrity: sha512-hidTuYq6agSF5XbkcVVcr0mkGs9ki/x8OC9ldZMxGLVGja6bdl+x4k1hCNrigCG90DBoMDnu0bo3hprGBBlUZA==} engines: {node: '>=16.6.0'} @@ -2776,7 +2818,7 @@ packages: postcss: 8.4.33 dev: true - /postcss-load-config@4.0.2(postcss@8.4.33): + /postcss-load-config@4.0.2(postcss@8.4.33)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -2790,6 +2832,7 @@ packages: dependencies: lilconfig: 3.0.0 postcss: 8.4.33 + ts-node: 10.9.2(@types/node@20.11.7)(typescript@5.3.3) yaml: 2.3.4 dev: true @@ -3388,7 +3431,7 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false - /tailwindcss@3.4.1: + /tailwindcss@3.4.1(ts-node@10.9.2): resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} hasBin: true @@ -3410,7 +3453,7 @@ packages: postcss: 8.4.33 postcss-import: 15.1.0(postcss@8.4.33) postcss-js: 4.0.1(postcss@8.4.33) - postcss-load-config: 4.0.2(postcss@8.4.33) + postcss-load-config: 4.0.2(postcss@8.4.33)(ts-node@10.9.2) postcss-nested: 6.0.1(postcss@8.4.33) postcss-selector-parser: 6.0.15 resolve: 1.22.8 @@ -3474,6 +3517,36 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true + /ts-node@10.9.2(@types/node@20.11.7)(typescript@5.3.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.11.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -3650,6 +3723,9 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -3751,6 +3827,10 @@ packages: engines: {node: '>= 14'} dev: true + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..80d8683 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,20 @@ +import { PrismaClient } from "@prisma/client"; +import permissionSeed from "./seeds/permissionSeed"; +import roleSeed from "./seeds/roleSeed"; + +const prisma = new PrismaClient(); + +async function main() { + await permissionSeed(prisma); + await roleSeed(prisma); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/prisma/seeds/permissionSeed.ts b/prisma/seeds/permissionSeed.ts new file mode 100644 index 0000000..668aded --- /dev/null +++ b/prisma/seeds/permissionSeed.ts @@ -0,0 +1,99 @@ +import { Permission, PrismaClient } from "@prisma/client"; +import { log } from "console"; + +export default async function permissionSeed(prisma: PrismaClient) { + + log("Seeding permissions...") + + const permissionData: Omit[] = [ + // Permission group + { + code: "permissions.read", + name: "Read permission", + description: "Allows reading a single permission", + isActive: true, + }, + { + code: "permissions.readAll", + name: "Read all permissions", + description: "Allows reading all permissions", + isActive: true, + }, + { + code: "permissions.update", + name: "Update permission", + description: "Allows updating a permission", + isActive: true, + }, + { + code: "permissions.delete", + name: "Delete permission", + description: "Allows deleting a permission", + isActive: true, + }, + // Role group + { + code: "roles.read", + name: "Read role", + description: "Allows reading a single role", + isActive: true, + }, + { + code: "roles.readAll", + name: "Read all roles", + description: "Allows reading all roles", + isActive: true, + }, + { + code: "roles.update", + name: "Update role", + description: "Allows updating a role", + isActive: true, + }, + { + code: "roles.delete", + name: "Delete role", + description: "Allows deleting a role", + isActive: true, + }, + // User group + { + code: "users.read", + name: "Read user", + description: "Allows reading a single user", + isActive: true, + }, + { + code: "users.readAll", + name: "Read all users", + description: "Allows reading all users", + isActive: true, + }, + { + code: "users.update", + name: "Update user", + description: "Allows updating a user", + isActive: true, + }, + { + code: "users.delete", + name: "Delete user", + description: "Allows deleting a user", + isActive: true, + }, + ]; + + await Promise.all( + permissionData.map(async (permission) => { + await prisma.permission.upsert({ + where: { + code: permission.code + }, + update: permission, + create: permission + }) + }) + ) + + console.log("Permission is seeded successfully") +} diff --git a/prisma/seeds/roleSeed.ts b/prisma/seeds/roleSeed.ts new file mode 100644 index 0000000..878523a --- /dev/null +++ b/prisma/seeds/roleSeed.ts @@ -0,0 +1,30 @@ +import { Role, PrismaClient } from "@prisma/client"; +import { log } from "console"; + +export default async function roleSeed(prisma: PrismaClient) { + + log("Seeding roles...") + + const roleData: Omit[] = [ + { + code: "super-admin", + description: "Has full access to the system and can manage all features and settings", + isActive: true, + name: "Super Admin" + } + ]; + + await Promise.all( + roleData.map(async (role) => { + await prisma.role.upsert({ + where: { + code: role.code + }, + update: role, + create: role + }) + }) + ) + + console.log("roles is seeded successfully") +}