123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // ██████╗ ██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ██████╗███████╗███████╗███████╗
- // ██╔══██╗██╔══██╗██╔════╝ ██╔══██╗██╔══██╗██╔═══██╗██╔════╝██╔════╝██╔════╝██╔════╝
- // ██████╔╝██████╔╝█████╗█████╗██████╔╝██████╔╝██║ ██║██║ █████╗ ███████╗███████╗
- // ██╔═══╝ ██╔══██╗██╔══╝╚════╝██╔═══╝ ██╔══██╗██║ ██║██║ ██╔══╝ ╚════██║╚════██║
- // ██║ ██║ ██║███████╗ ██║ ██║ ██║╚██████╔╝╚██████╗███████╗███████║███████║
- // ╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝╚══════╝╚══════╝╚══════╝
- //
- // ██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ SSSSSS
- // ██╔══██╗██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔══██╗ S
- // ██████╔╝█████╗ ██║ ██║ ██║██████╔╝██║ ██║ SSSSSS
- // ██╔══██╗██╔══╝ ██║ ██║ ██║██╔══██╗██║ ██║ S
- // ██║ ██║███████╗╚██████╗╚██████╔╝██║ ██║██████╔╝ S
- // ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ SSSSSSS
- //
- var _ = require('@sailshq/lodash');
- var utils = require('waterline-utils');
- var eachRecordDeep = utils.eachRecordDeep;
- /**
- * [exports description]
- *
- * TODO: Document this utility
- *
- * TODO: change the name of this utility to reflect the fact that its job is
- * to pre-process new incoming records (plural)
- *
- * @param {[type]} options [description]
- * @return {[type]} [description]
- */
- module.exports = function preProcessRecord(options) {
- // ╦ ╦╔═╗╦ ╦╔╦╗╔═╗╔╦╗╔═╗ ┌─┐┌─┐┌┬┐┬┌─┐┌┐┌┌─┐
- // ╚╗╔╝╠═╣║ ║ ║║╠═╣ ║ ║╣ │ │├─┘ │ ││ ││││└─┐
- // ╚╝ ╩ ╩╩═╝╩═╩╝╩ ╩ ╩ ╚═╝ └─┘┴ ┴ ┴└─┘┘└┘└─┘
- if (_.isUndefined(options) || !_.isPlainObject(options)) {
- throw new Error('Invalid options argument. Options must contain: records, identity, and orm.');
- }
- if (!_.has(options, 'records') || !_.isArray(options.records)) {
- throw new Error('Invalid option used in options argument. Missing or invalid records.');
- }
- if (!_.has(options, 'identity') || !_.isString(options.identity)) {
- throw new Error('Invalid option used in options argument. Missing or invalid identity.');
- }
- if (!_.has(options, 'orm') || !_.isPlainObject(options.orm)) {
- throw new Error('Invalid option used in options argument. Missing or invalid orm.');
- }
- // Key the collections by identity instead of column name
- var collections = _.reduce(options.orm.collections, function(memo, val) {
- memo[val.identity] = val;
- return memo;
- }, {});
- options.orm.collections = collections;
- // Run all the new, incoming records through the iterator so that they can be normalized
- // with anything adapter-specific before getting written to the database.
- // > (This should *never* go more than one level deep!)
- eachRecordDeep(options.records, function iterator(record, WLModel, depth) {
- if (depth !== 1) {
- throw new Error('Consistency violation: Incoming new records in a s3q should never necessitate deep iteration! If you are seeing this error, it is probably because of a bug in this adapter, or in Waterline core.');
- }
- _.each(WLModel.definition, function checkAttributes(attrDef) {
- var columnName = attrDef.columnName;
- // JSON stringify the values provided for any `type: 'json'` attributes
- // because MySQL can't store JSON.
- if (attrDef.type === 'json' && _.has(record, columnName)) {
- // Special case: If this is the `null` literal, leave it alone.
- // But otherwise, stringify it into a JSON string.
- // (even if it's already a string!)
- if (!_.isNull(record[columnName])) {
- record[columnName] = JSON.stringify(record[columnName]);
- }
- }//>-
- });
- }, true, options.identity, options.orm);
- };
|