# Development Manual - Adding Features Complete guide for extending your Node.js Multi-API application at api.app.lobott.com ## 📡 Adding New API Endpoints ### 1. Add to API Routes Edit `routes/api.js` to add new endpoints: ```javascript // Example: Adding a new products API router.get('/products', (req, res) => { const { category, limit } = req.query; let filteredProducts = products; // Your data source if (category) { filteredProducts = products.filter(p => p.category === category); } if (limit) { filteredProducts = filteredProducts.slice(0, parseInt(limit)); } res.json({ success: true, count: filteredProducts.length, data: filteredProducts }); }); router.get('/products/:id', (req, res) => { const product = products.find(p => p.id === parseInt(req.params.id)); if (!product) { return res.status(404).json({ success: false, message: 'Product not found' }); } res.json({ success: true, data: product }); }); ``` ### 2. Update API Overview Update the main API endpoint in `routes/api.js`: ```javascript router.get('/', (req, res) => { res.json({ message: 'Multi-API Server', version: '1.0.0', endpoints: { users: '/api/users', posts: '/api/posts', search: '/api/search', time: '/api/time', products: '/api/products' // Add your new endpoint }, documentation: '/docs' }); }); ``` ### 3. Update API Explorer Edit `routes/pages.js` in the `/api-explorer` route: ```javascript { method: 'GET', path: '/api/products', description: 'Get all products (supports ?category and ?limit parameters)', example: '/api/products?category=electronics&limit=5' }, { method: 'GET', path: '/api/products/:id', description: 'Get specific product by ID', example: '/api/products/1' } ``` ### 4. Test Your New API ```bash # Test locally first PORT=3001 npm start # Test endpoint curl "http://localhost:3001/api/products?limit=3" # Deploy to production git add . && git commit -m "Add products API" # Then redeploy using manual method ``` ## 📄 Adding New HTML Pages ### 1. Create Route Handler Add to `routes/pages.js`: ```javascript // Example: Adding a contact page router.get('/contact', (req, res) => { res.render('contact', { title: 'Contact Us - Multi-API Server', contactInfo: { email: 'contact@yourdomain.com', phone: '+1 (555) 123-4567', address: '123 API Street, Tech City' } }); }); ``` ### 2. Create EJS Template Create `views/contact.ejs`: ```html

<%= title %>

Get in Touch

Email: <%= contactInfo.email %>

Phone: <%= contactInfo.phone %>

Address: <%= contactInfo.address %>

Contact Form

``` ### 3. Update Navigation Edit `views/layout.ejs` to add the new page to navigation: ```html ``` ## 📚 Adding Markdown Documentation ### 1. Create Markdown File Create new `.md` file in `content/` directory: **Example: `content/getting-started.md`** ```markdown # Getting Started Guide This guide helps you get started with the Multi-API Server. ## Quick Start ### 1. Health Check First, verify the server is running: ```bash curl "https://api.app.lobott.com/health" ``` ### 2. Explore APIs Visit the API explorer to test endpoints interactively: https://api.app.lobott.com/api-explorer ### 3. Authentication Currently, no authentication is required for public endpoints. ## Available Endpoints ### Users API - `GET /api/users` - List all users - `GET /api/users/:id` - Get specific user ### Posts API - `GET /api/posts` - List all posts - `GET /api/posts/:id` - Get specific post ## Rate Limiting Currently no rate limiting is implemented. ## Support For support, visit the status page: /status ``` ### 2. Auto-generated Index The documentation index at `/docs` automatically detects new markdown files and displays them with: - Auto-extracted title (first # heading) - Auto-generated description (first paragraph) - Direct links to view the document ### 3. Multiple Format Access Each markdown document is available in multiple formats: - **HTML**: `/docs/getting-started` (rendered with syntax highlighting) - **Raw**: `/docs/getting-started/raw` (plain markdown) - **JSON**: `/docs/getting-started/json` (structured data with metadata) ## 🔄 Deployment Process ### 1. Development Testing ```bash # Test locally PORT=3001 npm start # Test your changes curl "http://localhost:3001/your-new-endpoint" ``` ### 2. Commit Changes ```bash git add . git commit -m "Add new feature: describe what you added" ``` ### 3. Deploy to Production Use the manual deployment method (reliable for your server): ```bash # Create deployment archive tar -czf ../api-app-update.tar.gz --exclude='.git' --exclude='node_modules' --exclude='*.log' . # Upload to server scp ../api-app-update.tar.gz root@104.248.219.197:/tmp/ # Deploy with zero downtime ssh root@104.248.219.197 ' cd /tmp && rm -rf api-deploy && mkdir api-deploy && cd api-deploy && tar -xzf /tmp/api-app-update.tar.gz && docker build -t dokku/api:new . && docker stop api.web.1 2>/dev/null || true && docker rm api.web.1 2>/dev/null || true && docker run -d --name api.web.1 --restart=always -p 3000 --label=dokku=api dokku/api:new && echo "Deployment complete!" ' ``` ### 4. Verify Deployment ```bash # Check health curl "https://api.app.lobott.com/health" # Test your new features curl "https://api.app.lobott.com/your-new-endpoint" ``` ## 🎨 Styling and Templates ### Custom CSS Add styles to `public/css/style.css`: ```css .your-custom-class { background: #f8f9fa; padding: 1rem; border-radius: 4px; } ``` ### Template Patterns Follow these patterns for consistency: **Page Template Structure:** ```html

<%= title %>

``` **API Response Structure:** ```javascript // Success response { "success": true, "count": 10, "data": [...], "metadata": {...} } // Error response { "success": false, "message": "Error description", "error_code": "SPECIFIC_ERROR" } ``` ## 🔍 Debugging and Logs ### Local Development ```bash # Run with debug output DEBUG=* npm start # Or with specific debug namespace DEBUG=api:* npm start ``` ### Production Logs ```bash # View container logs ssh root@104.248.219.197 "docker logs api.web.1 --tail 50" # Follow live logs ssh root@104.248.219.197 "docker logs api.web.1 --follow" ``` ## 📊 Performance Monitoring ### Built-in Endpoints - `/health` - Basic health check - `/api/stats` - Server statistics - `/status` - Detailed server status ### Custom Monitoring Add monitoring to your routes: ```javascript const startTime = Date.now(); // ... your route logic ... const responseTime = Date.now() - startTime; console.log(`Route /api/your-endpoint took ${responseTime}ms`); ``` ## 🔒 Security Best Practices ### Input Validation ```javascript router.get('/api/secure-endpoint', (req, res) => { const { limit } = req.query; // Validate and sanitize input const validLimit = Math.min(Math.max(parseInt(limit) || 10, 1), 100); // Use validated input res.json({ limit: validLimit, data: [...] }); }); ``` ### Error Handling ```javascript router.get('/api/safe-endpoint', (req, res, next) => { try { // Your logic here res.json({ success: true, data: result }); } catch (error) { console.error('Error in safe-endpoint:', error); res.status(500).json({ success: false, message: 'Internal server error' }); } }); ``` This manual covers all the common scenarios for extending your Multi-API application. The modular structure makes it easy to add new features while maintaining consistency and reliability.