strapi/lib/configuration/hooks/blueprints/associationUtil.js
2015-10-01 00:30:16 +02:00

216 lines
5.6 KiB
JavaScript

'use strict';
/**
* Module dependencies
*/
// Public node modules.
const _ = require('lodash');
module.exports = {
/**
* Helper which returns a promise and then
* the found record
*
* @param {Object} model
* @param {string|int} id
*
* @return {Function|promise}
*/
doesRecordExist: function doesRecordExist(model, id) {
const deferred = Promise.defer();
strapi.orm
.collections[model]
.findOne(id)
.exec(function (err, foundRecord) {
if (err) {
return deferred.reject(err);
}
if (!foundRecord) {
return deferred.reject({
message: 'No ' + model + ' found with the specified `id`.'
});
}
deferred.resolve(foundRecord);
});
return deferred.promise;
},
/**
* Helper which remove the relations of a specific entry and
* update the new relation if a relationId is specified
*
* @param originalModelAlias
* @param originalModelId
* @param relationModel
* @param relationId
*
* @return {Function|promise}
*/
oneToOneRelationUpdated: function oneToOneRelationUpdated(originalModelAlias, originalModelId, relationModel, relationId) {
const deferred = Promise.defer();
// First remove all relations
const promises = [];
// Update the relation of the origin model
promises.push(module.exports.removeRelationsOut(originalModelAlias, originalModelId, relationModel));
// Update the entries of the same collection
// of the original model.
promises.push(module.exports.removeRelationsIn(originalModelAlias, originalModelId, relationModel, relationId));
Promise.all(promises)
.then(function () {
// If a relationId is provided, update the new linked entry.
if (relationId) {
strapi.orm.collections[relationModel]
.findOne(relationId)
.exec(function (err, record) {
if (err) {
return deferred.reject(err);
}
if (!record) {
return deferred.reject({
message: 'Relation not found'
});
}
record[originalModelAlias] = originalModelId;
record.save(function (err, record) {
if (err) {
return deferred.reject(err);
}
deferred.resolve(record);
});
});
} else {
deferred.resolve();
}
})
.catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
},
/**
* Helper which remove all the relations
* of a specific model
*
* @param originalModelAlias
* @param originalModelId
* @param relationModel
*
* @return {Function|promise}
*/
removeRelationsOut: function removeRelationsOut(originalModelAlias, originalModelId, relationModel) {
const deferred = Promise.defer();
if (!originalModelAlias) {
return deferred.reject({
message: 'originalModelAlias invalid.'
});
}
// Params object used for the `find`function.
const findParams = {};
findParams[originalModelAlias] = originalModelId;
// Find all the matching entries of the original model.
strapi.orm.collections[relationModel]
.find(findParams)
.exec(function (err, records) {
if (err) {
return deferred.reject(err);
}
// Init the array of promises.
const savePromises = [];
// Set the relation to null.
// Save the entry and add the promise in the array.
_.forEach(records, function (record) {
record[originalModelAlias] = null;
savePromises.push(record.save());
});
Promise.all(savePromises)
.then(function () {
deferred.resolve(records);
})
.catch(function (err) {
deferred.reject(err);
});
});
return deferred.promise;
},
/**
* Helper which remove all the relations
* of a specific model
*
* @param originalModelAlias
* @param originalModelId
* @param relationModel
* @param {number|string}relationId
*
* @return {Function|promise}
*/
removeRelationsIn: function removeRelationsIn(originalModelAlias, originalModelId, relationModel, relationId) {
const deferred = Promise.defer();
// Params object used for the `find` function.
const findParams = {};
findParams[relationModel] = relationId;
findParams.id = {
'!': originalModelId
};
// Find all the matching entries of the original model.
strapi.orm.collections[originalModelAlias]
.find(findParams)
.exec(function (err, records) {
if (err) {
return deferred.reject(err);
}
// Init the array of promises.
const savePromises = [];
_.forEach(records, function (record) {
// Set the relation to null
if (record[relationModel]) {
record[relationModel] = null;
}
// Save the entry and add the promise in the array
savePromises.push(record.save());
});
Promise.all(savePromises)
.then(function () {
deferred.resolve();
})
.catch(function (err) {
deferred.reject(err);
});
});
return deferred.promise;
}
};