const express = require("express"); const bodyParser = require("body-parser"); const app = express(); const PORT = 8080; // Middleware to parse JSON app.use(bodyParser.json()); // In-memory data store for demonstration let items = []; let currentId = 1; // Middleware to handle dynamic headers app.use((req, res, next) => { const dynamicHeaders = req.headers; req.dynamicHeaders = dynamicHeaders; // Store headers for use in routes next(); }); // Routes // CREATE - Add a new item app.post("/items", (req, res) => { const { headers, body, query } = req; const { stateParams } = req.body; // State parameters passed in body // Dynamic handling example for headers, query params, and state params console.log("Headers:", headers); console.log("Query Params:", query); console.log("State Params:", stateParams); const { name, description } = body; if (!name) { return res.status(400).json({ error: "Name is required" }); } const newItem = { id: currentId++, name, description }; items.push(newItem); res.status(201).json({ message: "Item created successfully", headers: req.dynamicHeaders, queryParams: query, stateParams, item: newItem, }); }); // READ - Get all items app.get("/items", (req, res) => { const { query } = req; // Filter by query parameters if provided let filteredItems = items; if (query.name) { filteredItems = filteredItems.filter((item) => item.name.toLowerCase().includes(query.name.toLowerCase()) ); } if (query.description) { filteredItems = filteredItems.filter((item) => item.description && item.description.toLowerCase().includes(query.description.toLowerCase()) ); } res.json({ message: "Items retrieved successfully", headers: req.dynamicHeaders, queryParams: query, items: filteredItems, }); }); // READ - Get an item by ID app.get("/items/:id", (req, res) => { const { id } = req.params; const item = items.find((i) => i.id === parseInt(id)); if (!item) { return res.status(404).json({ error: "Item not found" }); } res.json({ message: "Item retrieved successfully", headers: req.dynamicHeaders, queryParams: req.query, item, }); }); // UPDATE - Update an item by ID app.put("/items/:id", (req, res) => { const { id } = req.params; const { name, description } = req.body; const item = items.find((i) => i.id === parseInt(id)); if (!item) { return res.status(404).json({ error: "Item not found" }); } if (name) item.name = name; if (description) item.description = description; res.json({ message: "Item updated successfully", headers: req.dynamicHeaders, stateParams: req.body.stateParams, updatedItem: item, }); }); // DELETE - Remove an item by ID app.delete("/items/:id", (req, res) => { const { id } = req.params; const index = items.findIndex((i) => i.id === parseInt(id)); if (index === -1) { return res.status(404).json({ error: "Item not found" }); } items.splice(index, 1); res.status(204).send({ message: "Item deleted successfully", headers: req.dynamicHeaders, }); }); // READ - Get items with optional dynamic query parameters app.get("/items/search", (req, res) => { const { query } = req; // Filter items based on query parameters let filteredItems = items; if (query.name) { filteredItems = filteredItems.filter((item) => item.name.toLowerCase().includes(query.name.toLowerCase()) ); } if (query.description) { filteredItems = filteredItems.filter( (item) => item.description && item.description.toLowerCase().includes(query.description.toLowerCase()) ); } res.json({ message: "Filtered items retrieved successfully", headers: req.dynamicHeaders, queryParams: query, items: filteredItems, }); }); // Start the server app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });