mcp-product-manager
Version:
MCP Orchestrator for task and project management with web interface
107 lines • 2.68 kB
JavaScript
/**
* Response utility functions for Express routes - TypeScript version
*/
/**
* Standard success response
* Returns data object that can be sent with res.json()
*/
export const success = (data = {}, message) => {
const response = {
success: true,
data,
metadata: {
timestamp: new Date().toISOString()
}
};
// Add message to metadata if provided
if (message) {
response.metadata.message = message;
}
return response;
};
/**
* Standard error response
* Returns error object that can be sent with res.status().json()
*/
export const error = (message = 'An error occurred', statusCode = 500, details = null) => {
const response = {
status: statusCode,
body: {
success: false,
error: message
}
};
if (details) {
response.body.details = details;
}
return response;
};
/**
* Async route handler wrapper to catch errors
* Type-safe wrapper for async Express route handlers
*/
export const asyncHandler = (fn) => {
return (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};
};
/**
* Validation error response
*/
export const validationError = (errors) => {
return error('Validation failed', 400, { errors });
};
/**
* Not found response
*/
export const notFound = (resource = 'Resource') => {
return error(`${resource} not found`, 404);
};
/**
* Unauthorized response
*/
export const unauthorized = (message = 'Unauthorized') => {
return error(message, 401);
};
/**
* Forbidden response
*/
export const forbidden = (message = 'Forbidden') => {
return error(message, 403);
};
/**
* Rate limit exceeded response
*/
export const rateLimitExceeded = (retryAfter) => {
const details = retryAfter ? { retryAfter } : undefined;
return error('Rate limit exceeded', 429, details);
};
/**
* Service unavailable response
*/
export const serviceUnavailable = (message = 'Service temporarily unavailable') => {
return error(message, 503);
};
/**
* Helper to send success response
*/
export const sendSuccess = (res, data, message) => {
return res.json(success(data, message));
};
/**
* Helper to send error response
*/
export const sendError = (res, errorResponse) => {
return res.status(errorResponse.status).json(errorResponse.body);
};
/**
* Type guard to check if response is an error
*/
export const isErrorResponse = (response) => {
return response &&
typeof response === 'object' &&
'status' in response &&
'body' in response &&
response.body?.success === false;
};
//# sourceMappingURL=response.js.map