ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Backend API for the Project Submission & Review Dashboard (Programming Hero Associate Web Instructor hiring task). Students submit assignment work for review; mentors approve or reject it and track their own review activity.
| Layer | Technology |
|---|---|
| Runtime | Node.js, Express 5, TypeScript (strict) |
| Database | PostgreSQL via Prisma ORM v5 |
| Auth | JWT, bcrypt password hashing, role-based access control (STUDENT, MENTOR) |
| Validation | Zod |
| Security | helmet, explicit CORS allowlist, rate limiting, input sanitization |
| Role | Password | |
|---|---|---|
| Mentor | [email protected] | Mentor@12345 |
| Student (demo) | [email protected] | Student@123 |
The mentor account is seeded automatically on server boot from MENTOR_EMAIL / MENTOR_PASSWORD in .env — it is never created through a public endpoint. Demo student accounts and sample submissions can be added with node seed-demo.js (see below).
npm install
cp .env.example .env
| Variable | Description |
|---|---|
DATABASE_URL | PostgreSQL connection string used by the running app |
DIRECT_URL | Non-pooled connection string, used only by prisma migrate/db push |
JWT_ACCESS_SECRET | Long random string signing access tokens |
JWT_ACCESS_EXPIRES_IN | Token lifetime, e.g. 1d |
BCRYPT_SALT_ROUND | Password hashing cost, e.g. 12 |
MENTOR_EMAIL / MENTOR_PASSWORD / MENTOR_NAME | Mentor account seeded on first boot |
CLIENT_URL | Deployed Next.js client origin, added to the CORS allowlist |
Using Supabase or any PgBouncer-fronted Postgres? Point
DATABASE_URLat the Transaction pooler (port6543, add?pgbouncer=true) for the running app, andDIRECT_URLat the Session pooler (port5432) for migrations. Transaction-mode pooling doesn't support the advisory locks Prisma Migrate needs, so schema changes must go throughDIRECT_URL.
npx prisma migrate dev --name init
Creates 4 demo students and 5 sample submissions spanning all statuses, useful for showcasing the dashboard without manual data entry:
node seed-demo.js
npm run dev
The API listens on http://localhost:5000 by default and seeds the mentor account on first boot.
npm run build # tsc -> dist/
npm start # node dist/server.js
Base URL: /api/v1 · Auth header: Authorization: <accessToken> (no Bearer prefix)
| Method | Path | Auth | Body |
|---|---|---|---|
POST | /auth/register | None | { name, email, password } — always creates a STUDENT; a role field in the body is ignored |
POST | /auth/login | None | { email, password } → { accessToken, user } |
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /submissions | STUDENT | Create a submission. 409 if this student already has a submission for that assignmentNumber. |
PATCH | /submissions/:id | STUDENT | Edit your own submission — allowed exactly once. Resets status to PENDING and clears feedback for re-review. 403 if already edited. |
GET | /submissions/my | STUDENT | List your own submissions. |
GET | /submissions | MENTOR | ?status=PENDING|APPROVED|REJECTED&assignmentNumber=1-15&searchTerm=&page=1&limit=10 — search matches project name or student name/email. |
GET | /submissions/stats | MENTOR | { PENDING, APPROVED, REJECTED, total } |
PATCH | /submissions/:id/status | MENTOR | { status: "APPROVED" | "REJECTED", feedback? }. Logged to the activity trail. |
GET | /submissions/activity | MENTOR | Paginated log of the mentor's own approve/reject actions. |
List endpoints return:
{
"success": true,
"statusCode": 200,
"message": "...",
"meta": { "page": 1, "limit": 10, "total": 5, "totalPages": 1 },
"data": [...]
}
User { id, name, email, password, role: STUDENT|MENTOR }
Submission { id, assignmentNumber (1-15), projectName, repoUrl, liveLink?,
description, status: PENDING|APPROVED|REJECTED, feedback?,
edited (bool), studentId }
ActivityLog { id, mentorId, submissionId, action, detail, createdAt }
@@unique([studentId, assignmentNumber]) enforces one submission per student per assignment.edited flips to true on the student's first (and only permitted) edit.ActivityLog row for auditability.src/
app.ts, server.ts
config/ # single source of truth for env vars
db/seedMentor.ts # seeds the mentor account on boot
helpers/jwtHelpers.ts
shared/ # catchAsync, sendResponse, pick, paginationHelper, prisma client
app/
errors/ApiError.ts
middlewares/ # auth, validateRequest, rateLimiters, sanitizeInput, globalErrorHandler, notFound
modules/
auth/ # controller, service, routes, validation
submission/ # controller, service, routes, validation, interface
routes/index.ts # mounts every module under /api/v1
CLIENT_URL + localhost) — never origin: '*'.HS256 and an explicit algorithm whitelist on verify.globalErrorHandler maps ApiError, ZodError, and known Prisma errors to correct status codes (never a blanket 500), and never leaks stack traces when NODE_ENV=production./auth/* and POST /submissions to blunt spam/credential-stuffing.