UNPKG

ibird-core

Version:

The core module of ibird.

193 lines (170 loc) 6.56 kB
'use strict'; /** * 模型部分内部接口 * Created by yinfxs on 2017/4/5. */ const config = require('./config'); const utility = require('ibird-utils'); const i18n = config.i18n; const logger = require('./log')(); const app = {}; module.exports = app; /** * 内部接口:创建模型 * @param name 模型名称,与模型注册时一致 * @param obj */ app.create = async (name, obj) => { if ((typeof name !== 'string') || (typeof obj !== 'object')) return Promise.reject(new Error(i18n.get('create_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); const array = []; obj = Array.isArray(obj) ? obj : [obj]; for (const item of obj) { if (!item) continue; array.push(new Model(item)); } try { return (array.length === 1) ? array[0].save() : Model.create(array); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('create_api_db_error'))); } }; /** * 内部接口:更新模型 * @param name 模型名称,与模型注册时一致 * @param conditions 更新条件 * @param doc 需要更新文档对象 * @param [options] */ app.update = async (name, conditions, doc, options) => { if (typeof name !== 'string') return Promise.reject(new Error(i18n.get('update_api_params_error1'))); if ((typeof conditions !== 'object') || (typeof doc !== 'object')) return Promise.reject(new Error(i18n.get('update_api_params_error2'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { return Model.update(conditions, doc, options); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('update_api_db_error'))); } }; /** * 内部接口:删除模型 * @param name 模型名称,与模型注册时一致 * @param conditions 更新条件 */ app.remove = async (name, conditions) => { if ((typeof name !== 'string') || (typeof conditions !== 'object')) return Promise.reject(new Error(i18n.get('remove_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { return logicallyDeletedRemove(name, Model, conditions); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('remove_api_db_error'))); } }; /** * 内部接口:列表查询 * @param name 模型名称,与模型注册时一致 * @param conditions 查询条件 * @param [callback] 针对查询对象回调处理函数 * @param [options] 可选 */ app.list = async (name, conditions, callback, projection = null, options) => { if ((typeof name !== 'string') || (typeof conditions !== 'object')) return Promise.reject(new Error(i18n.get('list_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { const query = Model.find(conditions, projection, options); if (typeof callback === 'function') await callback(query); logicallyDeletedList(name, query); return query.exec(); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('list_api_db_error'))); } }; /** * 内部接口:查询指定查询条件数量 * @param name 模型名称,与模型注册时一致 * @param conditions 查询条件 * @returns {*} */ app.count = async (name, conditions) => { if ((typeof name !== 'string') || (typeof conditions !== 'object')) return Promise.reject(new Error(i18n.get('count_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { return Model.count(conditions); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('count_api_db_error'))); } }; /** * 内部接口:单个查询 * @param name 模型名称,与模型注册时一致 * @param conditions 查询条件 * @param [callback] 针对查询对象回调处理函数 * @param [options] 可选 */ app.one = async (name, conditions, callback, projection = null, options) => { if ((typeof name !== 'string') || (typeof conditions !== 'object')) return Promise.reject(new Error(i18n.get('one_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { const query = Model.findOne(conditions, projection, options); if (typeof callback === 'function') await callback(query); return query.exec(); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('one_api_db_error'))); } }; /** * 内部接口:ID查询 * @param name 模型名称,与模型注册时一致 * @param id 查询条件 * @param [callback] 针对查询对象回调处理函数 * @param [options] 可选 */ app.id = async (name, id, callback, options) => { if ((typeof name !== 'string') || (typeof id !== 'string')) return Promise.reject(new Error(i18n.get('id_api_params_error'))); const Model = config.model[name]; if (!Model) return Promise.reject(new Error(i18n.get('api_model_nonexis', name))); try { const query = Model.findById(id, null, options); if (typeof callback === 'function') await callback(query); return query.exec(); } catch (e) { return Promise.reject(utility.errors(e, i18n.get('id_api_db_error'))); } }; /** * 逻辑删除的查询 * @param name 模型名称,与模型注册时一致 * @param query 查询实例 */ function logicallyDeletedList(name, query) { const cfg = config.schema[name]; const logicallyDeleted = cfg.logicallyDeleted; if (!logicallyDeleted) return query; const filter = { $ne: true }; if (query._conditions.$and) { query._conditions.$and.push({ [logicallyDeleted]: filter }); } else { query._conditions[logicallyDeleted] = filter; } } /** * 逻辑删除的删除 * @param name 模型名称,与模型注册时一致 * @param Model 模型对象 * @param conditions 删除条件 */ function logicallyDeletedRemove(name, Model, conditions) { const cfg = config.schema[name]; const logicallyDeleted = cfg.logicallyDeleted; if (!logicallyDeleted) { return Model.remove(conditions); } else { return Model.update(conditions, { [logicallyDeleted]: true }); } }