From 9dbc8fa50b9fd25386a67e2b5fcc9d33f4435a38 Mon Sep 17 00:00:00 2001 From: Anatoliy Chakkaev Date: Tue, 22 Jan 2013 01:21:31 +0700 Subject: [PATCH] Implement findOrCreate, requested in #190 --- lib/abstract-class.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/abstract-class.js b/lib/abstract-class.js index 8167359c..bb10a2f7 100644 --- a/lib/abstract-class.js +++ b/lib/abstract-class.js @@ -258,6 +258,34 @@ AbstractClass.upsert = AbstractClass.updateOrCreate = function upsert(data, call } }; +/** + * Find one record, same as `all`, limited by 1 and return object, not collection, + * if not found, create using data provided as second argument + * + * @param {Object} query - search conditions: {where: {test: 'me'}}. + * @param {Object} data - object to create. + * @param {Function} cb - callback called with (err, instance) + */ +AbstractClass.findOrCreate = function findOrCreate(query, data, callback) { + if (typeof query === 'undefined') { + query = {where: {}}; + } + if (typeof data === 'function' || typeof data === 'undefined') { + callback = data; + data = query && query.where; + } + if (typeof callback === 'undefined') { + callback = function () {}; + } + + var t = this; + this.findOne(query, function (err, record) { + if (err) return callback(err); + if (record) return callback(null, record); + t.create(data, callback); + }); +}; + /** * Check whether object exitst in database * @@ -341,7 +369,7 @@ AbstractClass.all = function all(params, cb) { /** * Find one record, same as `all`, limited by 1 and return object, not collection * - * @param {Object} params - search conditions + * @param {Object} params - search conditions: {where: {test: 'me'}} * @param {Function} cb - callback called with (err, instance) */ AbstractClass.findOne = function findOne(params, cb) {