UNPKG

leumas-axios

Version:

An advanced Axios wrapper with extended features and Express multi-post middleware for conversational API endpoints.

67 lines (57 loc) 2.11 kB
// multiPostMiddleware.js /** * In-memory session store for multi-step post routes. * For production use, consider a persistent store. */ const sessions = {}; /** * Helper: Generate a simple random session ID. */ function generateSessionId() { return Math.random().toString(36).substring(2, 15); } /** * MultiPost Middleware Factory. * * @param {Array} requiredFields - Array of field names required to complete the request. * * The middleware: * 1. Checks for an existing session (via req.body.sessionId) or creates a new one. * 2. Merges req.body.data into the session data. * 3. Validates that all required fields are present. * - If any fields are missing, responds with: * { sessionId, status: 'pending', missingFields } * - If all fields are provided, attaches the complete data to req.multiPostData * and calls next() so the final route handler can send a response. */ function multiPostMiddleware(requiredFields) { return (req, res, next) => { // Use provided sessionId or generate a new one. let sessionId = req.body.sessionId || generateSessionId(); req.sessionId = sessionId; // Create a new session if one does not exist. if (!sessions[sessionId]) { sessions[sessionId] = {}; console.log(`Created new session: ${sessionId}`); } // Merge incoming data with existing session data. sessions[sessionId] = { ...sessions[sessionId], ...req.body.data }; req.multiPostData = sessions[sessionId]; // Determine which required fields are missing. const missingFields = requiredFields.filter( (field) => !req.multiPostData[field] ); if (missingFields.length > 0) { console.log(`Session ${sessionId} pending. Missing fields:`, missingFields); return res.json({ sessionId, status: 'pending', missingFields, }); } // All required fields are present; clear session data (if desired) and proceed. delete sessions[sessionId]; next(); }; } module.exports = multiPostMiddleware;