4ad5630cb74816b2c36bfa4b17be50b4e98377c3
Surface env vs dashboard disable reasons in SMS logs so password reset and other sends are easier to diagnose when only one layer is enabled.
Teaching Institution Management Dashboard API
Production-ready Express.js & MongoDB backend API for an internal management dashboard of a teaching institution. Built with a strict layered architecture, JWT authentication with refresh token rotation, Joi validation, native Node.js EventEmitter, dynamic localization (English & Persian), background jobs, multi-channel notifications (Email, SMS, Bale Bot), custom Role-Based Access Control (RBAC), and private AWS S3 / MinIO object storage with presigned temporary URLs.
Technical Features & Domain Architecture
- Private S3 / MinIO Storage System:
- Bucket Privacy: All buckets are strictly private; no public static file URLs are exposed.
- Presigned URLs: Dynamic presigned temporary URLs generated via
@aws-sdk/s3-request-presigner(getSignedUrl). - Two-Stage Temp Upload Workflow:
- Upload: User/Admin uploads file to
POST /files/user/upload-temp(or/files/admin/upload-temp), streaming directly toS3_TEMP_BUCKET. ReturnstempFileName. - Commit: When submitting changes (e.g. creating/updating Certificate), the server copies the file from
S3_TEMP_BUCKETtoS3_STORAGE_BUCKETand removes the temp file.
- Upload: User/Admin uploads file to
- Daily Temp Bucket Cleanup: Scheduled cron job running daily at 3:00 AM (
tempBucketCleanupJob), deleting files inS3_TEMP_BUCKETolder than 10 minutes.
- Courses & Classes:
- Each Course can contain multiple Class sections (e.g. "AutoDesk Farvardin A", "AutoDesk Farvardin B").
- Each Class maintains a
registeredUsersarray.
- Sessions & Attendance:
- Embedded
attendanceListarray inside each Session model.
- Embedded
- Strict Layered Architecture:
Router→Controller→Service→Modelper component.
Endpoints Overview
| Component | Scope | Verb | Route | Description | Permission |
|---|---|---|---|---|---|
| Auth | Public | POST |
/auth/login |
Login with username & password | Public |
| Public | POST |
/auth/refresh |
Refresh access & refresh tokens | Public | |
| Auth | POST |
/auth/logout |
Revoke refresh token | Authenticated | |
| Files | User | POST |
/files/user/upload-temp |
Upload file to S3 temp bucket | files:upload |
| User | GET |
/files/user/signed-url/:filename |
Get presigned temporary GET URL | files:read |
|
| Admin | POST |
/files/admin/upload-temp |
Admin upload file to S3 temp bucket | files:upload |
|
| Admin | GET |
/files/admin/signed-url/:filename |
Admin get presigned GET URL | files:read |
|
| Admin | DELETE |
/files/admin/delete/:filename |
Delete file from bucket | files:delete |
|
| Users | User | POST |
/users/user/sign-up |
Self-register as a student | Public |
| User | GET |
/users/user/get-self |
Get self profile | Authenticated | |
| User | PUT |
/users/user/update-self |
Update self profile | Authenticated | |
| Admin | POST |
/users/admin/create |
Create user with specific role | users:create |
|
| Admin | GET |
/users/admin/get-all |
Get paginated users | users:read |
|
| Admin | GET |
/users/admin/search |
Search users | users:search |
|
| Admin | GET |
/users/admin/get-one/:id |
Get single user by ID | users:read |
|
| Admin | PUT |
/users/admin/update/:id |
Update user details | users:update |
|
| Admin | DELETE |
/users/admin/delete/:id |
Delete user | users:delete |
|
| Admin | POST |
/users/admin/:userId/enroll |
Enroll student into course | users:enroll |
|
| Professors | Admin | POST |
/professors/admin/create |
Create professor | professors:create |
| Admin | GET |
/professors/admin/get-all |
List professors | professors:read |
|
| Admin | GET |
/professors/admin/search |
Search professors | professors:search |
|
| Admin | GET |
/professors/admin/get-one/:id |
Get professor details | professors:read |
|
| Admin | PUT |
/professors/admin/update/:id |
Update professor | professors:update |
|
| Admin | DELETE |
/professors/admin/delete/:id |
Delete professor | professors:delete |
|
| Courses | User | GET |
/courses/user/get-all |
List public courses | Public / Auth |
| User | GET |
/courses/user/get-one/:id |
Get public course details | Public / Auth | |
| Admin | POST |
/courses/admin/create |
Create new course | courses:create |
|
| Admin | GET |
/courses/admin/get-all |
List all courses | courses:read |
|
| Admin | GET |
/courses/admin/search |
Search courses | courses:search |
|
| Admin | GET |
/courses/admin/get-one/:id |
Get course by ID | courses:read |
|
| Admin | PUT |
/courses/admin/update/:id |
Update course details | courses:update |
|
| Admin | DELETE |
/courses/admin/delete/:id |
Delete course | courses:delete |
|
| Classes | User | GET |
/classes/user/my-classes |
View enrolled student classes | Authenticated |
| Admin | POST |
/classes/admin/create |
Create class section | classes:create |
|
| Admin | GET |
/classes/admin/get-all |
List class sections | classes:read |
|
| Admin | GET |
/classes/admin/search |
Search class sections | classes:search |
|
| Admin | GET |
/classes/admin/get-one/:id |
Get class details | classes:read |
|
| Admin | PUT |
/classes/admin/update/:id |
Update class details | classes:update |
|
| Admin | DELETE |
/classes/admin/delete/:id |
Delete class section | classes:delete |
|
| Admin | PUT |
/classes/admin/:id/registered-users |
Edit registered users list | classes:register_users |
|
| Sessions | User | GET |
/sessions/user/my-sessions |
Enrolled student sessions | Authenticated |
| Admin | POST |
/sessions/admin/create |
Schedule session | sessions:create |
|
| Admin | GET |
/sessions/admin/get-all |
List sessions | sessions:read |
|
| Admin | GET |
/sessions/admin/search |
Search sessions | sessions:search |
|
| Admin | GET |
/sessions/admin/get-one/:id |
Get session details | sessions:read |
|
| Admin | PUT |
/sessions/admin/update/:id |
Update/Cancel session | sessions:update |
|
| Admin | DELETE |
/sessions/admin/delete/:id |
Delete session | sessions:delete |
|
| Admin | PUT |
/sessions/admin/:id/attendance |
Record session attendance list | sessions:attendance |
|
| Payments | User | GET |
/payments/user/my-payments |
View user payments | Authenticated |
| User | POST |
/payments/user/pay/:id |
Add payment transaction | Authenticated | |
| Admin | POST |
/payments/admin/create |
Create payment ledger | payments:create |
|
| Admin | GET |
/payments/admin/get-all |
List payments | payments:read |
|
| Admin | GET |
/payments/admin/search |
Search payments | payments:search |
|
| Admin | GET |
/payments/admin/get-one/:id |
Get payment details | payments:read |
|
| Admin | PUT |
/payments/admin/update/:id |
Update payment details | payments:update |
|
| Admin | DELETE |
/payments/admin/delete/:id |
Delete payment ledger | payments:delete |
|
| Roles | Admin | POST |
/roles/admin/create |
Create custom role | roles:create |
| Admin | GET |
/roles/admin/get-all |
List custom roles | roles:read |
|
| Admin | GET |
/roles/admin/search |
Search roles | roles:search |
|
| Admin | GET |
/roles/admin/get-one/:id |
Get role by ID | roles:read |
|
| Admin | PUT |
/roles/admin/update/:id |
Update role permissions | roles:update |
|
| Admin | DELETE |
/roles/admin/delete/:id |
Delete non-system role | roles:delete |
|
| Notifications | User | GET |
/notifications/user/my-notifications |
View received notifications | Authenticated |
| Admin | POST |
/notifications/admin/create |
Send notification | notifications:create |
|
| Admin | GET |
/notifications/admin/get-all |
List all notifications | notifications:read |
|
| Admin | GET |
/notifications/admin/search |
Search notifications | notifications:search |
|
| Admin | GET |
/notifications/admin/get-one/:id |
Get notification by ID | notifications:read |
|
| Admin | PUT |
/notifications/admin/update/:id |
Update notification | notifications:update |
|
| Admin | DELETE |
/notifications/admin/delete/:id |
Delete notification | notifications:delete |
|
| Admin | POST |
/notifications/admin/:id/retry |
Manually retry failed dispatch | notifications:retry |
|
| Certificates | User | GET |
/certificates/user/my-certificates |
View personal certificates | certificates:read |
| User | POST |
/certificates/user/upload |
Upload & commit certificate | files:upload |
|
| Admin | POST |
/certificates/admin/create |
Issue official certificate | certificates:create |
|
| Admin | GET |
/certificates/admin/get-all |
List all certificates | certificates:read |
|
| Admin | GET |
/certificates/admin/search |
Search certificates | certificates:search |
|
| Admin | GET |
/certificates/admin/get-one/:id |
Get certificate details | certificates:read |
|
| Admin | PUT |
/certificates/admin/update/:id |
Update certificate | certificates:update |
|
| Admin | DELETE |
/certificates/admin/delete/:id |
Delete certificate | certificates:delete |
Verification
Check code syntax:
node --check app.js && node --check seed.js
Languages
JavaScript
99.8%
Dockerfile
0.2%