A secure, scalable backend API for the Open Era Hackathon submission system built with Node.js, TypeScript, Express, Prisma, and PostgreSQL.
- Secure Submission System: Accept and manage hackathon submissions with duplicate prevention
- Admin Dashboard API: Complete CRUD operations for submission management
- JWT Authentication: Secure admin authentication with refresh token rotation
- Comprehensive Audit Logging: Track all system activities and changes
- Rate Limiting: Protect against spam and abuse
- IP Tracking: Monitor submission sources and prevent fraud
- API Documentation: Interactive Swagger/OpenAPI documentation
- Docker Support: Containerized deployment ready
- Health Monitoring: Health check endpoints for system monitoring
- Runtime: Node.js 18+ with TypeScript
- Framework: Express.js
- Database: PostgreSQL with Prisma ORM
- Authentication: JWT with refresh tokens
- Validation: express-validator with custom schemas
- Security: helmet, cors, rate limiting, bcrypt
- Documentation: Swagger/OpenAPI 3.0
- Containerization: Docker & Docker Compose
- Logging: Custom Winston-based logger
- Node.js 18 or higher
- PostgreSQL 12 or higher
- Docker & Docker Compose (optional but recommended)
- npm or yarn package manager
-
Clone the repository
git clone <repository-url> cd openera-backend
-
Start with Docker Compose
# For development npm run docker:dev # For production npm run docker:prod
-
Setup database and seed admin
npm run db:migrate npm run db:seed
-
Access the API
- API Base URL: http://localhost:3000
- Documentation: http://localhost:3000/docs
- Health Check: http://localhost:3000/ping
-
Install dependencies
npm install
-
Setup environment variables
cp .env.example .env # Edit .env with your configuration -
Setup database
# Start PostgreSQL (if not using Docker) npm run db:migrate npm run db:seed -
Start development server
npm run dev:watch
Create a .env file based on .env.example:
# Server Configuration
PORT=3000
NODE_ENV=development
# Database
DATABASE_URL=postgresql://username:password@localhost:5432/openera_hackathon
# JWT Configuration
JWT_SECRET=your_super_secure_jwt_secret_key_here
JWT_REFRESH_SECRET=your_super_secure_refresh_secret_key_here
JWT_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d
# Admin Configuration
ADMIN_EMAIL=admin@openera.com
ADMIN_PASSWORD=SecureAdminPassword123!
ADMIN_NAME=System Administrator
# Security
CORS_ORIGIN=http://localhost:3000,https://openera.openlearn.org.in
BCRYPT_ROUNDS=12
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
SUBMISSION_RATE_LIMIT_MAX=5
SUBMISSION_RATE_LIMIT_WINDOW_MS=3600000
# Logging
LOG_LEVEL=info
LOG_FILE=logs/openera.logVisit /docs endpoint for interactive Swagger UI documentation.
POST /api/v1/submissions- Create new submissionGET /api/v1/submissions- List submissions (Admin)GET /api/v1/submissions/:id- Get submission details (Admin)PUT /api/v1/submissions/:id- Update submission (Admin)DELETE /api/v1/submissions/:id- Delete submission (Admin)PATCH /api/v1/submissions/:id/status- Update submission status (Admin)
POST /api/v1/auth/login- Admin loginPOST /api/v1/auth/refresh- Refresh access tokenPOST /api/v1/auth/logout- Admin logoutPUT /api/v1/auth/change-password- Change admin passwordGET /api/v1/auth/profile- Get admin profile
GET /api/v1/audit- List audit logs (Admin)GET /api/v1/audit/submission/:id- Get submission audit logs (Admin)GET /api/v1/audit/admin/:id- Get admin activity logs (Admin)GET /api/v1/audit/stats- Get audit statistics (Admin)
GET /ping- Basic health checkGET /api/v1/health- System health checkGET /api/v1/health/detailed- Detailed system informationGET /api/v1/health/db- Database connectivity check
- JWT-based authentication for admin users
- Refresh token rotation for enhanced security
- Role-based access control
- Password hashing with bcrypt (12 rounds)
- Global rate limiting: 100 requests per 15 minutes
- Submission rate limiting: 5 submissions per hour per IP
- Admin endpoint rate limiting: Enhanced protection for admin operations
- Dynamic rate limiting based on endpoint sensitivity
- Input validation and sanitization
- SQL injection prevention with Prisma
- XSS protection with helmet
- CORS configuration for cross-origin requests
- IP address tracking and logging
- Comprehensive logging of all admin actions
- Submission tracking and history
- IP address and user agent logging
- Automatic audit log creation for sensitive operations
- Admin: Administrator users with authentication
- Submission: Hackathon project submissions
- AuditLog: System activity tracking
- RefreshToken: JWT refresh token management
- Email uniqueness for submissions (prevents duplicates)
- Automatic timestamp tracking
- Soft delete support for submissions
- Comprehensive audit trail relationships
/ping- Basic server responsiveness/api/v1/health- Comprehensive system health/api/v1/health/db- Database connectivity- Docker health checks included
- Structured logging with Winston
- Request/response logging
- Error tracking and reporting
- Audit trail logging
- Configurable log levels
# Build and deploy
docker-compose up -d
# Check logs
docker-compose logs -f
# Scale services
docker-compose up -d --scale app=3# Build application
npm run build
# Start production server
npm start- Enhanced logging and debugging
- CORS enabled for localhost
- Database migrations run automatically
- Optimized for performance
- Security headers enforced
- Rate limiting strictly enforced
- Health checks enabled
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coveragenpm run dev- Start development servernpm run dev:watch- Start development server with auto-reloadnpm run build- Build production applicationnpm start- Start production servernpm run db:migrate- Run database migrationsnpm run db:seed- Seed database with admin usernpm run db:studio- Open Prisma Studionpm run docker:dev- Start development Docker environmentnpm run docker:prod- Start production Docker environmentnpm run setup:dev- Complete development setup
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.