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
JavaScript
// 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;