UNPKG

biz9-data

Version:

BiZ9-Data Package is an object-relational mapper (ORM) that lets you build a clean, portable, reusable, and high-level data access layer with Node.js for data driven applications. The package consists of create, read, update and destroy (CRUD) methods to

285 lines (283 loc) 15.1 kB
/* Copyright 2016 Certified CoderZ Author: Brandon Poole Sr. (biz9framework@gmail.com) License GNU General Public License v3.0 Description: BiZ9 Framework: Data - Foreign */ const async = require('async'); const {Log,Str,Num,Obj,DateTime}=require("/home/think1/www/doqbox/biz9-framework/biz9-utility/source"); const {Data_Value_Type,Data_Logic,Data_Table}=require("/home/think1/www/doqbox/biz9-framework/biz9-data-logic/source"); const {Adapter} = require('./adapter.js'); class Foreign { static get_data = (database,cache,data_items,option) => { return new Promise((callback) => { let error = null; const foreign_search_items = []; async.series([ function(call){ for(const option_foreign of option.foreigns){ let foreign_item = Foreign.get_search(option_foreign); for(const data_item of data_items){ let query_field = {}; query_field[foreign_item.foreign_field] = data_item[foreign_item.parent_field]; foreign_item.query.$or.push(query_field); } foreign_search_items.push(foreign_item); } const run_data = async (database,cache,search_item) => { await Foreign.get_search_item_data(database,cache,search_item); for(const data_item of data_items){ if(search_item.value_type == Data_Value_Type.ITEMS){ const match_items = search_item.items.filter(item_find => item_find[search_item.foreign_field] === data_item[search_item.parent_field]); data_item[search_item.title] = []; if(match_items.length>0){ data_item[search_item.title] = [...match_items]; } }else if(search_item.value_type == Data_Value_Type.COUNT){ data_item[search_item.title] = search_item.data; }else if(search_item.value_type == Data_Value_Type.ONE){ if(search_item.items.length>0){ data_item[search_item.title] = search_item.items[0]; }else{ data_item[search_item.title] = Data_Logic.get_not_found(search_item.foreign_table,0); } } } } const run = async (database,cache) => { for(const search_item of foreign_search_items){ await run_data(database,cache,search_item); } } run(database,cache).then(() => { call(); }); }, ]).then(result => { callback([error,data_items]); }).catch(err => { Log.error("Foreign-Get",err); callback([error,[]]); }); }); }; //9_search 9_get_search static get_search = (foreign_item) => { return { value_type : foreign_item.value_type ? foreign_item.value_type : Data_Value_Type.ITEMS, foreign_table : foreign_item.foreign_table, foreign_field : foreign_item.foreign_field, parent_field : foreign_item.parent_field, parent_value : '', field : foreign_item.field ? foreign_item.field : null, title : foreign_item.title ? foreign_item.title : foreign_item.foreign_table, page_current : foreign_item.page_current ? foreign_item.page_current : 1, page_size : foreign_item.page_size ? foreign_item.page_size : 0, sort_by : foreign_item.sort_by ? foreign_item.sort_by : {}, foreigns : foreign_item.foreigns ? foreign_item.foreigns : [], items : [], query : { $or: [] }, data : null } }; static get_items_data = (database,cache,search_item) =>{ return new Promise((resolve) => { let search = Data_Logic.get_search(search_item.foreign_table,search_item.query,search_item.sort_by,search_item.page_current,search_item.page_size); let foreign_option = search_item.field ? search_item.field : {}; if(search_item.query.$or.length>0){ Adapter.get_item_list(database,cache,search.table,search.filter,search.sort_by,search.page_current,search.page_size,foreign_option).then(([biz_error,items,item_count,page_count])=>{ resolve(items); }).catch(err => { Log.error('Foreign-Get-Data',err); error=Log.append(error,err); }); }else{ resolve([]); } }); } static run_search_item_data = (database,cache,search_item)=> { return new Promise((callback) => { let error = null; let data = null; async.series([ async function(call) { if(search_item.value_type == Data_Value_Type.ITEMS || search_item.value_type == Data_Value_Type.ONE ){ const biz_data = await Foreign.get_items_data(database,cache,search_item); search_item.items = [...biz_data]; }else if(search_item.value_type == Data_Value_Type.COUNT){ const biz_data = await Foreign.get_count_data(database,search_item); search_item.data = biz_data; } }, ]).then(result => { callback(search_item); }).catch(err => { Log.error("Blank-Get",err); callback([error,[]]); }); }); } static get_count_data = (database,search_item) =>{ return new Promise((resolve) => { let data = []; function get_data(search_item,query) { return new Promise((resolve2) => { let search = Data_Logic.get_search(search_item.foreign_table,query,search_item.sort_by,search_item.page_current,search_item.page_size); Adapter.get_count_item_list(database,search.table,search.filter).then(([biz_error,biz_data])=>{ search_item.data = 'applke'; resolve2(biz_data.count?biz_data.count : 0); }).catch(err => { Log.error('Foreign-Get-Data',err); error=Log.append(error,err); }); }); } const run = async () => { for(const search_item_query of search_item.query.$or){ const biz_data = await get_data(search_item,search_item_query); if(search_item.value_type != Data_Value_Type.COUNT){ data.push({id:search_item_query.parent_id,data:biz_data}); }else{ data = biz_data; } } } run().then(() => { resolve(data); }); }); } static get_search_item_data =(database,cache,search_item)=> { return new Promise((callback) => { let error = null; let data = null; async.series([ async function(call) { search_item = await Foreign.run_search_item_data(database,cache,search_item); }, function(call){ Foreign.get_search_item_detail_data(database,cache,search_item).then((error,search_item) => { search_item = search_item; call(); }); }, ]).then(result => { callback(search_item); }).catch(err => { Log.error("Foreign-Get-Search-Item-Data",err); callback([error,[]]); }); }); } static get_search_item_detail_data = async (database,cache,search_item) => { /* options - none */ return new Promise((callback) => { let error = null; var sub_search_foreign_items = []; async.series([ async function(call){ let sub_foreign_search_items = []; if(search_item.value_type != Data_Value_Type.COUNT){ for(const sub_search_item of search_item.foreigns){ let sub_search_foreign_item = Foreign.get_search(sub_search_item); //here2 for(const data_item of search_item.items){ let query_field = {}; query_field[sub_search_foreign_item.foreign_field] = data_item[sub_search_foreign_item.parent_field]; sub_search_foreign_item.query.$or.push(query_field); } sub_search_foreign_item = await Foreign.run_search_item_data(database,cache,sub_search_foreign_item); //here3 sub_search_foreign_items.push(sub_search_foreign_item); for(const data_item of search_item.items){ if(sub_search_foreign_item.value_type == Data_Value_Type.ITEMS){ const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]); data_item[sub_search_foreign_item.title] = []; if(match_items.length>0){ data_item[sub_search_foreign_item.title] = [...match_items]; } }else if(sub_search_foreign_item.value_type == Data_Value_Type.COUNT){ data_item[sub_search_foreign_item.title] = sub_search_foreign_item.data; }else if(sub_search_foreign_item.value_type == Data_Value_Type.ONE){ const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]); if(match_items.length>0){ data_item[sub_search_foreign_item.title] = {}; data_item[sub_search_foreign_item.title] = match_items[0]; }else{ data_item[sub_search_foreign_item.title] = Data_Logic.get_not_found(sub_search_item.foreign_table,0); } } } } } }, async function(call){ var sub_child_search_foreign_items = []; for(const sub_search_main_foreign_item of sub_search_foreign_items){ for(const sub_search_sub_foreign of sub_search_main_foreign_item.foreigns){ let sub_search_foreign_item = Foreign.get_search(sub_search_sub_foreign); for(const sub_child_query_item of sub_search_main_foreign_item.items){ let query_field = {}; query_field[sub_search_foreign_item.foreign_field] = sub_child_query_item[sub_search_foreign_item.parent_field]; sub_search_foreign_item.query.$or.push(query_field); } sub_search_foreign_item = await Foreign.run_search_item_data(database,cache,sub_search_foreign_item); //here3 for(const data_item of sub_search_main_foreign_item.items){ if(sub_search_foreign_item.value_type == Data_Value_Type.ITEMS){ const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]); data_item[sub_search_foreign_item.title] = []; if(match_items.length>0){ data_item[sub_search_foreign_item.title] = [...match_items]; } }else if(sub_search_foreign_item.value_type == Data_Value_Type.COUNT){ data_item[sub_search_foreign_item.title] = sub_search_foreign_item.data; }else if(sub_search_foreign_item.value_type == Data_Value_Type.ONE){ const match_items = sub_search_foreign_item.items.filter(item_find => item_find[sub_search_foreign_item.foreign_field] === data_item[sub_search_foreign_item.parent_field]); if(match_items.length>0){ data_item[sub_search_foreign_item.title] = {}; data_item[sub_search_foreign_item.title] = match_items[0]; }else{ data_item[sub_search_foreign_item.title] = Data_Logic.get_not_found(sub_search_sub_foreign.foreign_table,0); } } } } } }, ]).then(result => { callback([error,search_item]); }).catch(err => { Log.error("Get-Search-Item-Detail",err); callback([err,{}]); }); }); }; static blank = async (database,table,items) => { /* options - none */ return new Promise((callback) => { let error = null; let data = {}; async.series([ async function(call){ const [biz_error,biz_data] = await get(database,table,items); if(biz_error){ error=Log.append(error,biz_error); }else{ data = biz_data; } }, ]).then(result => { callback([error,data]); }).catch(err => { Log.error("Blank-Data",err); callback([err,{}]); }); }); }; } module.exports = { Foreign };