This repository contains the backend system for UpBox, a cloud storage platform inspired by Google Drive.
It is responsible for:
- Authentication & authorization
- File & folder management
- Multipart upload handling (AWS S3)
- Upload session tracking
- Real-time updates using Server-Sent Events (SSE)
- Search functionality (MongoDB Atlas Search)
- Background processing via AWS Lambda
Client (React / Next.js)
β
βΌ
Express API Server (Node.js)
β
ββββββββΌβββββββββββ
β β β
βΌ βΌ βΌ
MongoDB AWS S3 SSE Server
(Atlas) (Storage) (Realtime)
β
βΌ
AWS Lambda (Event Processing)
src/
βββ controllers/ # Handles request/response logic
βββ services/ # Business logic layer
βββ middlewares/ # Auth, validation, error handling
βββ models/ # Mongoose schemas
βββ routes/ # API routes
βββ utils/
β βββ sse/ # SSE connection + broadcast manager
β βββ aws/ # S3 helpers (multipart, presigned URLs)
βββ config/ # DB & environment configs
- JWT-based authentication
- Middleware-protected routes
- User-level data isolation (
userIDenforced across all queries)
User Login/Register
β
JWT issued
β
Protected routes validate token
β
UserID injected into request
- Efficient large file uploads
- Supports resume
- Parallel chunk uploads
1. Client β Create upload session
2. Backend β Generate uploadId (S3), Metadata in DB
3. Client β Request presigned URL per chunk
4. Client β Upload chunks directly to S3
5. Backend β Track uploaded parts
6. Backend β Complete multipart upload
POST /user/uploadfileΒ β Create upload session, File MetadataGET /user/``file/:fileIDΒ β Get presigned URLPOST /user``/uploadfile/initiateβ Save uploaded chunk infoPOST /user/upload/completeβ Finalize upload
Schema: UploadSession
Tracks:
- uploadId
- fileID
- uploadedParts
- chunkSize
- totalParts
- Resume uploads
- Prevent data loss
- Track upload progress
- Nested folder hierarchy
- Path tracking (
pathIds,pathNames) - Copy / Paste (recursive cloning)
- Duplicate handling (auto rename)
- filename
- storagePath
- parentID
- pathIds
- pathNames
- size, type
- status
- name
- parentID
- pathIds
- pathNames
- Lightweight
- One-way real-time updates
- Perfect for upload events
Client connects β /connection/:userID
β
Server stores connection
β
Events triggered (upload, folder, etc.)
β
Server pushes updates to client
file_uploadedfolder_createdfolder_uploadedfile_renamed
- Full-text search
- Autocomplete
- Fast indexed queries
- User-isolated results
$search:
compound:
must β autocomplete/text
filter β userID
- Multipart upload
- Pre-signed URLs
- Direct client uploads
Used for:
- Post-file upload processing
- Metadata extraction
- Notifying backend via webhook
- Metadata stored first
- Files uploaded individually
- Supports partial success
- Status-based tracking (
pending,completed,failed)
- Reduces backend load
- Improves scalability
- Enables resume functionality
- Keeps upload state consistent
- Simpler than WebSockets
- Ideal for event-based updates
- Controllers β request/response
- Services β business logic
- Chunked uploads
- Indexed search (Atlas Search)
- Parallel upload support
- SSE instead of polling
- JWT authentication
- User-scoped queries
- Pre-signed URL expiration
- Validation middleware
git clone <repo-url>
cd upbox-backend
npm installPORT=
MONGO_URI=
JWT_SECRET=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
S3_BUCKET_NAME=
npm start