Next.js 14 + Prisma + PostgreSQL — Hệ thống quản lý khóa học (Learning Management System).
- Lecturer (Giảng viên): Tạo & quản lý khóa học, tải lên video/bài quiz
- Admin (Quản trị viên): Duyệt khóa học, phê duyệt/từ chối
- Student (Học sinh): Đăng ký khóa học, học video, làm bài quiz, theo dõi tiến độ
- Preview Mode: Giảng viên xem trước khóa học trước khi submit
- Validation & Error Handling: Chi tiết, dễ debug
# 1. Cài đúng Node.js version (đọc từ .mise.toml)
mise install
# 2. Kích hoạt pnpm qua corepack (chỉ cần làm 1 lần trên máy)
corepack enable pnpm
# 3. Cài dependencies từ lockfile (deterministic — giống uv sync)
pnpm installKhông dùng
npm installhayyarn.packageManagerfield trongpackage.jsonenforce pnpm qua corepack.
| Tool | Vai trò | Tương đương Python |
|---|---|---|
mise |
Quản lý Node.js runtime | mise (Python runtime) |
.mise.toml |
Pin Node.js version | .mise.toml (Python version) |
pnpm |
Quản lý packages | uv |
pnpm-lock.yaml |
Lockfile deterministic | uv.lock |
corepack |
Enforce đúng package manager | N/A (built-in Node.js) |
pnpm install # Sync packages từ lockfile (sau khi pull)
pnpm add <package> # Thêm dependency mới
pnpm add -D <package> # Thêm devDependency
pnpm remove <package> # Xóa package
pnpm run dev # Chạy dev server
pnpm run build # Build production
pnpm run lint # ESLint checkCopy .env.example → .env và điền các biến:
cp .env.example .envVariables cần thiết:
DATABASE_URL— PostgreSQL connection stringJWT_SECRET— Secret key cho JWT tokensYOUTUBE_API_KEY— Google API key (optional, for video metadata)
pnpm prisma migrate dev # Chạy migrations
pnpm prisma db seed # Seed dữ liệu mẫu
pnpm prisma studio # Mở Prisma StudioCodebase được tổ chức theo DDD (Domain-Driven Design):
src/
├── app/ # Next.js App Router
│ ├── api/v1/ # REST API endpoints
│ └── [pages]/ # UI pages
├── modules/ # Domain-driven modules
│ └── course-management/ # Controllers → Services → Domain → Repos
├── components/ # Shared React components
├── lib/ # Client-side API wrappers
└── types/ # TypeScript types
docs/codebase/01-database-schema.md— Schema DB, 9 bảng, ERDdocs/codebase/02-backend-components.md— Tất cả BE components với tên chính xácdocs/codebase/03-backend-dependency-chain.md— 43 API endpoint chains (Route → Controller → Service → Domain → Repo)docs/codebase/04-frontend-components.md— 35 FE components (pages, components, lib files)docs/codebase/05-frontend-dependency-chain.md— 23 user flows, component map, navigation map
- ✅ Fixed YouTube API 400 error — clean error logging (không expose API key)
- ✅ Fixed publish/moderate route methods (PATCH → POST)
- ✅ Fixed autosave UX — in-memory sync only, Save button persists to DB
- ✅ Fixed course.submit() not a function — return Course domain instance
- ✅ Fixed slug unique constraint — append random suffix
- ✅ Fixed delete section ACCESS_DENIED — validate against course.lecturerId
- ✅ Fixed republish after rejection — allow submit() from REJECTED status
- ✅ Added
/api/v1/management/courses/[id]PUT endpoint — update course metadata
- Lưu trong
localStorage - Valid 15 phút
- Auto-attach vào headers via Axios interceptor
- Lưu trong
httpOnlycookie - Valid 7 ngày
- Server-side renewal
| Status | Meaning |
|---|---|
| 200 | OK |
| 201 | Created |
| 400 | Bad Request (validation error) |
| 401 | Unauthorized (no token/invalid token) |
| 403 | Forbidden (permission denied) |
| 404 | Not Found |
| 409 | Conflict (e.g., duplicate slug) |
| 500 | Internal Server Error |
pnpm run build
pnpm startSet các biến in .env hoặc environment của server (VPS/Vercel):
DATABASE_URL=postgresql://user:password@host:5432/dbname
JWT_SECRET=your-secret-key
NODE_ENV=production- Branch từ
main:git checkout -b feature/your-feature - Commit với co-author trailer:
git commit -m "Fix bug X Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
- Push & tạo Pull Request
Xem file log tại /logs/ hoặc browser DevTools → Console/Network tab.
Last Updated: Mar 10, 2026