diff --git a/package.json b/package.json index a9d3eb4..943b0e8 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,14 @@ "build": "next build", "start": "next start", "lint": "eslint", - "db:generate": "prisma generate", - "db:push": "prisma db push", - "db:migrate": "prisma migrate dev", - "db:studio": "prisma studio", - "db:seed": "tsx prisma/seed.ts" + "generate": "prisma generate", + "push": "prisma db push", + "migrate": "prisma migrate dev", + "studio": "prisma studio", + "seed": "npx tsx prisma/seed.ts" }, "prisma": { - "seed": "tsx prisma/seed.ts" + "seed": "npx tsx prisma/seed.ts" }, "dependencies": { "@prisma/client": "^6.19.0", diff --git a/prisma/prisma/dev.db b/prisma/prisma/dev.db new file mode 100644 index 0000000..5e029b4 Binary files /dev/null and b/prisma/prisma/dev.db differ diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..a8511b3 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,126 @@ +import { PrismaClient } from '../lib/generated/prisma/client'; +import bcrypt from 'bcryptjs'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('๐ŸŒฑ ์‹œ๋“œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์‹œ์ž‘...'); + + // ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์‚ญ์ œ (์ˆœ์„œ ์ค‘์š”: ์™ธ๋ž˜ํ‚ค ๊ด€๊ณ„ ๊ณ ๋ ค) + console.log('๐Ÿ—‘๏ธ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์ค‘...'); + await prisma.userLecture.deleteMany(); + await prisma.lecture.deleteMany(); + await prisma.curriculum.deleteMany(); + await prisma.user.deleteMany(); + + // ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ (๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ: password123) + const hashedPassword = await bcrypt.hash('password123', 10); + + // 1. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ƒ์„ฑ + console.log('๐Ÿ‘ฅ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์ค‘...'); + const users = await prisma.user.createMany({ + data: [ + // ์šด์˜์ž + { email: 'park@example.com', name: '๋ฐ•๋ฏผ์ˆ˜', password: hashedPassword, role: 'ADMIN', isActive: true }, + { email: 'oh@example.com', name: '์˜ค์ค€ํ˜', password: hashedPassword, role: 'ADMIN', isActive: true }, + { email: 'kwon@example.com', name: '๊ถŒํƒœ์˜', password: hashedPassword, role: 'ADMIN', isActive: true }, + + // ๊ฐ•์‚ฌ + { email: 'kim@example.com', name: '๊น€์ฒ ์ˆ˜', password: hashedPassword, role: 'INSTRUCTOR', isActive: true }, + { email: 'jung@example.com', name: '์ •๋Œ€ํ˜„', password: hashedPassword, role: 'INSTRUCTOR', isActive: true }, + { email: 'lim@example.com', name: '์ž„์ˆ˜์ง„', password: hashedPassword, role: 'INSTRUCTOR', isActive: true }, + { email: 'shin@example.com', name: '์‹ ๋™์šฑ', password: hashedPassword, role: 'INSTRUCTOR', isActive: true }, + { email: 'jeon@example.com', name: '์ „ํ˜œ์ง„', password: hashedPassword, role: 'INSTRUCTOR', isActive: true }, + + // ํ•™์Šต์ž + { email: 'hong@example.com', name: 'ํ™๊ธธ๋™', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'lee@example.com', name: '์ด์˜ํฌ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'choi@example.com', name: '์ตœ์ง€์˜', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'kang@example.com', name: '๊ฐ•๋ฏธ์˜', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'yoon@example.com', name: '์œค์„ฑํ˜ธ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'han@example.com', name: 'ํ•œ์ง€ํ›ˆ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'song@example.com', name: '์†ก๋ฏผ๊ฒฝ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'ryu@example.com', name: '๋ฅ˜ํ˜„์šฐ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'cho@example.com', name: '์กฐ์€์„œ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'bae@example.com', name: '๋ฐฐ์„ฑ๋ฏผ', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'namgung@example.com', name: '๋‚จ๊ถ์ค€', password: hashedPassword, role: 'STUDENT', isActive: true }, + { email: 'seo@example.com', name: '์„œ์•„๋ฆ„', password: hashedPassword, role: 'STUDENT', isActive: true }, + ], + }); + + console.log(`โœ… ${users.count}๋ช…์˜ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ์™„๋ฃŒ`); + + // ์‚ฌ์šฉ์ž ID ์กฐํšŒ (๊ฐ•์‚ฌ์™€ ๋“ฑ๋ก์ž๋กœ ์‚ฌ์šฉ) + const instructorKim = await prisma.user.findUnique({ where: { email: 'kim@example.com' } }); + const registrarLee = await prisma.user.findUnique({ where: { email: 'lee@example.com' } }); + const registrarPark = await prisma.user.findUnique({ where: { email: 'park@example.com' } }); + const registrarKim = await prisma.user.findUnique({ where: { email: 'kim@example.com' } }); + + if (!instructorKim || !registrarLee || !registrarPark || !registrarKim) { + throw new Error('ํ•„์ˆ˜ ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'); + } + + // 2. ๊ต์œก ๊ณผ์ • ๋ฐ์ดํ„ฐ ์ƒ์„ฑ + console.log('๐Ÿ“š ๊ต์œก ๊ณผ์ • ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์ค‘...'); + const curriculum1 = await prisma.curriculum.create({ + data: { + title: '๋ฐฉ์‚ฌ์„  ์ ์šฉ', + thumbnailImage: null, + instructorId: instructorKim.id, + }, + }); + + const curriculum2 = await prisma.curriculum.create({ + data: { + title: '๋ฐฉ์‚ฌ์„  ์›๋ฆฌ', + thumbnailImage: null, + instructorId: instructorKim.id, + }, + }); + + console.log('โœ… ๊ต์œก ๊ณผ์ • ์ƒ์„ฑ ์™„๋ฃŒ'); + + // 3. ๊ฐ•์ขŒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ + console.log('๐Ÿ“– ๊ฐ•์ขŒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์ค‘...'); + const lectures = await prisma.lecture.createMany({ + data: [ + // ๋ฐฉ์‚ฌ์„  ์ ์šฉ ๊ฐ•์ขŒ๋“ค + { title: '๋ฐฉ์‚ฌ์„  ๊ธฐ๋ณธ ์›๋ฆฌ', attachmentFile: 'ํŒŒ์ผ1.pdf', evaluationQuestionCount: 10, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์•ˆ์ „ ๊ด€๋ฆฌ', attachmentFile: 'ํŒŒ์ผ2.pdf', evaluationQuestionCount: 15, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์žฅ๋น„ ์‚ฌ์šฉ๋ฒ•', attachmentFile: 'ํŒŒ์ผ4.pdf', evaluationQuestionCount: 8, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ๋ณดํ˜ธ ์žฅ๋น„', attachmentFile: 'ํŒŒ์ผ6.pdf', evaluationQuestionCount: 14, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์‘์šฉ ์‹ค์Šต', attachmentFile: 'ํŒŒ์ผ7.pdf', evaluationQuestionCount: 16, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์˜๋ฃŒ ์‘์šฉ', attachmentFile: 'ํŒŒ์ผ9.pdf', evaluationQuestionCount: 18, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์‚ฐ์—… ์‘์šฉ', attachmentFile: 'ํŒŒ์ผ10.pdf', evaluationQuestionCount: 13, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง', attachmentFile: 'ํŒŒ์ผ12.pdf', evaluationQuestionCount: 9, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ๊ฒ€์‚ฌ ๊ธฐ๋ฒ•', attachmentFile: 'ํŒŒ์ผ13.pdf', evaluationQuestionCount: 19, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ', attachmentFile: 'ํŒŒ์ผ15.pdf', evaluationQuestionCount: 7, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ํ’ˆ์งˆ ๊ด€๋ฆฌ', attachmentFile: 'ํŒŒ์ผ16.pdf', evaluationQuestionCount: 22, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ๊ณ„์ธก๋ฒ•', attachmentFile: 'ํŒŒ์ผ18.pdf', evaluationQuestionCount: 24, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + { title: '๋ฐฉ์‚ฌ์„  ์•ˆ์ „ ๊ทœ์ •', attachmentFile: 'ํŒŒ์ผ19.pdf', evaluationQuestionCount: 5, curriculumId: curriculum1.id, registrantId: registrarLee.id }, + + // ๋ฐฉ์‚ฌ์„  ์›๋ฆฌ ๊ฐ•์ขŒ๋“ค + { title: '๋ฐฉ์‚ฌ์„  ์ธก์ • ๊ธฐ๋ฒ•', attachmentFile: 'ํŒŒ์ผ3.pdf', evaluationQuestionCount: 12, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ๋ฌผ๋ฆฌํ•™ ๊ธฐ์ดˆ', attachmentFile: 'ํŒŒ์ผ5.pdf', evaluationQuestionCount: 20, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ํ™”ํ•™ ๋ฐ˜์‘', attachmentFile: 'ํŒŒ์ผ8.pdf', evaluationQuestionCount: 11, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ์ƒ๋ฌผํ•™', attachmentFile: 'ํŒŒ์ผ11.pdf', evaluationQuestionCount: 17, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ์—๋„ˆ์ง€ ์ „๋‹ฌ', attachmentFile: 'ํŒŒ์ผ14.pdf', evaluationQuestionCount: 21, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ๋ฐฉ์–ด ์ด๋ก ', attachmentFile: 'ํŒŒ์ผ17.pdf', evaluationQuestionCount: 6, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + { title: '๋ฐฉ์‚ฌ์„  ํ•ต๋ฌผ๋ฆฌํ•™', attachmentFile: 'ํŒŒ์ผ20.pdf', evaluationQuestionCount: 25, curriculumId: curriculum2.id, registrantId: registrarKim.id }, + ], + }); + + console.log(`โœ… ${lectures.count}๊ฐœ์˜ ๊ฐ•์ขŒ ์ƒ์„ฑ ์™„๋ฃŒ`); + + console.log('๐ŸŽ‰ ์‹œ๋“œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์™„๋ฃŒ!'); +} + +main() + .catch((e) => { + console.error('โŒ ์‹œ๋“œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์‹คํŒจ:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/public/svg/pagenav_rightoff.tsx b/public/svg/pagenav_rightoff.tsx index 34588a8..5cb9558 100644 --- a/public/svg/pagenav_rightoff.tsx +++ b/public/svg/pagenav_rightoff.tsx @@ -1,9 +1,8 @@ -export default function PageNavLeftOn() { +export default function PageNavRightOff() { return ( - ); } \ No newline at end of file