Skip to content

MertBaran/QA-API

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Question & Answers Platform API

Prerequisites

  • Node.js 18+
  • MongoDB 6+
  • Redis 7+
  • Elasticsearch 8+
  • RabbitMQ 3.9+

Installation

# Clone repository
git clone <repo-url> && cd QA-API

# Install dependencies
npm install

# Environment setup
cp config/env/config.env.example config/env/config.env
# Edit config.env with your settings

# Setup notification templates
npm run setup:templates

# Start development server
npm run dev

Docker Setup

# Build and run with Docker Compose
docker-compose up -d

# Or build manually
docker build -t qa-api .
docker run -p 3000:3000 --env-file config/env/config.env qa-api

API Endpoints

Looking for a Postman collection? Find it in the postman/ directory.

# Import the collection into Postman
postman/QA-API.postman_collection.json

The collection includes all API endpoints, request examples, and automatic token management. Just update the baseUrl variable if needed.

Authentication

POST   /api/auth/register                   # User registration
POST   /api/auth/login                      # User login (auto-saves token)
POST   /api/auth/loginGoogle                # Google OAuth login
GET    /api/auth/logout                     # User logout
POST   /api/auth/forgotpassword             # Password reset request
PUT    /api/auth/resetpassword              # Password reset
GET    /api/auth/profile                    # Get user profile
PUT    /api/auth/edit                       # Edit user profile
POST   /api/auth/upload                     # Upload profile image
GET    /api/auth/check-admin-permissions    # Check admin permissions

Questions

GET    /api/questions                  # List all questions
GET    /api/questions/paginated        # Get paginated questions (with filters, search, sort)
GET    /api/questions/:id              # Get question details
GET    /api/questions/user/:userId     # Get questions by user
GET    /api/questions/parent/:id       # Get questions related to a parent content
POST   /api/questions/ask              # Create question (with optional parentContentId)
PUT    /api/questions/:id/edit         # Update question
DELETE /api/questions/:id/delete       # Delete question
GET    /api/questions/:id/like         # Like question
GET    /api/questions/:id/undo_like    # Unlike question
GET    /api/questions/:id/dislike      # Dislike question
GET    /api/questions/:id/undo_dislike # Undo dislike question

Answers

GET    /api/questions/:question_id/answers              # Get all answers for a question
GET    /api/questions/:question_id/answers/:answer_id   # Get specific answer
POST   /api/questions/:question_id/answers              # Add answer to question
PUT    /api/questions/:question_id/answers/:answer_id/edit    # Update answer
DELETE /api/questions/:question_id/answers/:answer_id/delete  # Delete answer
GET    /api/questions/:question_id/answers/:answer_id/like    # Like answer
GET    /api/questions/:question_id/answers/:answer_id/undo_like # Unlike answer
GET    /api/questions/:question_id/answers/:answer_id/dislike  # Dislike answer
GET    /api/questions/:question_id/answers/:answer_id/undo_dislike # Undo dislike answer
GET    /api/answers/:id                      # Get answer by ID (standalone)
GET    /api/answers/user/:userId             # Get answers by user

Notifications (Admin Only)

POST   /api/notifications/user/:userId              # Send notification to user
POST   /api/notifications/channels                  # Send notification to specific channels
GET    /api/notifications/user/:userId              # Get user notifications
GET    /api/notifications/preferences/:userId       # Get user notification preferences
PUT    /api/notifications/preferences/:userId       # Update user notification preferences
POST   /api/notifications/test/:userId              # Send test notification (all channels)
GET    /api/notifications/debug/:userId             # Debug notifications
GET    /api/notifications/queue/status              # Get queue status
GET    /api/notifications/stats                     # Get notification statistics

Bookmarks

POST   /api/bookmarks/add                                    # Add bookmark
DELETE /api/bookmarks/remove/:id                             # Remove bookmark
PUT    /api/bookmarks/:id                                    # Update bookmark
GET    /api/bookmarks/user                                   # Get user bookmarks
GET    /api/bookmarks/check/:targetType/:targetId            # Check if bookmark exists
GET    /api/bookmarks/search                                 # Search bookmarks
GET    /api/bookmarks/paginated                              # Get paginated bookmarks
POST   /api/bookmarks/collections                            # Create collection
GET    /api/bookmarks/collections                            # Get user collections
PUT    /api/bookmarks/collections/:id                        # Update collection
DELETE /api/bookmarks/collections/:id                        # Delete collection
POST   /api/bookmarks/collections/:collectionId/items/:bookmarkId   # Add to collection
DELETE /api/bookmarks/collections/:collectionId/items/:bookmarkId  # Remove from collection
GET    /api/bookmarks/collections/:id/items                  # Get collection items
GET    /api/bookmarks/stats                                  # Get bookmark statistics

