flexbiz-server
Version:
Flexible Server
11 lines (10 loc) • 4.69 kB
JavaScript
require("../global");const model=global.getModel("app"),Participant=global.getModel("participant"),fs=require("fs"),JSZip=require("jszip");require("../libs/prototypes.js");const _=require("lodash"),{ObjectId}=require("mongodb"),mongoose=require("mongoose"),{isDateValue}=require("../libs/utils.js"),{postToParent,onParentMessage}=require("./worker-utils");let connect2Db=!1;
const deepReplaceId=($obj$$,$idMap$$)=>{if(Array.isArray($obj$$))return $obj$$.map($item$$=>deepReplaceId($item$$,$idMap$$));if(_.isPlainObject($obj$$))for(let $key$$ in $obj$$){if($key$$==="_id"||$key$$==="id_app"||$key$$==="__v")continue;const $val$$=$obj$$[$key$$];typeof $val$$==="string"&&$idMap$$.has($val$$)?$obj$$[$key$$]=$idMap$$.get($val$$):typeof $val$$==="object"&&$val$$!==null&&($val$$ instanceof Date||($obj$$[$key$$]=deepReplaceId($val$$,$idMap$$)))}return $obj$$},processRestore=async $message$$=>
{if($message$$.configs&&_.isString($message$$.configs))try{$message$$.configs=JSON.parse($message$$.configs)}catch($e$$){return postToParent({error:$e$$.message||$e$$})}var $configs_user$$=$message$$.configs||require("../configs");connect2Db||(await mongoose.connect($configs_user$$.database.url,{useNewUrlParser:!0}),connect2Db=!0);const $id_app$$=$message$$.id;$configs_user$$=$message$$.user;const $fileZip$$=$message$$.file,$app$$=await model.findOne({_id:$id_app$$}).lean();if(!$app$$)return postToParent({error:"C\u00f4ng ty kh\u00f4ng t\u1ed3n t\u1ea1i"});
const $par$$=await Participant.findOne({email:$configs_user$$,id_app:$id_app$$,admin:!0});if($app$$.user_created!==$configs_user$$&&!$par$$)return postToParent({error:"Kh\u00f4ng c\u00f3 quy\u1ec1n th\u1ef1c hi\u1ec7n"});Logger.info(`\ud83d\udd25[restoreApp] B\u1eaft \u0111\u1ea7u restore t\u1ed5ng th\u1ec3 cho: ${$app$$.name}`);fs.readFile($fileZip$$,($err$$,$dataZip$$)=>{if($err$$)return postToParent({error:$err$$.message});JSZip.loadAsync($dataZip$$).then(async $appInfo_collections_string_data_zip$$=>
{$appInfo_collections_string_data_zip$$=await $appInfo_collections_string_data_zip$$.file("backup.json").async("string");if(!$appInfo_collections_string_data_zip$$)return postToParent({error:"File backup r\u1ed7ng"});const $backupData$$=JSON.parse($appInfo_collections_string_data_zip$$),$globalIdMap$$=new Map;Logger.info("[restoreApp] \u0110ang t\u1ea1o b\u1ea3n \u0111\u1ed3 ID m\u1edbi...");$backupData$$["app.js"]&&($appInfo_collections_string_data_zip$$=$backupData$$["app.js"],delete $appInfo_collections_string_data_zip$$._id,
delete $appInfo_collections_string_data_zip$$.__v,await model.updateOne({_id:$id_app$$},$appInfo_collections_string_data_zip$$),delete $backupData$$["app.js"]);$appInfo_collections_string_data_zip$$=Object.keys($backupData$$);$appInfo_collections_string_data_zip$$.forEach($colName$$=>{($backupData$$[$colName$$]||[]).forEach($row$$=>{if($row$$._id){const $newId$$=(new ObjectId).toString();$globalIdMap$$.set($row$$._id,$newId$$);$row$$._new_id_assigned=$newId$$}})});Logger.info(`[restoreApp] \u0110\u00e3 map ${$globalIdMap$$.size} IDs.`);
for(const $colName$$ of $appInfo_collections_string_data_zip$$){const $rows$$=$backupData$$[$colName$$];$rows$$&&$rows$$.length!==0&&(Logger.info(`[restoreApp] Processing collection: ${$colName$$} (${$rows$$.length} docs)`),await new Promise(($resolve$$,$reject$$)=>{mongoose.connection.db.collection($colName$$,async($bulkOps_err$$,$coll$$)=>{if($bulkOps_err$$)return $reject$$($bulkOps_err$$);await $coll$$.deleteMany({id_app:$id_app$$});$bulkOps_err$$=$rows$$.map($row$$=>{const $newIdStr$$=$row$$._new_id_assigned||
(new ObjectId).toString();delete $row$$._id;delete $row$$.__v;delete $row$$.pkey;delete $row$$._new_id_assigned;$row$$.id_app=$id_app$$;for(let $key$$ in $row$$)if($row$$[$key$$]&&isDateValue($row$$[$key$$]))try{$row$$[$key$$]=new Date($row$$[$key$$])}catch($e$$){Logger.warn("[restoreApp] kh\u00f4ng th\u1ec3 convert gi\u00e1 tr\u1ecb sau ra ki\u1ec3u Date",$row$$[$key$$],$e$$)}deepReplaceId($row$$,$globalIdMap$$);return{insertOne:{document:{...$row$$,_id:new ObjectId($newIdStr$$)}}}});if($bulkOps_err$$.length>
0)try{await $coll$$.bulkWrite($bulkOps_err$$),$resolve$$()}catch($e$$){$reject$$($e$$)}else $resolve$$()})}))}Logger.info("\u2705 [restoreApp] Kh\u00f4i ph\u1ee5c ho\u00e0n t\u1ea5t to\u00e0n b\u1ed9.");postToParent({result:"Kh\u00f4i ph\u1ee5c d\u1eef li\u1ec7u th\u00e0nh c\u00f4ng",id_task:$message$$.id_task})}).catch($e$$=>{Logger.error($e$$);postToParent({error:"L\u1ed7i x\u1eed l\u00fd file backup: "+$e$$.message,id_task:$message$$.id_task})})})};
onParentMessage($msg$$=>{if($msg$$)try{_.isString($msg$$)&&($msg$$=JSON.parse($msg$$)),$msg$$.id&&processRestore($msg$$)}catch($e$$){Logger.error($e$$)}});