flexbiz-server
Version:
Flexible Server
24 lines (23 loc) • 11.8 kB
JavaScript
require("../global");const async=require("async"),model=global.getModel("app"),Participant=global.getModel("participant"),fs=require("fs"),JSZip=require("jszip");require("../libs/prototypes.js");const _=require("lodash"),{workerData}=require("worker_threads"),{ObjectId}=require("mongodb");let connect2Db=!1;
const v8=require("v8"),{postToParent,onParentMessage}=require("./worker-utils"),coll_ex="user.js app.js dvcs socais socaitmps vatras vatvaos tdttnos tdttcos tdttno_tts tdttco_tts files folders notes accounts dmdvts currencies dmvts sokhos sokhotts sokhokhongtons sokhocapphats cdvts dmnvs cdnpheps bangtinhluongs cdkhs cdkts cddts cddiems sophanbokhs sotinhkhs qtsdieuchinhs hspbts dmqcts pkts pkcs dmkcs calllogs".split(" "),restoreColl=async($id_app$$,$dvcs_pairs$$,$data$$,$colls$$)=>(await Promise.all($colls$$.map($col_name$$=>
{Logger.info("[restoreApp] restore ",$col_name$$,"...");return new Promise(($resolve$$,$reject$$)=>{let $rows$$=$data$$[$col_name$$]||[];$rows$$.forEach(($r$$,$index$$)=>{let $time$$=(new Date).getTime();$r$$.index=$index$$+$time$$;$r$$.line=$index$$+$time$$;$r$$.nh_dk=$index$$+$time$$});mongoose.connection.db.collection($col_name$$,($err$$,$coll$$)=>{if($err$$)return $reject$$($err$$);if(!$coll$$)return Logger.error("can't insert data, collection",$col_name$$,"is not exists"),$resolve$$([]);$coll$$.deleteMany({id_app:$id_app$$},
$e$$=>{if($e$$)return $reject$$($e$$);if($rows$$.length===0)return $resolve$$([]);insert($col_name$$,$coll$$,$rows$$,$id_app$$,$dvcs_pairs$$).then($pairs$$=>{$resolve$$($pairs$$)}).catch($e$$=>{$reject$$($e$$)})})})})}))).reduce(($a$$,$b$$)=>$a$$.concat($b$$),[]),insertOne=($col_name$$,$id_app$$,$coll$$,$rows$$,$dvcs_pairs$$=[],$update_book$$=!0)=>new Promise(($resolve$$,$reject$$)=>{async.mapSeries($rows$$,($row$$,$callback$$)=>{let $old_id$$=$row$$._id;delete $row$$._id;for(let $key$$ in $row$$)$row$$[$key$$]&&
_.isString($row$$[$key$$])&&$key$$.indexOf("user")<0&&($key$$.indexOf("ngay_")>=0||$key$$.indexOf("date")>=0)&&($row$$[$key$$]=new Date($row$$[$key$$]));$row$$.id_app=$id_app$$;$coll$$.insertOne($row$$,async($e$$,$pair_rs$$)=>{if($e$$)return $callback$$($e$$);$e$$=$pair_rs$$.insertedId.toString();$pair_rs$$={old_id:$old_id$$,new_id:$e$$};$update_book$$&&(global.getModel("socai").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("socaitmp").updateMany({id_app:$row$$.id_app,
id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("sokho").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("sokhott").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("sokhocapphat").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("sokhokhongton").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("vatra").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("vatvao").updateMany({id_app:$row$$.id_app,
id_ct:$old_id$$},{id_ct:$e$$}),$col_name$$.indexOf("file")<0&&(global.getModel("file").updateMany({id_app:$row$$.id_app,id_link:$old_id$$},{id_link:$e$$}),global.getModel("file").updateMany({id_app:$row$$.id_app,id_folder:$old_id$$},{id_folder:$e$$})),$col_name$$.indexOf("folder")<0&&global.getModel("folder").updateMany({id_app:$row$$.id_app,id_link:$old_id$$},{id_link:$e$$}),$col_name$$.indexOf("folder")>=0&&global.getModel("folder").updateMany({id_app:$row$$.id_app,thu_muc_goc:$old_id$$},{thu_muc_goc:$e$$}),
$col_name$$.indexOf("note")<0&&global.getModel("note").updateMany({id_app:$row$$.id_app,id_link:$old_id$$},{id_link:$e$$}),$col_name$$.indexOf("tdttno")<0&&(global.getModel("tdttno").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("tdttno_tt").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("tdttno_tt").updateMany({id_app:$row$$.id_app,id_hd:$old_id$$},{id_hd:$e$$})),$col_name$$.indexOf("tdttco")<0&&(global.getModel("tdttco").updateMany({id_app:$row$$.id_app,
id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("tdttco_tt").updateMany({id_app:$row$$.id_app,id_ct:$old_id$$},{id_ct:$e$$}),global.getModel("tdttco_tt").updateMany({id_app:$row$$.id_app,id_hd:$old_id$$},{id_hd:$e$$})),$col_name$$.indexOf("qts")>=0&&(global.getModel("sophanbokh").updateMany({id_app:$row$$.id_app,id_ts:$old_id$$},{id_ts:$e$$}),global.getModel("sotinhkh").updateMany({id_app:$row$$.id_app,id_ts:$old_id$$},{id_ts:$e$$}),global.getModel("qts_dieuchinh").updateMany({id_app:$row$$.id_app,
id_ts:$old_id$$},{id_ts:$e$$}),global.getModel("hspbts").updateMany({id_app:$row$$.id_app,id_ts:$old_id$$},{id_ts:$e$$})),$col_name$$.indexOf("dmnhvts")>=0&&(global.getModel("dmvt").updateMany({id_app:$row$$.id_app,ma_nvt:$old_id$$},{ma_nvt:$e$$}),global.getModel("dmvt").updateMany({id_app:$row$$.id_app,ma_nvt2:$old_id$$},{ma_nvt2:$e$$}),global.getModel("dmvt").updateMany({id_app:$row$$.id_app,ma_nvt3:$old_id$$},{ma_nvt3:$e$$}),global.getModel("dmvt").updateMany({id_app:$row$$.id_app,ma_nvt4:$old_id$$},
{ma_nvt4:$e$$})),$col_name$$.indexOf("customer")>=0&&global.getModel("calllog").updateMany({id_app:$row$$.id_app,id_kh:$old_id$$},{id_kh:$e$$}));$callback$$(null,$pair_rs$$)})},async($e$$,$rs$$)=>{if($e$$)return $reject$$($e$$);await Promise.all($dvcs_pairs$$.map($pair$$=>(async()=>{$coll$$.updateMany({id_app:$id_app$$,ma_dvcs:$pair$$.old_id},{$set:{ma_dvcs:$pair$$.new_id}},()=>{Logger.info("updated dvcs",$col_name$$,$pair$$)})})()));$resolve$$($rs$$)})}),insert=($col_name$$,$coll$$,$rows$$,$id_app$$,
$dvcs_pairs$$)=>{$rows$$=$rows$$.map($row$$=>{delete $row$$.__v;delete $row$$.pkey;$row$$.id_app=$id_app$$;return $row$$});return $col_name$$==="socais"||$col_name$$==="sokhos"||$col_name$$==="sokhott"||$col_name$$==="vatras"||$col_name$$==="vatvaos"||$col_name$$==="dvcs"?insertOne($col_name$$,$id_app$$,$coll$$,$rows$$,$dvcs_pairs$$,!1):insertOne($col_name$$,$id_app$$,$coll$$,$rows$$,$dvcs_pairs$$,!0)},restore=$message$$=>{if($message$$.configs&&_.isString($message$$.configs))try{$message$$.configs=
JSON.parse($message$$.configs)}catch($e$$){delete $message$$.configs,console.info($e$$)}const $configs$$=$message$$.configs||require("../configs");connect2Db||(mongoose.connect($configs$$.database.url,{useNewUrlParser:!0}),connect2Db=!0);let $id_app$$=$message$$.id,$user$$=$message$$.user,$fileZip$$=$message$$.file;model.findOne({_id:$id_app$$}).lean().then(async $app$$=>{if(!$app$$)return postToParent({error:"C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i"});const $par$$=await Participant.findOne({email:$user$$,
id_app:$id_app$$,admin:!0});if($app$$.user_created!==$user$$&&!$par$$)return postToParent({error:"B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n th\u1ef1c hi\u1ec7n t\u00e1c v\u1ee5 n\u00e0y"});Logger.info("\ud83d\udd25[restoreApp] b\u1eaft \u0111\u1ea7u restore d\u1eef li\u1ec7u cho c\u00f4ng ty:",$app$$.name,$fileZip$$);fs.readFile($fileZip$$,($err$$,$dataZip$$)=>{if($err$$)return postToParent({error:$err$$});try{JSZip.loadAsync($dataZip$$).then(function($zip$$){return $zip$$.file("backup.json").async("string")}).then($string_data$$=>
{if($string_data$$){let $data$$=JSON.parse($string_data$$),$dvcs_pairs$$;async.series({app:$callback$$=>{Logger.info("[restoreApp] restore app...");let $appInfo$$=$data$$["app.js"];$appInfo$$?(delete $appInfo$$._id,delete $appInfo$$.__v,model.updateOne({_id:$id_app$$},$appInfo$$,$e$$=>{if($e$$)return $callback$$($e$$);$callback$$()})):$callback$$()},dvcs:$callback$$=>{async.mapSeries(coll_ex,($coll$$,$callback$$)=>{let $colls$$=Object.keys($data$$).filter($k$$=>$k$$==$coll$$);restoreColl($id_app$$,
$dvcs_pairs$$,$data$$,$colls$$).then($pairs$$=>{$coll$$=="dvcs"&&($dvcs_pairs$$=$pairs$$);async.map($pairs$$,($pair$$,$cb$$)=>{setImmediate(()=>{$coll$$=="dvcs"&&($string_data$$=$string_data$$.split($pair$$.old_id).join($pair$$.new_id));$cb$$()})},()=>{$callback$$()})}).catch($e$$=>{$callback$$($e$$)})},$e$$=>{$callback$$($e$$)})},data:$callback$$=>{let $colls$$=Object.keys($data$$).filter($k$$=>coll_ex.indexOf($k$$)<0);restoreColl($id_app$$,$dvcs_pairs$$,$data$$,$colls$$).then($pairs$$=>{Logger.info("[restoreApp] inserted data, begin fix new _id...",
$pairs$$.length);let $_data_goc$$=JSON.parse($string_data$$),$colls$$=Object.keys($_data_goc$$).filter($k$$=>coll_ex.indexOf($k$$)<0),$data_replace$$={};$colls$$.forEach($c$$=>{$data_replace$$[$c$$]=($_data_goc$$[$c$$]||[]).map($r$$=>JSON.stringify($r$$))});async.mapSeries($pairs$$,($pair$$,$cb$$)=>{setImmediate(()=>{$colls$$.forEach($c$$=>{Logger.info("[restoreApp] update pair",$pair$$,$c$$);$data_replace$$[$c$$]=$data_replace$$[$c$$].map($r$$=>$r$$.indexOf($pair$$.old_id)<0?$r$$:$r$$.split($pair$$.old_id).join($pair$$.new_id))});
$cb$$()})},()=>{async.map($colls$$,($col_name$$,$callback3$$)=>{const $rows$$=$data_replace$$[$col_name$$];Logger.info("[restoreApp] update collection",$col_name$$,$rows$$.length,"rows");$rows$$.length>0?mongoose.connection.db.collection($col_name$$,($err$$,$coll$$)=>{if($err$$)return $callback3$$($err$$);if(!$coll$$)return Logger.error("[restoreApp] can't update data. collection",$col_name$$,"is not exists"),$callback3$$();async.map($rows$$,($_row$$,$callback$$)=>{setImmediate(()=>{let $row$$=JSON.parse($_row$$);
delete $row$$.__v;delete $row$$.pkey;$row$$.id_app=$id_app$$;let $_id$$=ObjectId($row$$._id);delete $row$$._id;for(let $key$$ in $row$$)$row$$[$key$$]&&_.isString($row$$[$key$$])&&$key$$.indexOf("user")<0&&($key$$.indexOf("ngay_")>=0||$key$$.indexOf("date")>=0)&&($row$$[$key$$]=new Date($row$$[$key$$]));$coll$$.updateOne({_id:$_id$$,id_app:$id_app$$},{$set:$row$$},($e$$,$rs$$)=>{if($e$$)return $callback$$($e$$);Logger.info("[restoreApp] updated",$col_name$$,$rs$$.matchedCount,$rs$$.modifiedCount,
$rs$$.upsertedId);$callback$$()})})},$e$$=>{$e$$||Logger.info("[restoreApp] updated collection",$col_name$$,"successfull");$callback3$$($e$$)})}):$callback3$$()},$e$$=>{$e$$||Logger.info("[restoreApp] all collections was restore successful");$callback$$($e$$)})})}).catch($e$$=>{$callback$$($e$$)})}},$e$$=>{if($e$$)return Logger.error("[restoreApp] Kh\u00f4ng th\u1ec3 restore d\u1eef li\u1ec7u. L\u1ed7i:",$e$$),postToParent({error:"Kh\u00f4ng th\u1ec3 restore d\u1eef li\u1ec7u. L\u1ed7i: "+$e$$.message||
$e$$.error||$e$$,id_task:$message$$.id_task});Logger.info("\u2705 [restoreApp] database was restore successful");postToParent({result:"Ch\u01b0\u01a1ng tr\u00ecnh \u0111\u00e3 kh\u00f4i ph\u1ee5c d\u1eef li\u1ec7u th\u00e0nh c\u00f4ng",id_task:$message$$.id_task})})}else return postToParent({error:"File l\u01b0u tr\u1eef kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u",id_task:$message$$.id_task})}).catch($e$$=>{Logger.error("[restoreApp]",$e$$,$fileZip$$);return postToParent({error:"Kh\u00f4ng th\u1ec3 restore d\u1eef li\u1ec7u. L\u1ed7i: "+
$e$$.message||$e$$.error||$e$$,id_task:$message$$.id_task})})}catch($e$$){return Logger.error("[restoreApp]",$e$$,$fileZip$$),postToParent({error:"Kh\u00f4ng th\u1ec3 restore d\u1eef li\u1ec7u. L\u1ed7i: "+$e$$.message||$e$$.error||$e$$,id_task:$message$$.id_task})}})}).catch($e$$=>{$e$$&&postToParent({error:$e$$})})};onParentMessage($msg$$=>{if($msg$$){if(_.isString($msg$$))try{$msg$$=JSON.parse($msg$$)}catch($e$$){Logger.error($e$$);postToParent({error:"msg is not valid"});return}restore($msg$$)}else postToParent({error:"msg is not valid"})});
workerData&&(()=>{let $msg$$=workerData;if(Buffer.isBuffer(workerData)||workerData instanceof Uint8Array)try{$msg$$=v8.deserialize(workerData)}catch($e$$){return Logger.error("[Worker] L\u1ed7i deserialize task:",$e$$),postToParent({error:"Deserialization failed"})}if(_.isString($msg$$))try{$msg$$=JSON.parse($msg$$)}catch($e$$){Logger.error($e$$);postToParent({error:"msg is not valid"});return}$msg$$.id&&$msg$$.findOne&&restore($msg$$)})();