Users

GET    /api/public/users/:id           # Get public user profile (no auth required)
GET    /api/users                      # List all users (Admin only)
GET    /api/users/:id                  # Get user details (Admin only)

Admin Operations

GET    /api/admin/users                           # List all users (Admin only)
PUT    /api/admin/users/:userId                   # Update user (Admin only)
DELETE /api/admin/users/:userId                   # Delete user (Admin only)
PATCH  /api/admin/users/:userId/block             # Toggle user block status (Admin only)
PATCH  /api/admin/users/:userId/roles             # Update user roles (Admin only)
GET    /api/admin/users/stats                     # Get user statistics (Admin only)

Permission Management (Admin Only)

GET    /api/permissions/roles                     # List all roles
POST   /api/permissions/assign-role               # Assign role to user
DELETE /api/permissions/remove-role               # Remove role from user
GET    /api/permissions/user-roles/:userId        # Get user roles
GET    /api/permissions/permissions               # List all permissions
POST   /api/permissions/role-permissions          # Add permissions to role
DELETE /api/permissions/role-permissions          # Remove permissions from role
GET    /api/permissions/user-permissions/:userId  # Get user permissions

Health & Monitoring

GET    /health                         # Full health check (no auth)
GET    /health/quick                   # Quick health check (no auth)
GET    /api/monitoring/connections     # Connection status (Admin only)
GET    /api/monitoring/alerts          # Alert history (Admin only)
GET    /api/monitoring/stats           # Monitoring statistics (Admin only)
POST   /api/monitoring/start           # Start monitoring (Admin only)
POST   /api/monitoring/stop            # Stop monitoring (Admin only)

WebSocket Endpoints

WS     /ws/monitoring                  # Real-time monitoring updates

Testing

# All tests (excluding API tests)
npm test                              # Run all tests
npm run test:watch                    # Watch mode
npm run test:coverage                 # Coverage report

# Specific test suites
npm run test:unit                     # Unit tests only
npm run test:integration              # Integration tests only
npm run test:websocket                # WebSocket tests

# Performance tests
npm run test:performance              # k6 performance tests
npm run test:load                     # Load testing
npm run test:stress                   # Stress testing

# Test utilities
npm run test:setup                    # Setup test environment
npm run test:clean                    # Clean test data

Configuration

Environment Variables

# Server
PORT=3000
NODE_ENV=development

# Database
MONGO_URI=mongodb://localhost:27017/qa-platform
MONGO_TEST_URI=mongodb://localhost:27017/qa-platform-test

# Redis
REDIS_URL=redis://localhost:6379
REDIS_TEST_URL=redis://localhost:6379

# JWT
JWT_SECRET_KEY=your-super-secret-jwt-key
JWT_REFRESH_SECRET_KEY=your-super-secret-refresh-key
JWT_EXPIRES_IN=1h
JWT_REFRESH_EXPIRES_IN=7d

# Google OAuth
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret

# Email (SMTP)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM=noreply@yourdomain.com

# RabbitMQ
RABBITMQ_URL=amqp://localhost:5672
RABBITMQ_QUEUE=notifications

# Elasticsearch
ELASTICSEARCH_ENABLED=true
ELASTICSEARCH_URL=http://localhost:9200
ELASTICSEARCH_USERNAME=elastic
ELASTICSEARCH_PASSWORD=elasticpassword

# Notification Settings
NOTIFICATION_STRATEGY=smart        # direct, queue, smart
NOTIFICATION_CHANNELS=email,sms    # email,sms,push,webhook
NOTIFICATION_TEMPLATE_LANG=en      # en,tr,de

# Monitoring Settings
MONITORING_ENABLED=true            # Enable monitoring
MONITORING_INTERVAL=30000          # Check interval (30s)
MONITORING_ALERT_LIMIT=50          # Max alerts to store
WEBSOCKET_PORT=3001                # WebSocket server port

