@allma/core-sdk
Version:
Core SDK with shared utilities (logging, auth, S3 utils) for building on the Allma serverless AI orchestration platform.
78 lines • 3.46 kB
JavaScript
import { log_debug } from './logger.js';
/**
* Builds a standardized success response object.
* @param data The data payload for the successful response.
* @returns AdminApiSuccessResponse<T>
*/
export function buildSuccessResponse(data) {
return { success: true, data };
}
/**
* Builds a standardized error response object.
* @param message The error message.
* @param code An optional error code (e.g., 'NOT_FOUND', 'VALIDATION_ERROR').
* @param details Optional additional error details.
* @returns AdminApiErrorResponse
*/
export function buildErrorResponse(message, code, details) {
return { success: false, error: { message, code, details } };
}
/**
* Creates a complete APIGatewayProxyResultV2 object for Lambda responses.
* It determines the HTTP status code based on the success flag and error code.
* @param defaultStatusCode The HTTP status code to use if success is true, or if no specific error code maps to a status.
* @param bodyObject The AdminApiSuccessResponse or AdminApiErrorResponse to be stringified in the body.
* @param correlationId Optional correlation ID for logging.
* @returns APIGatewayProxyResultV2
*/
export function createApiGatewayResponse(defaultStatusCode, bodyObject, correlationId) {
let effectiveStatusCode = defaultStatusCode;
if (!bodyObject.success) {
const errorCode = bodyObject.error.code;
if (errorCode === 'NOT_FOUND') {
effectiveStatusCode = 404;
}
else if (errorCode === 'VALIDATION_ERROR' || errorCode === 'INVALID_INPUT') {
effectiveStatusCode = 400;
}
else if (errorCode === 'UNAUTHORIZED') {
effectiveStatusCode = 401;
}
else if (errorCode === 'FORBIDDEN') {
effectiveStatusCode = 403;
}
else if (errorCode === 'CONFLICT') {
effectiveStatusCode = 409;
}
else {
effectiveStatusCode = defaultStatusCode >= 400 ? defaultStatusCode : 500; // Default to 500 for errors if not specified
}
}
else if (defaultStatusCode === 204 && bodyObject.data === null) { // Handle 204 No Content specifically
// For 204, body should be empty.
log_debug(`Responding with statusCode: ${effectiveStatusCode} (No Content)`, {}, correlationId);
return {
statusCode: effectiveStatusCode,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'OPTIONS,GET,POST,PUT,DELETE,PATCH',
},
body: '', // Empty body for 204
};
}
log_debug(`Responding with statusCode: ${effectiveStatusCode}`, { bodyPreview: JSON.stringify(bodyObject).substring(0, 2000) }, correlationId);
return {
statusCode: effectiveStatusCode,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'OPTIONS,GET,POST,PUT,DELETE,PATCH',
},
body: JSON.stringify(bodyObject),
};
}
//# sourceMappingURL=apiResponseBuilder.js.map