@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
108 lines • 13.1 kB
JavaScript
import { logger } from '../log';
/**
* Logs the start of a database operation.
* @internal
* @param nameStr - The model name
* @param operation - The type of operation being performed.
* @param data - Additional data to log with the operation.
*/
export const logOperation = (nameStr, operation, data) => {
const presentParticiple = operation === 'create'
? 'Creating'
: operation === 'update'
? 'Updating'
: operation === 'delete'
? 'Deleting'
: operation === 'get'
? 'Getting'
: 'Listing';
logger.info(`${presentParticiple} ${nameStr}`, {
operation,
model: nameStr,
...(data ? { data } : {}),
});
};
/**
* Logs the successful completion of a database operation.
* @internal
* @param operation - The type of operation that was completed.
* @param additionalInfo - Any additional information to include in the log.
*/
export const logSuccess = (operation, additionalInfo) => {
const pastTense = operation === 'create'
? 'created'
: operation === 'update'
? 'updated'
: operation === 'delete'
? 'deleted'
: operation === 'get'
? 'retrieved'
: 'listed';
logger.info(`Successfully ${pastTense}`, {
operation,
...(additionalInfo ? { additionalInfo } : {}),
});
};
/**
* Validates a GraphQL-like response object.
* Ensures the response is present, correctly structured, and free of errors.
*
* @template R The expected type of the `data` property in the response
* @param props The arguments for the validation
* @returns The `data` from the response
* @throws Will throw an error if the response is invalid
*/
export const validateResponse = (props) => {
const { response, operation, name, input } = props;
// Validate that response exists
if (response === null || response === undefined) {
const errorMsg = `No response received for ${name} ${operation}`;
logger.error(errorMsg, { input });
throw new Error(errorMsg);
}
// Validate that response has the expected structure
if (typeof response !== 'object' || !('data' in response)) {
const errorMsg = `Invalid response structure for ${name} ${operation}`;
logger.error(errorMsg, { response, input });
throw new Error(errorMsg);
}
const { data, errors } = response;
// Check for GraphQL errors
if (errors && errors.length > 0) {
const errorMessages = errors.map(error => {
const message = error?.message || 'Unknown error';
const errorMessage = `GraphQL error during ${name} ${operation}: ${message}`;
logger.error(errorMessage, { specificError: error, input });
return errorMessage;
});
throw new Error(errorMessages.join('\n'));
}
// Validate data presence
if (data === null || data === undefined) {
const errorMsg = `No data returned for ${name} ${operation}`;
logger.error(errorMsg, {
searchCriteria: input,
operation,
model: name,
});
throw new Error(errorMsg);
}
return data;
};
/**
* Validates a database response and returns the data if valid.
* @internal
* @param response - The response from the database operation.
* @param operation - The type of operation that was performed.
* @param input - The input that was provided to the operation.
* @returns The validated data from the response.
*/
export const validateAndReturn = (response, operation, input) => {
return validateResponse({
response,
operation: 'mutation',
name: operation,
input,
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3F1ZXJpZXMvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR2hDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUMxQixPQUFlLEVBQ2YsU0FBd0IsRUFDeEIsSUFBYyxFQUNSLEVBQUU7SUFDUixNQUFNLGlCQUFpQixHQUNyQixTQUFTLEtBQUssUUFBUTtRQUNwQixDQUFDLENBQUMsVUFBVTtRQUNaLENBQUMsQ0FBQyxTQUFTLEtBQUssUUFBUTtZQUN0QixDQUFDLENBQUMsVUFBVTtZQUNaLENBQUMsQ0FBQyxTQUFTLEtBQUssUUFBUTtnQkFDdEIsQ0FBQyxDQUFDLFVBQVU7Z0JBQ1osQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLO29CQUNuQixDQUFDLENBQUMsU0FBUztvQkFDWCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLEVBQUUsRUFBRTtRQUM3QyxTQUFTO1FBQ1QsS0FBSyxFQUFFLE9BQU87UUFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FDeEIsU0FBd0IsRUFDeEIsY0FBd0IsRUFDbEIsRUFBRTtJQUNSLE1BQU0sU0FBUyxHQUNiLFNBQVMsS0FBSyxRQUFRO1FBQ3BCLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ3RCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRO2dCQUN0QixD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QkFBZ0IsQ0FBQztRQUN0QixRQUFRO1FBQ1IsU0FBUyxFQUFFLFVBQVU7UUFDckIsSUFBSSxFQUFFLFNBQVM7UUFDZixLQUFLO0tBQ04sQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nJztcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uVHlwZSwgRGF0YWJhc2VSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIExvZ3MgdGhlIHN0YXJ0IG9mIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gbmFtZVN0ciAtIFRoZSBtb2RlbCBuYW1lXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZC5cbiAqIEBwYXJhbSBkYXRhIC0gQWRkaXRpb25hbCBkYXRhIHRvIGxvZyB3aXRoIHRoZSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dPcGVyYXRpb24gPSAoXG4gIG5hbWVTdHI6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiBPcGVyYXRpb25UeXBlLFxuICBkYXRhPzogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwcmVzZW50UGFydGljaXBsZSA9XG4gICAgb3BlcmF0aW9uID09PSAnY3JlYXRlJ1xuICAgICAgPyAnQ3JlYXRpbmcnXG4gICAgICA6IG9wZXJhdGlvbiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgPyAnVXBkYXRpbmcnXG4gICAgICAgIDogb3BlcmF0aW9uID09PSAnZGVsZXRlJ1xuICAgICAgICAgID8gJ0RlbGV0aW5nJ1xuICAgICAgICAgIDogb3BlcmF0aW9uID09PSAnZ2V0J1xuICAgICAgICAgICAgPyAnR2V0dGluZydcbiAgICAgICAgICAgIDogJ0xpc3RpbmcnO1xuXG4gIGxvZ2dlci5pbmZvKGAke3ByZXNlbnRQYXJ0aWNpcGxlfSAke25hbWVTdHJ9YCwge1xuICAgIG9wZXJhdGlvbixcbiAgICBtb2RlbDogbmFtZVN0cixcbiAgICAuLi4oZGF0YSA/IHsgZGF0YSB9IDoge30pLFxuICB9KTtcbn07XG5cbi8qKlxuICogTG9ncyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgd2FzIGNvbXBsZXRlZC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mbyAtIEFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIGxvZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ1N1Y2Nlc3MgPSAoXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uVHlwZSxcbiAgYWRkaXRpb25hbEluZm8/OiB1bmtub3duLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHBhc3RUZW5zZSA9XG4gICAgb3BlcmF0aW9uID09PSAnY3JlYXRlJ1xuICAgICAgPyAnY3JlYXRlZCdcbiAgICAgIDogb3BlcmF0aW9uID09PSAndXBkYXRlJ1xuICAgICAgICA/ICd1cGRhdGVkJ1xuICAgICAgICA6IG9wZXJhdGlvbiA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgICA/ICdkZWxldGVkJ1xuICAgICAgICAgIDogb3BlcmF0aW9uID09PSAnZ2V0J1xuICAgICAgICAgICAgPyAncmV0cmlldmVkJ1xuICAgICAgICAgICAgOiAnbGlzdGVkJztcblxuICBsb2dnZXIuaW5mbyhgU3VjY2Vzc2Z1bGx5ICR7cGFzdFRlbnNlfWAsIHtcbiAgICBvcGVyYXRpb24sXG4gICAgLi4uKGFkZGl0aW9uYWxJbmZvID8geyBhZGRpdGlvbmFsSW5mbyB9IDoge30pLFxuICB9KTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgR3JhcGhRTC1saWtlIHJlc3BvbnNlIG9iamVjdC5cbiAqIEVuc3VyZXMgdGhlIHJlc3BvbnNlIGlzIHByZXNlbnQsIGNvcnJlY3RseSBzdHJ1Y3R1cmVkLCBhbmQgZnJlZSBvZiBlcnJvcnMuXG4gKlxuICogQHRlbXBsYXRlIFIgVGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIGBkYXRhYCBwcm9wZXJ0eSBpbiB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSBwcm9wcyBUaGUgYXJndW1lbnRzIGZvciB0aGUgdmFsaWRhdGlvblxuICogQHJldHVybnMgVGhlIGBkYXRhYCBmcm9tIHRoZSByZXNwb25zZVxuICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSByZXNwb25zZSBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVJlc3BvbnNlID0gPFI+KHByb3BzOiB7XG4gIHJlc3BvbnNlOiB7IGRhdGE6IFIgfCBudWxsOyBlcnJvcnM/OiB1bmtub3duW10gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIG9wZXJhdGlvbjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlucHV0PzogdW5rbm93bjtcbn0pOiBSID0+IHtcbiAgY29uc3QgeyByZXNwb25zZSwgb3BlcmF0aW9uLCBuYW1lLCBpbnB1dCB9ID0gcHJvcHM7XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCByZXNwb25zZSBleGlzdHNcbiAgaWYgKHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGBObyByZXNwb25zZSByZWNlaXZlZCBmb3IgJHtuYW1lfSAke29wZXJhdGlvbn1gO1xuICAgIGxvZ2dlci5lcnJvcihlcnJvck1zZywgeyBpbnB1dCB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCByZXNwb25zZSBoYXMgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZVxuICBpZiAodHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCAhKCdkYXRhJyBpbiByZXNwb25zZSkpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGBJbnZhbGlkIHJlc3BvbnNlIHN0cnVjdHVyZSBmb3IgJHtuYW1lfSAke29wZXJhdGlvbn1gO1xuICAgIGxvZ2dlci5lcnJvcihlcnJvck1zZywgeyByZXNwb25zZSwgaW5wdXQgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGF0YSwgZXJyb3JzIH0gPSByZXNwb25zZTtcblxuICAvLyBDaGVjayBmb3IgR3JhcGhRTCBlcnJvcnNcbiAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMubWFwKGVycm9yID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAoZXJyb3IgYXMgeyBtZXNzYWdlPzogc3RyaW5nIH0pPy5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJztcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBHcmFwaFFMIGVycm9yIGR1cmluZyAke25hbWV9ICR7b3BlcmF0aW9ufTogJHttZXNzYWdlfWA7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlLCB7IHNwZWNpZmljRXJyb3I6IGVycm9yLCBpbnB1dCB9KTtcbiAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7XG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZXMuam9pbignXFxuJykpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgZGF0YSBwcmVzZW5jZVxuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGBObyBkYXRhIHJldHVybmVkIGZvciAke25hbWV9ICR7b3BlcmF0aW9ufWA7XG4gICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCB7XG4gICAgICBzZWFyY2hDcml0ZXJpYTogaW5wdXQsXG4gICAgICBvcGVyYXRpb24sXG4gICAgICBtb2RlbDogbmFtZSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGRhdGFiYXNlIHJlc3BvbnNlIGFuZCByZXR1cm5zIHRoZSBkYXRhIGlmIHZhbGlkLlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBUaGUgcmVzcG9uc2UgZnJvbSB0aGUgZGF0YWJhc2Ugb3BlcmF0aW9uLlxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IHdhcyBwZXJmb3JtZWQuXG4gKiBAcGFyYW0gaW5wdXQgLSBUaGUgaW5wdXQgdGhhdCB3YXMgcHJvdmlkZWQgdG8gdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgZGF0YSBmcm9tIHRoZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQW5kUmV0dXJuID0gPFQ+KFxuICByZXNwb25zZTogRGF0YWJhc2VSZXNwb25zZTxUPixcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGlucHV0OiB1bmtub3duLFxuKTogVCA9PiB7XG4gIHJldHVybiB2YWxpZGF0ZVJlc3BvbnNlKHtcbiAgICByZXNwb25zZSxcbiAgICBvcGVyYXRpb246ICdtdXRhdGlvbicsXG4gICAgbmFtZTogb3BlcmF0aW9uLFxuICAgIGlucHV0LFxuICB9KTtcbn07XG4iXX0=