UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

108 lines 13.1 kB
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=