AIMS 2.0 is a modern educational platform designed for managing academic materials, user access, and class assignments. Built with Next.js, Clerk, Firebase, MongoDB, and Resend, it provides secure and efficient access to course documents for students, teachers, and administrators.
- User Access Management: Role-based access (admin, teacher, student) with request/approval system
- Admin Dashboard: Manage user roles, upload PDFs, and assign materials by class/subject
- Student Dashboard: Access course documents filtered by class and subject
- Security: CAPTCHA, rate limiting, access control, JWT authentication, email alerts
- Document Management: Efficient upload, retrieval, and rendering using MongoDB GridFS
| Layer | Technology |
|---|---|
| Frontend | Next.js, React, TypeScript, Tailwind CSS |
| Authentication | Clerk + Firebase Authentication |
| Database | MongoDB (with GridFS), Firebase Firestore |
| Storage | Firebase Storage, MongoDB GridFS |
| Backend | Next.js API Routes, Firebase Admin SDK |
| Resend API | |
| Hosting | Vercel, MongoDB Atlas |
- Access Request:
- New users request access via
/request-access
- New users request access via
- Admin Review:
- Admin approves/rejects requests and assigns class/subject
- PDFs uploaded via the admin dashboard
- Student Access:
- Approved users sign in and access study materials at
/study
- Approved users sign in and access study materials at
- Authentication: Firebase Auth + Clerk, JWT sessions, CAPTCHA protection
- Role-based Access: Distinct access for admins, teachers, and students
- Secure Document Streaming: GridFS streaming with access control
- API Protections: Input validation, method filtering, error shielding
- Firebase Authentication + Clerk: User registration, login, and session handling
- Role Assignment: Managed via Firestore and Firebase Admin SDK
- MongoDB + GridFS: Secure, scalable file storage with metadata for class/subject association
- In-browser PDF Viewing: Via
pdf.jsfor seamless access
graph TD
A[User Login] --> B[Clerk/Firebase Auth]
B --> C[Retrieve Role]
C --> D[Grant Role-Based Access]
graph TD
A[Upload PDF] --> B[Assign Class & Subject]
B --> C[Store File in GridFS]
C --> D[Save Metadata in MongoDB]
graph TD
A[Student Login] --> B[Retrieve Class/Subject]
B --> C[Query MongoDB]
C --> D[Display PDF List]
βββ components/ # Reusable UI components
βββ pages/ # Route-based views & API endpoints
βββ public/ # Static assets
βββ utils/ # Utility functions (Firebase, MongoDB, etc.)
βββ styles/ # Tailwind + global styles
Create a .env.local file with the following variables:
# Firebase Client SDK
NEXT_PUBLIC_FIREBASE_API_KEY=...
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=...
NEXT_PUBLIC_FIREBASE_PROJECT_ID=...
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=...
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=...
NEXT_PUBLIC_FIREBASE_APP_ID=...
# Firebase Admin SDK
FIREBASE_CLIENT_EMAIL=[email protected]
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
MIIEvgIBADANB...
-----END PRIVATE KEY-----"
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=...
CLERK_SECRET_KEY=...
# MongoDB
MONGODB_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/aims
MONGODB_DB_NAME=aimsDB
# Email & CAPTCHA
RESEND_API_KEY=...
RESEND_FROM_EMAIL=...
ADMIN_EMAIL=...
NEXT_PUBLIC_HCAPTCHA_SITE_KEY=...
HCAPTCHA_SECRET_KEY=...
# Site URL
NEXT_PUBLIC_SITE_URL=http://localhost:3000
β οΈ EnsureFIREBASE_PRIVATE_KEYuses actual line breaks in Vercel or local.env.
npm install
npm run dev- App runs on:
http://localhost:3000
- Platform: Vercel
- Database: MongoDB Atlas
- Auth Services: Firebase Console + Clerk Dashboard
Health check API endpoints:
| Endpoint | Purpose |
|---|---|
/api/admin/health-check |
Firebase Admin SDK status check |
/api/admin/firebase-env-check |
Validates Firebase environment vars |
/api/admin/debug-user |
Inspect user data & roles |
/api/admin/fix-user-role |
Fix incorrect roles manually |
| Problem | Solution |
|---|---|
| Firebase Admin SDK errors | Check FIREBASE_PRIVATE_KEY formatting (line breaks required) |
| Access denied to PDFs | Verify Firestore rules and MongoDB permissions |
| Role or access issues | Use /debug-user and /fix-user-role APIs |
Built with β€οΈ using:
