biz9-data
Version:
The BiZ9-Data-Server 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)
634 lines (633 loc) • 25.1 kB
JavaScript
/*
Copyright 2023 Certified CoderZ
Author: certifiedcoderz@gmail.com (Certified CoderZ)
License GNU General Public License v3.0
Description: BiZ9 Framework: Data - Mongo - Adapter
*/
const async = require('async');
const {get_db_connect_main,check_db_connect_main,close_db_connect_main,update_item_main,get_item_main,delete_item_main,get_id_list_main,delete_item_list_main,count_item_list_main} = require('./mongo/index.js');
const {get_cache_connect_main,close_cache_connect_main,get_cache_string_main,delete_cache_string_main,set_cache_string_main} = require('./redis/index.js');
const {DataItem}=require("biz9-logic");
const {Log,Str,Number}=require("biz9-utility");
const DB_TITLE='DB';
const CACHE_TITLE='CACHE';
const NOT_FOUND_TITLE='NOT-FOUND';
const get_db_connect_adapter=(data_config)=>{
return new Promise((callback) => {
get_db_connect_main(data_config).then(([error,data])=>{
data.data_config=data_config;
callback([error,data]);
}).catch(error => {
Log.error("Data-Adapter-Get-DB-Adapter",error);
callback([error,null]);
});
});
}
const close_db_connect_adapter=(db_connect)=>{
return new Promise((callback) => {
close_db_connect_main(db_connect).then(([error,data])=>{
callback([error,data]);
}).catch(error => {
Log.error("Data-Adapter-Close-DB-Connect-Adapter",error);
callback([error,null]);
});
});
}
const check_db_connect_adapter=(db_connect)=>{
return check_db_connect_main(db_connect);
}
const update_item_list_adapter=(db_connect,item_data_list)=>{
return new Promise((callback) => {
let cache_connect = {};
let item_data_new_list=[];
async.series([
function(call) {
get_cache_connect_main(db_connect.data_config).then(([error,data])=>{
cache_connect=data;
call();
}).catch(error=>{
Log.error("Data-Adapter-Update-Item-List-Adapter",error);
callback([error,[]]);
});
},
function(call){
async.forEachOf(item_data_list,(item,key,go)=>{
for(property in item[key]){
if(property!='id'&&property!='data_type'){
if(!item[key][property]){
delete item[key][property];
}
}
}
go();
}, error => {
if(error){
error=error;
}
call();
});
},
function(call){
async.forEachOf(item_data_list,(item,key,go)=>{
if(item){
update_item_main(db_connect,item.data_type,item).then(([error,data]) => {
item.id=data.id;
if(data){
delete_cache_string_main(cache_connect,get_cache_item_attr_list_key(item.data_type,data.id)).then(([error,data]) => {
go();
}).catch(error => {
Log.error("Data-Adapter-Update-Item-List-2",error);
callback([error,null]);
});
}else{
go();
}
}).catch(error => {
Log.error("Data-Adapter-Update-Item-List-3",error);
callback([error,[]]);
});
}else{
go();
}
}, error => {
if(error){
error=error;
}
call();
});
},
async function(call){
for(const item of item_data_list){
item.source=DB_TITLE;
item.app_id = db_connect.data_config.APP_ID;
item_data_new_list.push(item);
}
},
function(call){
close_cache_connect_main(cache_connect).then(([error,data])=>{
call();
}).catch(error => {
Log.error("Data-Adapter-Update-Item-List-4-Error",error);
callback([error,[]]);
});
},
]).then(result=>{
callback([error,item_data_new_list]);
}).catch(error => {
Log.error("Data-Adapter-Update-Item-List-5",error);
callback([error,[]]);
});
});
}
const update_item_adapter=(db_connect,data_type,item_data) => {
return new Promise((callback) => {
let cache_connect={};
async.series([
function(call){
get_cache_connect_main(db_connect.data_config).then(([error,data])=>{
cache_connect=data;
call();
}).catch(error=>{
Log.error("Data-Adapter-Update-Item-Adapter",error);
callback([error,[]]);
});
},
function(call){
update_item_main(db_connect,data_type,item_data).then(([error,data])=>{
call();
}).catch(error=>{
Log.error("Data-Adapter-Update-Item-Adapter-2",error);
callback([error,[]]);
});
},
function(call){
item_data.app_id=db_connect.data_config.APP_ID;
if(item_data.id){
item_data.source=DB_TITLE;
}
call();
},
function(call){
delete_cache_string_main(cache_connect,get_cache_item_attr_list_key(item_data.data_type,item_data.id)).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Update-Item-Adapter-3",error);
callback([error,[]]);
});
},
function(call) {
close_cache_connect_main(cache_connect).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Update-Item-Adapter-4",error);
callback([error,[]]);
});
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Data-Adapter-Update-Item-Adapter-END",error);
callback([error,[]]);
});
});
}
const get_item_list_adapter = (db_connect,data_type,filter,sort_by,page_current,page_size) => {
return new Promise((callback) => {
let cache_connect = {};
let item_data_count = 0;
let item_id_list = [];
let item_data_list = [];
async.series([
function(call) {
get_cache_connect_main(db_connect.data_config).then(([error,data]) => {
cache_connect = data;
call();
}).catch(error => {
Log.error("Get-Item-List-Adapter",error);
callback([error,[]]);
});
},
function(call) {
if(!page_current){
page_current=1;
}
get_id_list_main(db_connect,data_type,filter,sort_by,page_current,page_size).then(([error,total_count,data_list]) => {
error=error;
item_data_count=total_count;
if(data_list.length>0){
item_id_list=data_list;
}
call();
}).catch(error => {
Log.error("Get-Item-List-Adapter-2",error);
callback([error,[]]);
});
},
async function(call) {
if(item_id_list.length>0){
for(const item of item_id_list) {
[error,data] = await get_item_cache_db(cache_connect,db_connect,data_type,item.id);
if(data){
item_data_list.push(data);
}
}
}
},
]).then(result => {
callback([error,item_data_list,item_data_count,Math.round(item_data_count/page_size+1)]);
}).catch(error => {
Log.error("Get-Item-List-Adapter-3",error);
callback([error,[]]);
});
});
}
const get_item_adapter = (db_connect,data_type,key,option) => {
return new Promise((callback) => {
if(!option){
option = {};
}
let cache_connect = {};
let cache_found = false;
let item_data = {};
let cache_key_list = null;
let cache_string_list = [];
async.series([
function(call) {
get_cache_connect_main(db_connect.data_config).then(([error,data]) => {
cache_connect = data;
call();
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter",error);
callback([error,null]);
});
},
function(call) {
if(option.title_url && !Number.check_is_guid(option.title_url)){
item_data = DataItem.get_new(data_type,0,{title_url:option.title_url});
let filter={title_url:option.title_url};
let sort_by={};
let page_current=1;
let page_size=3;
get_item_list_adapter(db_connect,data_type,filter,sort_by,page_current,page_size).then(([error,data]) => {
if(data.length>0){
item_data = data[0];
}else{
item_data = DataItem.get_new(data_type,0,{title_url:option.title_url,source:NOT_FOUND_TITLE,items:[],photos:[]});
}
call();
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-2",error);
callback([error,null]);
});
}else{
item_data = DataItem.get_new(data_type,key);
get_item_cache_db(cache_connect,db_connect,data_type,key).then(([error,data]) => {
if(data){
item_data = data;
}
call();
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-2",error);
callback([error,null]);
});
}
},
function(call) {
close_cache_connect_main(cache_connect).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-3",error);
callback([error,null]);
});
}
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-4",error);
callback([error,null]);
});
});
}
const set_cache_item = (cache_connect,data_type,id,item_data) => {
return new Promise((callback) => {
let cache_string_str = '';
let prop_list = [];
async.series([
function(call) {
for (prop in item_data) {
if(prop != '_id' && prop != 'source'){
prop_list.push({title:prop,value:item_data[prop]});
}
}
call();
},
async function(call) {
for(const item of prop_list) {
cache_string_str=cache_string_str+item.title+',';
await set_cache_string_main(cache_connect,get_cache_item_attr_key(data_type,id,item.title), item.value);
}
},
function(call) {
set_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id),cache_string_str).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Set-Cache-Item",error);
callback([error,null]);
});
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Data-Adapter-Set-Cache-Item-2",error);
callback([error,null]);
});
});
}
const delete_item_adapter = (db_connect,data_type,id) => {
return new Promise((callback) => {
let item_data = DataItem.get_new(data_type,id);
async.series([
function(call) {
delete_item_cache_db(db_connect,data_type,id).then(([error,data]) => {
item_data = data;
item_data.app_id=db_connect.data_config.APP_ID;
call();
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-2",error);
callback([error,null]);
});
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Adapter-Get-Item-Adapter-4",error);
callback([error,null]);
});
});
}
const get_item_cache_db = (cache_connect,db_connect,data_type,id) => {
return new Promise((callback) => {
let cache_found = false;
let cache_key_list = null;
let item_data = DataItem.get_new(data_type,id);
let cache_string_list = [];
async.series([
function(call) {
get_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id)).then(([error,data]) => {
cache_key_list=data;
call();
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-DB",error);
callback([error,null]);
});
},
async function(call) {
if(cache_key_list!=null){
cache_found = true;
cache_string_list =cache_key_list.split(',');
}
for(const item of cache_string_list) {
if(item){
const [error,val] = await get_cache_string_main(cache_connect,get_cache_item_attr_key(data_type,id,item));
if(val){
item_data[item] = val;
}else{
item_data[item] = null;
}
}
}
},
function(call){
if(cache_found){
item_data.source=CACHE_TITLE;
call();
}
else{
get_item_main(db_connect,data_type,id).then(([error,data]) => {
if(data){
item_data = data;
item_data.source = DB_TITLE;
set_cache_item(cache_connect,data_type,id,data).then(([error,data2]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-DB-2",error);
callback([error,null]);
});
}else{
item_data.source = NOT_FOUND_TITLE;
call();
}
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-DB-3",error);
callback([error,null]);
});
}
},
function(call) {
item_data.app_id=db_connect.data_config.APP_ID;
call();
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-DB",error);
callback([error,null]);
});
});
}
const delete_item_list_adapter = (db_connect,data_type,filter) => {
return new Promise((callback) => {
let item_id_list = [];
let item_data_new_list = [];
async.series([
function(call) {
get_id_list_main(db_connect,data_type,filter,{},0,9999).then(([error,total_count,data_list]) => {
error=error;
total_count=total_count;
item_id_list=data_list;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-List-Adapter-2",error);
callback([error,[]]);
});
},
function(call){
delete_item_list_main(db_connect,data_type,filter).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-List-Adapter",error);
callback([error,[]]);
});
},
async function(call) {
var list = [];
for(const item of item_id_list) {
[error,data] = await delete_item_cache_db(db_connect,data_type,item.id);
item_data_new_list.push(data);
}
},
]).then(result => {
callback([error,item_data_new_list]);
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-List-Adapter-3",error);
callback([error,[]]);
});
});
}
const delete_item_cache=(db_connect,data_type,id)=>{
return new Promise((callback)=>{
let cache_connect = {};
let cache_key_list = '';
let cache_string_list = '';
let item_data = DataItem.get_new(data_type,id);
async.series([
function(call) {
get_cache_connect_main(db_connect.data_config).then(([error,data]) => {
cache_connect = data;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-1",error);
callback([error,null]);
});
},
function(call) {
get_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id)).then(([error,data]) => {
cache_key_list=data;
call();
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-2",error);
callback([error,null]);
});
},
async function(call) {
if(cache_key_list!=null){
cache_string_list =cache_key_list.split(',');
}
for(const item of cache_string_list) {
if(item){
const [error,val] = await delete_cache_string_main(cache_connect,get_cache_item_attr_key(data_type,id,item));
}
}
},
function(call){
delete_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id)).then(([error,data]) => {
item_data.cache_del = true;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-3",error);
callback([error,null]);
});
},
function(call) {
close_cache_connect_main(cache_connect).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB-4",error);
callback([error,null]);
});
},
function(call) {
item_data.app_id=db_connect.data_config.APP_ID;
call();
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-5",error);
callback([error,null]);
});
});
}
const delete_item_cache_db = (db_connect,data_type,id) => {
return new Promise((callback) => {
let cache_connect = {};
let cache_key_list = '';
let cache_string_list = '';
let item_data = DataItem.get_new(data_type,id);
async.series([
function(call) {
get_cache_connect_main(db_connect.data_config).then(([error,data]) => {
cache_connect = data;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB",error);
callback([error,null]);
});
},
function(call) {
get_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id)).then(([error,data]) => {
cache_key_list=data;
call();
}).catch(error => {
Log.error("Data-Adapter-Get-Item-Cache-DB",error);
callback([error,null]);
});
},
async function(call) {
if(cache_key_list!=null){
cache_string_list =cache_key_list.split(',');
}
for(const item of cache_string_list) {
if(item){
const [error,val] = await delete_cache_string_main(cache_connect,get_cache_item_attr_key(data_type,id,item));
}
}
},
function(call){
delete_cache_string_main(cache_connect,get_cache_item_attr_list_key(data_type,id)).then(([error,data]) => {
item_data.cache_del = true;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB-2",error);
callback([error,null]);
});
},
function(call){
delete_item_main(db_connect,data_type,id).then(([error,data]) => {
item_data.db_del = true;
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB-3",error);
callback([error,null]);
});
},
function(call) {
close_cache_connect_main(cache_connect).then(([error,data]) => {
call();
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB-4",error);
callback([error,null]);
});
},
function(call) {
item_data.app_id=db_connect.data_config.APP_ID;
call();
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Data-Adapter-Delete-Item-Cache-DB-5",error);
callback([error,null]);
});
});
}
const count_item_list_adapter = (db_connect,data_type,filter) => {
return new Promise((callback) => {
let item_list_count = 0;
async.series([
function(call) {
count_item_list_main(db_connect,data_type,filter).then(([error,data]) => {
item_list_count = data;
call();
}).catch(error => {
Log.error("Data-Adapter-Count-Item-List",error);
callback([error,null]);
});
},
]).then(result => {
callback([error,item_list_count]);
}).catch(error => {
Log.error("Data-Adapter-Count-Item-List",error);
callback([error,null]);
});
});
}
const get_cache_item_attr_key = (data_type,id,key) => {
return data_type + "_" + key + "_" + String(id);
}
const get_cache_item_attr_list_key = (data_type,id) => {
return data_type+"_aik_"+String(id);
}
module.exports = {
get_db_connect_adapter,
check_db_connect_adapter,
close_db_connect_adapter,
update_item_adapter,
update_item_list_adapter,
get_item_adapter,
get_item_list_adapter,
delete_item_list_adapter,
count_item_list_adapter,
delete_item_adapter,
delete_item_cache
};