# Logging
LOG_LEVEL=info                     # error, warn, info, debug
LOG_FORMAT=json                    # json, simple

# Performance
CACHE_TTL=3600                     # Cache TTL in seconds
RATE_LIMIT_WINDOW=900000           # Rate limit window (15 min)
RATE_LIMIT_MAX=100                 # Max requests per window

Health Check Configuration

// Health check types
GET /health/quick    // Fast check - basic service status
GET /health          // Full check - detailed service information

// Health check response format
{
  "status": "healthy" | "unhealthy" | "starting",
  "timestamp": "2024-01-01T00:00:00.000Z",
  "services": {
    "database": { "status": "connected", "responseTime": 15 },
    "cache": { "status": "connected", "responseTime": 5 },
    "search": { "status": "connected", "responseTime": 10 },
    "queue": { "status": "connected", "responseTime": 10 },
    "email": { "status": "connected", "responseTime": 25 }
  }
}

🐳 Docker & Deployment

Docker Compose

version: '3.8'
services:
  api:
    build: .
    ports:
      - '3000:3000'
      - '3001:3001' # WebSocket port
    environment:
      - NODE_ENV=production
    depends_on:
      - mongodb
      - redis
      - elasticsearch
      - rabbitmq

  mongodb:
    image: mongo:6
    ports:
      - '27017:27017'
    volumes:
      - mongodb_data:/data/db

  redis:
    image: redis:7-alpine
    ports:
      - '6379:6379'

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    ports:
      - '9200:9200'
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=elasticpassword
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data

  rabbitmq:
    image: rabbitmq:3.9-management
    ports:
      - '5672:5672'
      - '15672:15672'

Project Structure

QA-API/
β”œβ”€β”€ config/                         # Configuration files
β”‚   └── env/                       # Environment configurations
β”œβ”€β”€ constants/                      # Application constants
β”œβ”€β”€ controllers/                    # Request handlers
β”œβ”€β”€ services/                       # Business logic
β”‚   β”œβ”€β”€ managers/                  # Business managers
β”‚   └── contracts/                 # Service contracts/interfaces
β”œβ”€β”€ repositories/                   # Data access layer
β”‚   β”œβ”€β”€ interfaces/                # Repository interfaces
β”‚   └── mongodb/                   # MongoDB implementations
β”œβ”€β”€ models/                         # Data models
β”‚   └── mongodb/                   # MongoDB models
β”œβ”€β”€ middlewares/                    # Express middlewares
β”‚   β”œβ”€β”€ authorization/             # Authorization middleware
β”‚   └── errors/                    # Error handling
β”œβ”€β”€ infrastructure/                 # External services & infrastructure
β”‚   β”œβ”€β”€ cache/                     # Cache providers
β”‚   β”œβ”€β”€ elasticsearch/             # Elasticsearch integration
β”‚   β”œβ”€β”€ search/                    # Search & Index (abstraction of elastic)
β”‚   β”œβ”€β”€ logging/                   # Logging providers
β”‚   └── validation/                # Validation schemas
β”œβ”€β”€ database/                       # Database utilities
β”‚   β”œβ”€β”€ migrations/                # Database migrations
β”‚   └── seeds/                     # Seed data
β”œβ”€β”€ routers/                        # API route definitions
β”œβ”€β”€ types/                          # TypeScript type definitions
β”‚   └── dto/                       # Data Transfer Objects
β”œβ”€β”€ tests/                          # Test suites
β”‚   β”œβ”€β”€ unit/                      # Unit tests
β”‚   β”œβ”€β”€ integration/               # Integration tests
β”‚   └── mocks/                     # Test mocks
β”œβ”€β”€ scripts/                        # Utility scripts
β”œβ”€β”€ performance/                    # Performance testing
β”œβ”€β”€ k8s/                            # Kubernetes configurations
└── public/                         # Public assets

Tech Stack

  • Backend: TypeScript, Node.js, Express
  • Database: MongoDB with Mongoose
  • Cache: Redis
  • Search: Elasticsearch
  • Message Queue: RabbitMQ
  • Testing: Jest
  • Containerization: Docker
  • Real-time: WebSocket

TypeScript Node.js MongoDB Redis Elasticsearch RabbitMQ Jest Docker WebSocket