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)
1,224 lines (1,218 loc) • 50.7 kB
JavaScript
/*
Copyright 2023 Certified CoderZ
Author: certifiedcoderz@gmail.com (Certified CoderZ)
License GNU General Public License v3.0
Description: BiZ9 Framework: Data
*/
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 {Scriptz}=require("biz9-scriptz");
const {Log,Str,Number}=require("biz9-utility");
const {DataItem,DataType,FieldType}=require("biz9-logic");
const { get_db_connect_adapter,check_db_connect_adapter,close_db_connect_adapter,update_item_adapter,update_item_list_adapter,get_item_adapter,delete_item_adapter,get_item_list_adapter,delete_item_list_adapter,count_item_list_adapter,delete_item_cache } = require('./adapter.js');
const {get_database_main} = require("./main");
class Database {
static get = async (data_config,option) => {
/* return
* - n/a
* option params
* - biz9_config_file
* - source file for data config. / obj / ex. root folder biz9_config.
* - app_id
* - database id. / string / ex. project_500
*/
let cloud_error=null;
return new Promise((callback) => {
if(option==null){
option = {biz9_config_file:null,app_id:null};
}
if(option.biz9_config_file==null){
option.biz9_config_file=null;
}else{
data_config = Scriptz.get_biz9_config(option);
}
if(option.app_id){
data_config.app_id = option.app_id;
}
if(data_config.app_id==null){
cloud_error=Log.append(cloud_error,"Database Error: Missing app_id.");
}
Data.open_db(data_config).then(([error,data])=>{
cloud_error=Log.append(cloud_error,error);
data.data_config=data_config;
data.app_id=data_config.APP_ID;
callback([error,data]);
}).catch(error => {
cloud_error=Log.append(cloud_error,error);
Log.error("BiZItem-Get-Connect",error);
callback([error,null]);
});
});
}
static close = async (database) => {
/* option params
* - database
* - connected database. / obj / ex. mongo db connection.
* return objects
* - database
* - Disconnect database. / obj / ex. null. dispose db obj.
* - app_id
* - database id. / string / ex. project_500
*/
return new Promise((callback) => {
Data.close(database).then(([error,data])=>{
cloud_error=Log.append(cloud_error,error);
callback([error,data]);
}).catch(error => {
cloud_error=Log.append(cloud_error,error);
Log.error("DB-Close",error);
callback([error,null]);
});
});
}
}
class List {
static get_parent_child_list = (full_item_list) => {
/* option params
* - full_item_list
* - List of objects. Bind all child id values to matching parent id. / list / ex. Products and child attributes items.
* return objects
* - full_item_list
* - Binded list of objects. / list / ex. Products now binded to child items.
*/
return new Promise((callback) => {
let new_item_list=[];
async.series([
function(call){
for(let a=0; a<full_item_list.length; a++){
let item_title_url = Str.get_title_url(full_item_list[a].title);
let new_item = full_item_list[a];
new_item.items = [];
new_item_list[item_title_url] = full_item_list[a];
new_item_list[item_title_url].items = [];
for(let b=0;b<full_item_list.length;b++){
if(full_item_list[a].id == full_item_list[b].parent_id){
new_item.items.push(full_item_list[b]);
}
}
new_item_list.push(new_item);
}
call();
},
function(call){
for(let a=0; a<new_item_list.length; a++){
let item_title_url = Str.get_title_url(new_item_list[a].title);
let new_item = new_item_list[a];
new_item.items=[];
new_item_list[item_title_url] = new_item_list[a];
new_item_list[item_title_url].items =[];
for(let b=0;b<new_item_list.length;b++){
let sub_item_title_url = Str.get_title_url(new_item_list[b].title);
if(new_item_list[a].id == new_item_list[b].parent_id){
let sub_item = new_item_list[b];
sub_item.items = [];
new_item.items.push(sub_item);
new_item_list[a][sub_item_title_url] = sub_item;
new_item_list[a][sub_item_title_url].items = [];
}
}
}
call();
},
]).then(result => {
callback([error,new_item_list]);
}).catch(error => {
Log.error("Portal-Get",error);
callback([error,[]]);
});
});
};
}
class Page {
//class Page
static get = async (database,key,option) => {
/* option params
* - database
* - tbd
* - key
* - tbd
* - option
* - get_photos / bool / ex. true,false / def. true
* - photo_count / int / ex. 1-999 / def. 19
* - photo_sort_by / query obj / ex. {date_create:1}
* return objects
* - page
* - tbd
*/
return new Promise((callback) => {
let error = null;
let data_type = DataType.PAGE;
let cloud_data = {};
let page = {data_type:DataType.PAGE,id:0,photos:[],items:[]};
let business = {data_type:DataType.BUSINESS,id:0};
let full_item_list = [];
let new_item_list = [];
if(option == null){
option = {get_items:false,get_photos:false}
}
if(option.get_items==null){
option.get_items=false;
}
if(option.get_photos==null){
option.get_photos=false;
}
async.series([
function(call){
if(Number.check_is_guid(key)){
Data.get_item(database,data_type,key).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
page = data;
page.items = [];
page.photos = [];
}
call();
}).catch(error => {
Log.error("Portal-Get-Key-A",error);
error = Log.append(error,error);
call();
});
}else{
let filter = {};
if(key){
filter = {title_url:key};
}
let sort_by = {title:-1};
let page_current = 1;
let page_size = 3;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
page = data[0];
page.items = [];
page.photos = [];
}
}
call();
}).catch(error => {
Log.error("Portal-Get-Key-B",error);
error = Log.append(error,error);
call();
});
}
},
function(call){
if(page.id && option.get_items){
let filter={top_id:page.id};
let data_type = DataType.ITEM;
let sort_by={title:-1};
let page_current = 1;
let page_size = 999;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length > 0){
full_item_list = data;
}
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
}else{
call();
}
},
async function(call){
if(page.id && option.get_items){
const [error,data] = await List.get_parent_child_list(full_item_list);
new_item_list = data;
}
},
function(call){
if(page.id && option.get_items){
for(let a=0; a<new_item_list.length; a++){
new_item_list[a].items = [];
let item_title_url = Str.get_title_url(new_item_list[a].title);
page[item_title_url] = new Object();
for(let b=0;b<new_item_list.length;b++){
if(new_item_list[a].parent_id == new_item_list[b].id){
new_item_list[a].items.push(new_item_list[b]);
}
}
page[item_title_url] = new_item_list[a];
page.items.push(new_item_list[a]);
}
call();
}
else{
call();
}
},
async function(call){
if(option.get_photos){
if(option.photo_count == null){
option.photo_count = 19;
}
if(option.photo_sort_by == null){
option.photo_sort_by = {date_create:1};
}
let filter = {parent_id:page.id};
let sort_by = option.photo_sort_by;
let page_current = 1;
let page_size = option.photo_count;
const [error,data] = await Portal.get_list(database,DataType.PHOTO,filter,sort_by,page_current,page_size,option);
if(data.item_list.length > 0){
page.photos = data.item_list;
}
}
},
function(call){
let filter = {};
let sort_by = {};
let data_type = DataType.BUSINESS;
let page_current = 1;
let page_size = 3;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
business = data[0];
}
}
call();
}).catch(error => {
Log.error("Portal-Get-Key-B",error);
error = Log.append(error,error);
call();
});
},
]).then(result => {
cloud_data.page = page;
cloud_data.business = business;
callback([error,cloud_data]);
}).catch(error => {
Log.error("Page-Get",error);
callback([error,[]]);
});
});
};
}
class Category {
static get_category_product_group_list = async (database,filter,option) => {
/* option params
* - database
* - tbd
* - filter
* - tbd
* - option
* - get_product / bool / ex. true,false / def. true
* - product_count / int / ex. 1-999 / def. 19
* - product_sort_by / query obj / ex. {date_create:1}
* return objects
* - category_list
* - product_count
* - product_list
*
*/
return new Promise((callback) => {
let error = null;
let data_type = DataType.PRODUCT;
let category_list = [];
let product_list = [];
if(option == null){
option = {get_product:false,product_sort_by:{}};
}
if(option.get_product==null){
option.get_product = false;
}
if(option.product_sort_by==null){
option.product_sort_by = {date_create:1};
}
async.series([
function(call){
let data_type = DataType.CATEGORY;
let sort_by = {};
let page_current = 1;
let page_size = 999;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
category_list = data;
}
}
call();
}).catch(error => {
Log.error("Category-Get-Group-Product-1",error);
error = Log.append(error,error);
call();
});
},
function(call){
let sort_by = {};
let data_type = DataType.PRODUCT;
let filter = {};
let page_current = 1;
let page_size = 999;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
product_list = data;
}
}
call();
}).catch(error => {
Log.error("Category-Get-Group-Product-2",error);
error = Log.append(error,error);
call();
});
},
function(call){
for(let a = 0;a<category_list.length;a++){
category_list[a].product_count = 0;
category_list[a].products = [];
for(let b = 0;b<product_list.length;b++){
if(category_list[a].title == product_list[b].category){
category_list[a].product_count = category_list[a].product_count + 1;
let add = true;
for(let c = 0;c<category_list[a].products.length;c++){
if(category_list[a].products[c].id == product_list[b].id){
add = false;
}
}
if(add){
category_list[a].products.push(product_list[b]);
}
}
}
}
call();
},
]).then(result => {
callback([error,business]);
}).catch(error => {
Log.error("Business-Get",error);
callback([error,[]]);
});
});
};
}
class Business {
static get = async (database,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let data_type = DataType.BUSINESS;
let business = {data_type:DataType.BUSINESS,id:0};
if(option == null){
option = {};
}
async.series([
function(call){
let filter = {};
let sort_by = {};
let page_current = 1;
let page_size = 3;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
business = data[0];
}
}
call();
}).catch(error => {
Log.error("Portal-Business",error);
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,business]);
}).catch(error => {
Log.error("Business-Get",error);
callback([error,[]]);
});
});
};
}
class Admin {
static get = async (database,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let data_type = DataType.ADMIN;
let admin = {data_type:DataType.ADMIN,id:0};
if(option == null){
option = {};
}
async.series([
function(call){
let filter = {};
let sort_by = {};
let page_current = 1;
let page_size = 3;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
admin = data[0];
}
}
call();
}).catch(error => {
Log.error("Portal-Admin",error);
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,admin]);
}).catch(error => {
Log.error("Admin-Get",error);
callback([error,[]]);
});
});
};
}
class Portal {
static get_list = (database,data_type,filter,sort_by,page_current,page_size,option) => {
/* option params
* Items
* - get_items / bool / ex. true,false / def. true
* Photos
* - get_photos / bool / ex. true,false / def. true
* - photo_count / int / ex. 1-999 / def. 19
* - photo_sort_by / query obj / ex. {date_create:1}
*/
return new Promise((callback) => {
let cloud_data = {item_list:[],item_count:0,page_count:0};
let error=null;
if(option==null){
option = {get_items:true};
}
async.series([
function(call){
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=>{
if(error){
error=Log.append(error,error);
}else{
cloud_data.item_count=item_count;
cloud_data.page_count=page_count;
cloud_data.filter=filter;
cloud_data.data_type=data_type;
if(data.length>0){
cloud_data.item_list=data;
call();
}else{
call();
}
}
}).catch(error => {
error=Log.append(error,error);
});
},
async function(call){
if(option.get_items){
const [error,data] = await List.get_parent_child_list(cloud_data.item_list);
cloud_data.item_list = data;
}
},
]).then(result => {
callback([error,cloud_data]);
}).catch(error => {
Log.error("Portal-Get",error);
callback([error,[]]);
});
});
};
static get = async (database,data_type,key,option) => {
/*
*
* Params
* - title
* - description: n/a / type: n/a / example: n/a / required: n/a
*
* Option
* - get_items
* - description: n/a / type: bool / example: true / required: false
* - get_photos
* - description: n/a / type: bool / example: true / required: false
* - photo_count
* - description: n/a / type: int / example: 19 / required: false
* - photo_sort_by
* - description: n/a / type: obj / example: {date_create:1} / required: false
* Return
* - title
* - description: n/a / type: n/a
*
*/
return new Promise((callback) => {
let error = null;
let top_item = {data_type:data_type,id:0,photos:[],items:[]};
let full_item_list = [];
let new_item_list = [];
if(option == null){
option = {get_items:false,get_photos:false,title_url:null}
}
if(option.get_items==null){
option.get_items=false;
}
if(option.get_photos==null){
option.get_photos=false;
}
async.series([
function(call){
if(!Number.check_is_guid(key)){
option.title_url = key;
}
call();
},
function(call){
Data.get_item(database,data_type,key,option).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
top_item = data;
top_item.items = [];
top_item.photos = [];
}
call();
}).catch(error => {
Log.error("Portal-Get-Key-A",error);
error = Log.append(error,error);
call();
});
},
function(call){
if(top_item.id && option.get_items){
let filter={top_id:top_item.id};
let data_type = DataType.ITEM;
let sort_by={title:-1};
let page_current = 1;
let page_size = 999;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length > 0){
full_item_list = data;
}
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
}else{
call();
}
},
async function(call){
if(top_item.id && option.get_items){
const [error,data] = await List.get_parent_child_list(full_item_list);
new_item_list = data;
}
},
function(call){
if(top_item.id && option.get_items){
for(let a=0; a<new_item_list.length; a++){
new_item_list[a].items = [];
let item_title_url = Str.get_title_url(new_item_list[a].title);
top_item[item_title_url] = new Object();
for(let b=0;b<new_item_list.length;b++){
if(new_item_list[a].parent_id == new_item_list[b].id){
new_item_list[a].items.push(new_item_list[b]);
}
}
top_item[item_title_url] = new_item_list[a];
top_item.items.push(new_item_list[a]);
}
call();
}
else{
call();
}
},
async function(call){
if(option.get_photos){
if(option.photo_count == null){
option.photo_count = 19;
}
if(option.photo_sort_by == null){
option.photo_sort_by = {date_create:1};
}
let filter = {parent_id:top_item.id};
let sort_by = option.photo_sort_by;
let page_current = 1;
let page_size = option.photo_count;
const [error,data] = await Portal.get_list(database,DataType.PHOTO,filter,sort_by,page_current,page_size,option);
if(data.item_list.length > 0){
top_item.photos = data.item_list;
}
}
},
]).then(result => {
callback([error,top_item]);
}).catch(error => {
Log.error("Portal-Get",error);
callback([error,[]]);
});
});
};
static update = async (database,data_type,item_data,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let item = DataItem.get_new(data_type,0);
if(option == null){
option = {};
}
async.series([
function(call){
Data.update_item(database,data_type,item_data).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,item]);
}).catch(error => {
Log.error("Update-Item",error);
callback([error,[]]);
});
});
};
static delete_cache_item = async (database,data_type,key,option) => {
/*
* params
* - title_tbd
* - description. / type / ex.
* option
* - title_tbd
* - description. / type / ex.
* return
* - title_tbd
* - description. / type / ex.
*
*/
return new Promise((callback) => {
let error = null;
let item = DataItem.get_new(data_type,0);
if(option == null){
option = {};
}
async.series([
function(call){
if(Number.check_is_guid(key)){
Data.get_item(database,data_type,key).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item = data;
}
call();
}).catch(error => {
Log.error("Delete-Cache-Item-A",error);
error = Log.append(error,error);
call();
});
}else{
let filter = {};
if(key){
filter = {title_url:key};
}
let sort_by = {title:-1};
let page_current = 1;
let page_size = 3;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length>0){
item = data[0];
}
}
call();
}).catch(error => {
Log.error("Delete-Cache-Item-B",error);
error = Log.append(error,error);
call();
});
}
},
function(call){
Data.delete_cache_item(database,data_type,item.id).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,item]);
}).catch(error => {
Log.error("Delete-Cache-Item",error);
callback([error,[]]);
});
});
};
static delete = async (database,data_type,id,option) => {
/*
* Params
* - title
* - description / type / example / required
* Option
* - delete_items
* - description / bool / example / default: false
* - delete_photos
* - description / bool / example / default: false
* Return
* - title
* - description / type /
*/
return new Promise((callback) => {
let error = null;
let item = DataItem.get_new(data_type,id,{delete_items:false,delete_photos:false});
if(option == null){
option = {delete_items:false,delete_photos:false};
}
if(option.delete_items==null){
option.delete_items=false;
}
if(option.delete_photos==null){
option.delete_photos=false;
}
async.series([
function(call){
Data.delete_item(database,data_type,id).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
function(call){
if(option.delete_items){
let data_type = DataType.ITEM;
let filter = {parent_id:item.id};
Data.delete_list(database,data_type,filter).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item.delete_items = true;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
}else{
call();
}
},
function(call){
if(option.delete_photos){
let data_type = DataType.PHOTO;
let filter = {parent_id:item.id};
Data.delete_list(database,data_type,filter).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item.delete_photos = true;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
}else{
call();
}
},
]).then(result => {
callback([error,item]);
}).catch(error => {
Log.error("Delete-Item",error);
callback([error,[]]);
});
});
};
//class Portal
static update_list = async (database,item_data_list,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let item_list = [];
if(option == null){
option = {}
}
async.series([
function(call){
Data.update_list(database,item_data_list).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item_list = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,item_list]);
}).catch(error => {
Log.error("Update-List",error);
callback([error,[]]);
});
});
};
static delete_list = async (database,data_type,filter,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let item_list = [];
if(option == null){
option = {};
}
async.series([
function(call){
Data.delete_list(database,data_type,filter).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
item_list = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,item_list]);
}).catch(error => {
Log.error("Delete-List",error);
callback([error,[]]);
});
});
};
static count = async (database,data_type,filter,option) => {
/* option params
* n/a
*/
return new Promise((callback) => {
let error = null;
let count = 0;
if(option == null){
option = {};
}
async.series([
function(call){
Data.count_list(database,data_type,filter).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
count = data;
}
}).catch(error => {
error = Log.append(error,error);
call();
});
},
]).then(result => {
callback([error,count]);
}).catch(error => {
Log.error("Count-List",error);
callback([error,[]]);
});
});
};
static copy = async (database,data_type,id,option) => {
/*
* params
* - title_tbd
* - description. / type / ex.
* options
* - title_tbd
* - description. / type / ex.
* return
* - title_tbd
* - description. / type / ex.
*
*/
return new Promise((callback) => {
let error = null;
let top_item = {data_type:data_type,id:0,photos:[],items:[]};
let copy_top_item = {data_type:data_type,id:0,photos:[],items:[]};
let item_list = [];
let copy_item_list = [];
if(option == null){
option = {get_items:false,get_photos:false}
}
async.series([
function(call){
Data.get_item(database,data_type,id).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}
top_item=data;
call();
})
},
function(call){
copy_top_item[FieldType.TITLE] = 'Copy '+top_item[FieldType.TITLE];
copy_top_item[FieldType.TITLE_URL] = 'copy_'+top_item[FieldType.TITLE_URL];
copy_top_item[FieldType.SOURCE_ID] = top_item.id;
copy_top_item[FieldType.SOURCE_DATA_TYPE] = top_item.data_type;
for(const key in top_item) {
if(key!=FieldType.ID&&key!=FieldType.SOURCE&&key!=FieldType.TITLE&&key!=FieldType.TITLE_URL){
copy_top_item[key]=top_item[key];
}
}
call();
},
function(call){
Data.update_item(database,copy_top_item.data_type,copy_top_item).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
copy_top_item=data;
}
call();
}).catch(error => {
error=Log.append(error,error);
call();
});
},
function(call){
if(top_item.id){
let filter={top_id:top_item.id};
let data_type=DataType.ITEM;
let sort_by={title:-1};
let page_current = 1;
let page_size = 999;
Data.get_list(database,data_type,filter,sort_by,page_current,page_size).then(([error,data,item_count,page_count])=> {
if(error){
error=Log.append(error,error);
}else{
if(data.length > 0){
item_list = data;
}
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
}else{
call();
}
},
function(call){
let source_top_items = [];
for(let a=0;a<item_list.length;a++){
let copy_sub_item={data_type:DataType.ITEM,id:0,top_id:copy_top_item.id,top_data_type:copy_top_item.data_type};
copy_sub_item[FieldType.SOURCE_ID] = item_list[a].id;
copy_sub_item[FieldType.SOURCE_DATA_TYPE] = item_list[a].data_type;
copy_sub_item[FieldType.SOURCE_PARENT_ID] = item_list[a].parent_id;
copy_sub_item[FieldType.SOURCE_PARENT_DATA_TYPE] = item_list[a].parent_data_type;
copy_sub_item[FieldType.SOURCE_TOP_ID] = item_list[a].top_id;
copy_sub_item[FieldType.SOURCE_TOP_DATA_TYPE] = item_list[a].top_data_type;
for(const key in item_list[a]) {
if( key != FieldType.ID && key != FieldType.SOURCE && key != FieldType.PARENT_ID && key != FieldType.PARENT_DATA_TYPE ){
copy_sub_item[key] = item_list[a][key];
}
}
copy_item_list.push(copy_sub_item);
}
call();
},
function(call){
Data.update_list(database,copy_item_list).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}
copy_item_list=data;
call();
})
},
function(call){
for(let a=0;a<copy_item_list.length;a++){
if(copy_item_list[a][FieldType.SOURCE_PARENT_ID] == top_item.id){
copy_item_list[a][FieldType.PARENT_ID] = copy_top_item[FieldType.ID];
copy_item_list[a][FieldType.PARENT_DATA_TYPE] = copy_top_item[FieldType.DATA_TYPE];
}else{
for(let b=0;b<copy_item_list.length;b++){
if(copy_item_list[a][FieldType.SOURCE_PARENT_ID] == copy_item_list[b][FieldType.SOURCE_ID] && !copy_item_list[a][FieldType.PARENT_ID] ){
copy_item_list[a][FieldType.PARENT_ID] = copy_item_list[b][FieldType.ID];
copy_item_list[a][FieldType.PARENT_DATA_TYPE] = copy_item_list[b][FieldType.DATA_TYPE];
}
}
}
}
call();
},
function(call){
Data.update_list(database,copy_item_list).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}
copy_item_list=data;
call();
})
},
]).then(result => {
callback([error,copy_top_item]);
}).catch(error => {
Log.error("Blank-Get",error);
callback([error,[]]);
});
});
};
}
class Blank {
static get = async (database,data_type,title_url,option) => {
/*
*
* Params
* - title
* - description: n/a / type: n/a / example: n/a / required: true
*
* Option
* - title
* - description: n/a / type: n/a / example: n/a / required: false
*
* Return
* - title
* - description: n/a / type: n/a
*
*/
return new Promise((callback) => {
let error = null;
let top_item = {data_type:data_type,id:0,photos:[],items:[]};
if(option == null){
option = {get_items:false,get_photos:false}
}
async.series([
function(call){
Data.get(database).then(([error,data])=> {
if(error){
error=Log.append(error,error);
}else{
top_item = data;
}
call();
}).catch(error => {
error = Log.append(error,error);
call();
});
},
function(call){
},
]).then(result => {
callback([error,item_data]);
}).catch(error => {
Log.error("Blank-Get",error);
callback([error,[]]);
});
});
};
}
class Faq{
static get = (database,title_url,option) => {
return new Promise((callback) => {
let faq = DataItem.get_new(DataType.FAQ,0,{questions:[]});
let error = null;
let items = [];
series([
async function(call){
const [error,data] = await Portal.get(database,DataType.FAQ,title_url,option);
if(data.id){
faq=data;
faq.questions=[];
}
call();
},
async function(call){
for(let a=0;a<19;a++){
if(faq[faq["field_"+a]]){
faq.questions.push({question:faq["field_"+a],answer:faq[faq["field_"+a]]});
}
}
call();
},
],
function(error, result){
callback([error,faq]);
});
});
}
}
class Data {
static open_db = async (data_config) => {
return [error,data] = await get_db_connect_adapter(data_config);
};
static close_db = async (db_connect) => {
return [error,data] = await close_db_connect_adapter(db_connect);
};
static check_db = async (db_connect) => {
return check_db_connect_adapter(db_connect);
};
static update_item = async (db_connect,data_type,item_data) => {
return [error,data] = await update_item_adapter(db_connect,data_type,item_data);
};
static get_item = async (db_connect,data_type,key,option) => {
return [error,data] = await get_item_adapter(db_connect,data_type,key,option);
};
static delete_item = async (db_connect,data_type,id) => {
return [error,data] = await delete_item_adapter(db_connect,data_type,id);
};
static delete_cache_item = async (db_connect,data_type,id) => {
return [error,data] = await delete_item_cache(db_connect,data_type,id);
};
static update_list = async (db_connect,item_data_list) => {
return [error,data] = await update_item_list_adapter(db_connect,item_data_list);
};
static get_list = async (db_connect,data_type,filter,so