Source: server.js

#!/usr/bin/env node
/**
 * Hello World Express server
 * Provides REST API endpoints for greetings with multi-language support
 * @author Development Team
 * @version 1.0.0
 */

const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
const { GreetingService } = require('./hello');

// Initialize Express app
const app = express();
const port = process.env.PORT || 8000;
const host = process.env.HOST || '127.0.0.1';

// Initialize greeting service
const greetingService = new GreetingService();

// Middleware
app.use(helmet()); // Security headers
app.use(cors()); // Enable CORS
app.use(morgan('combined')); // Logging
app.use(express.json()); // Parse JSON bodies
app.use(express.urlencoded({ extended: true })); // Parse URL-encoded bodies

/**
 * Root endpoint - greeting with query parameters
 * @route GET /
 * @param {string} [name=World] - Name to greet
 * @param {string} [language=en] - Language code
 * @returns {Object} Greeting response
 */
app.get('/', (req, res) => {
  try {
    const { name = 'World', language = 'en' } = req.query;
    const data = greetingService.createGreetingData(name, language);
    res.json(data);
  } catch (error) {
    res.status(500).json({
      error: 'Internal Server Error',
      message: error.message
    });
  }
});

/**
 * Greeting endpoint - same as root
 * @route GET /greet
 * @param {string} [name=World] - Name to greet
 * @param {string} [language=en] - Language code
 * @returns {Object} Greeting response
 */
app.get('/greet', (req, res) => {
  try {
    const { name = 'World', language = 'en' } = req.query;
    const data = greetingService.createGreetingData(name, language);
    res.json(data);
  } catch (error) {
    res.status(500).json({
      error: 'Internal Server Error',
      message: error.message
    });
  }
});

/**
 * Health check endpoint
 * @route GET /health
 * @returns {Object} Health status
 */
app.get('/health', (req, res) => {
  res.json({
    status: 'healthy',
    version: '1.0.0',
    uptime: process.uptime(),
    timestamp: new Date().toISOString(),
    node_version: process.version,
    memory: process.memoryUsage()
  });
});

/**
 * Get available languages
 * @route GET /languages
 * @returns {string[]} Array of language codes
 */
app.get('/languages', (req, res) => {
  try {
    const languages = greetingService.getAvailableLanguages();
    res.json(languages);
  } catch (error) {
    res.status(500).json({
      error: 'Internal Server Error',
      message: error.message
    });
  }
});

/**
 * Get information about a specific language
 * @route GET /languages/:language
 * @param {string} language - Language code
 * @returns {Object} Language information
 */
app.get('/languages/:language', (req, res) => {
  try {
    const { language } = req.params;
    
    if (!greetingService.isLanguageSupported(language)) {
      return res.status(404).json({
        error: 'Language Not Found',
        message: `Language '${language}' is not supported`
      });
    }
    
    const template = greetingService.greetings[language];
    const example = greetingService.greet('World', language);
    
    res.json({
      language,
      template,
      example,
      supported: true
    });
  } catch (error) {
    res.status(500).json({
      error: 'Internal Server Error',
      message: error.message
    });
  }
});

/**
 * API documentation endpoint
 * @route GET /api-docs
 * @returns {Object} API documentation
 */
app.get('/api-docs', (req, res) => {
  const baseUrl = `${req.protocol}://${req.get('host')}`;
  
  res.json({
    title: 'Hello World API',
    version: '1.0.0',
    description: 'A simple greeting API with multi-language support',
    baseUrl,
    endpoints: [
      {
        method: 'GET',
        path: '/',
        description: 'Generate a greeting',
        parameters: [
          { name: 'name', type: 'string', default: 'World', description: 'Name to greet' },
          { name: 'language', type: 'string', default: 'en', description: 'Language code' }
        ]
      },
      {
        method: 'GET',
        path: '/greet',
        description: 'Generate a greeting (same as /)',
        parameters: [
          { name: 'name', type: 'string', default: 'World', description: 'Name to greet' },
          { name: 'language', type: 'string', default: 'en', description: 'Language code' }
        ]
      },
      {
        method: 'GET',
        path: '/health',
        description: 'Health check endpoint',
        parameters: []
      },
      {
        method: 'GET',
        path: '/languages',
        description: 'Get available languages',
        parameters: []
      },
      {
        method: 'GET',
        path: '/languages/:language',
        description: 'Get information about a specific language',
        parameters: [
          { name: 'language', type: 'string', description: 'Language code' }
        ]
      }
    ],
    examples: [
      `${baseUrl}/`,
      `${baseUrl}/greet?name=Node.js&language=es`,
      `${baseUrl}/health`,
      `${baseUrl}/languages`,
      `${baseUrl}/languages/fr`
    ]
  });
});

/**
 * 404 handler
 */
app.use('*', (req, res) => {
  res.status(404).json({
    error: 'Not Found',
    message: 'The requested endpoint does not exist',
    available_endpoints: [
      '/',
      '/greet',
      '/health',
      '/languages',
      '/languages/:language',
      '/api-docs'
    ]
  });
});

/**
 * Error handler
 */
app.use((error, req, res, next) => {
  console.error('Error:', error);
  res.status(500).json({
    error: 'Internal Server Error',
    message: error.message
  });
});

/**
 * Start server
 */
if (require.main === module) {
  app.listen(port, host, () => {
    console.log(`🚀 Node.js Hello World server running on http://${host}:${port}`);
    console.log(`📚 API documentation: http://${host}:${port}/api-docs`);
    console.log(`❤️  Health check: http://${host}:${port}/health`);
    console.log('');
    console.log('Available endpoints:');
    console.log(`  GET /         - Greeting endpoint`);
    console.log(`  GET /greet    - Greeting endpoint`);
    console.log(`  GET /health   - Health check`);
    console.log(`  GET /languages - Available languages`);
    console.log('');
    console.log('Press Ctrl+C to stop the server');
  });
}

module.exports = app;