kavehhn 8cd355c24b Fix transaction due date parsing and preserve edited pending amounts.
Parse Jalali date strings correctly when saving transactions, and skip
reconcile amount overwrites when pending totals already match the balance.
2026-08-16 14:53:46 +03:30

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:
      1. Upload: User/Admin uploads file to POST /files/user/upload-temp (or /files/admin/upload-temp), streaming directly to S3_TEMP_BUCKET. Returns tempFileName.
      2. Commit: When submitting changes (e.g. creating/updating Certificate), the server copies the file from S3_TEMP_BUCKET to S3_STORAGE_BUCKET and removes the temp file.
    • Daily Temp Bucket Cleanup: Scheduled cron job running daily at 3:00 AM (tempBucketCleanupJob), deleting files in S3_TEMP_BUCKET older than 10 minutes.
  • Courses & Classes:
    • Each Course can contain multiple Class sections (e.g. "AutoDesk Farvardin A", "AutoDesk Farvardin B").
    • Each Class maintains a registeredUsers array.
  • Sessions & Attendance:
    • Embedded attendanceList array inside each Session model.
  • Strict Layered Architecture: RouterControllerServiceModel per 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
S
Description
No description provided
Readme
377 KiB
Languages
JavaScript 99.8%
Dockerfile 0.2%