UNPKG

flexbiz-server

Version:

Flexible Server

37 lines (35 loc) 15 kB
const _=require("lodash"),crypto=require("crypto"),numeral=require("numeral"),Moment=require("moment-timezone"),moment=$time$$=>Moment.tz($time$$,configs.timezone||"Asia/Ho_Chi_Minh"),reportinfo=global.getModel("reportinfo"),{evalute,getParameterData}=require("../libs/utils"),utils=require("../libs/utils"),handlers=require("./handlers"),{getCurrentSession,getCurrentStore}=require("../libs/sessionContext"); class controllerRPT{constructor($router$$,$rptId$$,$fecthData$$,$options$$={}){this.module=this.name=$rptId$$;this.router=$router$$;this.options=$options$$;this.fecthDataFunc=$fecthData$$;global.report_controllers[$rptId$$.toUpperCase()]=this;this.base_path=$options$$.require_id_app===!1?"/":"/:id_app/";this.getData=this.getData.bind(this);this.createRoute=this.createRoute.bind(this);this.notNeedRight=async($user$$,$_options$$={})=>{let $nnr$$=$options$$.notNeedRight;_.isFunction($nnr$$)&&($nnr$$= $nnr$$($user$$,$_options$$));return $nnr$$};this.handleResult=async($req$$,$data_response$$,$callback$$)=>{if($data_response$$.error)return $callback$$($data_response$$.error);$data_response$$=$data_response$$.result;var $func_string_rptInfo$$=await reportinfo.findOne({code:($req$$.query.report_info_code||$rptId$$).toLowerCase()}).lean();if($func_string_rptInfo$$&&$func_string_rptInfo$$.handle_data_expression_server){if($func_string_rptInfo$$.handle_data_expression_server.indexOf("async ")>=0)return $callback$$("async function is not allow"); $func_string_rptInfo$$=`return (async ()=>{ try{ ${$func_string_rptInfo$$.handle_data_expression_server} }catch(e){ return {error:e} } })`;try{let $rs$$=await evalute($func_string_rptInfo$$,{data:$data_response$$,moment,numeral,condition:$req$$.query,user:$req$$.user,_,utils,getData:getParameterData})();if($rs$$){if($rs$$.error)return Logger.error("handle_data_expression_server",$rs$$.error,$func_string_rptInfo$$,$rptId$$),$callback$$($rs$$.error.message||$rs$$.error);$data_response$$=$rs$$}}catch($e$$){return Logger.error("handle_data_expression_server",$e$$,$func_string_rptInfo$$,$rptId$$),$callback$$($e$$.message||$e$$)}}$callback$$(null, $data_response$$)};this.getDataFunc=()=>{const $currentStore$$=getCurrentStore();Logger.info(`\u2705 [rptHanlder] [getDataFunc], storeId=${$currentStore$$?.storeId||"none"},sessionID=${getCurrentSession()?._debugId}`);return $options$$.stream?$fecthData$$:async($req$$,$callback$$)=>{Logger.info(`\u2705 [rptHanlder] Ch\u1ea1y b\u00e1o c\u00e1o ${$rptId$$}, sessionID=${getCurrentSession()?._debugId}`);try{await $fecthData$$($req$$,($e$$,$data$$)=>{this.handleResult($req$$,{error:$e$$,result:$data$$}, ($e$$,$rs$$)=>{$callback$$($e$$,$rs$$)})})}catch($e$$){$callback$$($e$$)}}};const $mainRoute$$=async($req$$,$res$$)=>{if($options$$.stream)handlers.rptHandler(this,$req$$,($e$$,$rs$$)=>{if($options$$.resHandler)return $options$$.resHandler($req$$,{error:$e$$,data:$rs$$},$res$$);if($e$$)return $e$$.error?$res$$.status(500).send($e$$):$res$$.status(500).send({error:$e$$.message||$e$$});$rs$$=="__end_stream__"?Logger.info("[controllerRPT] end stream...",$rptId$$):$res$$.send($rs$$)},$res$$);else{const {query:$query$$, body:$body$$,user:$user$$,params:$params$$,files:$files$$,protocol:$protocol$$}=$req$$;var $_req_host$$=configs?.api_url||$req$$.get("hostName");const $user_agent$$=$req$$.header("user-agent"),$ip$$=$req$$.ip||$req$$.headers["x-forwarded-for"]||$req$$.connection.remoteAddress;try{if($_req_host$$={handler:"rptHandler",protocol:$protocol$$,host:$_req_host$$,query:$query$$,body:$body$$,user:$user$$,params:$params$$,user_agent:$user_agent$$,ip:$ip$$,files:$files$$},global.reportMainPool&&!global.reportMainPool.fullQueue()&& $options$$.queue!=0){const $id_task$$=`report-${crypto.randomBytes(20).toString("hex")}`;if($options$$.waiting_message){const $status_task$$=`${configs.api_url||configs.domain}/task-status/${$id_task$$}`;$res$$.status(202).send([{message:$options$$.waiting_message,status_task:$status_task$$}])}global.reportMainPool.exec({id_task:$id_task$$,req:$_req_host$$,module:$rptId$$.toUpperCase(),configs:JSON.stringify(configs)},$response$$=>{if(!$options$$.waiting_message){if($options$$.resHandler)return $options$$.resHandler($req$$, {error:$response$$.error,data:$response$$.result},$res$$);if($response$$.error)return $res$$.status(400).send($response$$.error);$res$$.send($response$$.result)}})}else $options$$.waiting_message&&$res$$.status(202).send([{message:$options$$.waiting_message}]),handlers.rptHandler(this,$_req_host$$,($e$$,$returnvalue$$)=>{if(!$options$$.waiting_message){if($options$$.resHandler)return $options$$.resHandler($req$$,{error:$e$$,data:$returnvalue$$},$res$$);if($e$$)return $res$$.status(400).send($e$$); $res$$.send($returnvalue$$)}})}catch($e$$){Logger.error("L\u1ed7i t\u1ea1o job cho b\u00e1o c\u00e1o",$rptId$$,$e$$),$res$$.status(400).send($e$$)}}},$excelRoute$$=async($ip$jscomp$1_req$$,$res$$)=>{const {query:$query$$,body:$body$$,user:$user$$,params:$params$$,files:$files$$,protocol:$protocol$$}=$ip$jscomp$1_req$$;var $_req$jscomp$1_host$$=configs?.api_url||$ip$jscomp$1_req$$.get("host");const $user_agent$$=$ip$jscomp$1_req$$.header("user-agent");$ip$jscomp$1_req$$=$ip$jscomp$1_req$$.ip||$ip$jscomp$1_req$$.headers["x-forwarded-for"]|| $ip$jscomp$1_req$$.connection.remoteAddress;try{if($_req$jscomp$1_host$$={handler:"rptExcelHandler",protocol:$protocol$$,host:$_req$jscomp$1_host$$,query:$query$$,body:$body$$,user:$user$$,params:$params$$,user_agent:$user_agent$$,ip:$ip$jscomp$1_req$$,files:$files$$},global.reportMainPool&&!global.reportMainPool.fullQueue()&&$options$$.queue!=0){const $id_task$$=`report-export-${crypto.randomBytes(20).toString("hex")}`;global.reportMainPool.exec({id_task:$id_task$$,req:$_req$jscomp$1_host$$,module:$rptId$$.toUpperCase(), configs:JSON.stringify(configs)},$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=>{if($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.error)return $res$$.status(400).send($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.error);var $result_returnvalue$$=$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.result;$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=$result_returnvalue$$.type;$result_returnvalue$$=$result_returnvalue$$.data;switch($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$){case "xlsx":Logger.info("[controllerRPT] send file from worker...", $data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$,typeof $result_returnvalue$$);if(typeof $result_returnvalue$$=="string")return $res$$.send($result_returnvalue$$);$res$$.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");$res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".xlsx');$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=$result_returnvalue$$;$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$?.type=== "Buffer"&&Array.isArray($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data)&&($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=Buffer.from($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data));$res$$.setHeader("Content-Length",$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.length);$res$$.end($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$);break;case "docx":$res$$.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.wordprocessingml.document"); $res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".docx');$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=$result_returnvalue$$;$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$?.type==="Buffer"&&Array.isArray($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data)&&($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=Buffer.from($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data));$res$$.setHeader("Content-Length",$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.length); $res$$.end($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$);break;case "xml":$res$$.setHeader("Content-Type","application/xml");$res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".xml');$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$=$result_returnvalue$$;$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$?.type==="Buffer"&&Array.isArray($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data)&&($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$= Buffer.from($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.data));$res$$.setHeader("Content-Length",$data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$.length);$res$$.end($data$jscomp$2_data$jscomp$3_data$jscomp$4_ext_response$$);break;default:$res$$.send($result_returnvalue$$)}})}else handlers.rptExcelHandler(this,$_req$jscomp$1_host$$,($e$jscomp$7_result$$,$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$)=>{if($e$jscomp$7_result$$)return $res$$.status(400).send($e$jscomp$7_result$$); $e$jscomp$7_result$$=$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data;switch($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.type){case "xlsx":Logger.info("[controllerRPT] send xls file...");if(typeof $e$jscomp$7_result$$=="string")return $res$$.send($e$jscomp$7_result$$);$res$$.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");$res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".xlsx');$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$= $e$jscomp$7_result$$;$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$?.type==="Buffer"&&Array.isArray($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data)&&($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$=Buffer.from($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data));$res$$.setHeader("Content-Length",$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.length);$res$$.end($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$);break;case "docx":$res$$.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");$res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".docx');$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$=$e$jscomp$7_result$$;$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$?.type==="Buffer"&&Array.isArray($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data)&&($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$=Buffer.from($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data)); $res$$.setHeader("Content-Length",$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.length);$res$$.end($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$);break;case "xml":$res$$.setHeader("Content-Type","application/xml");$res$$.setHeader("Content-Disposition",'attachment; filename="'+$rptId$$+'".xml');$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$=$e$jscomp$7_result$$;$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$?.type==="Buffer"&&Array.isArray($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data)&& ($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$=Buffer.from($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.data));$res$$.setHeader("Content-Length",$data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$.length);$res$$.end($data$jscomp$5_data$jscomp$6_data$jscomp$7_returnvalue$$);break;default:$res$$.send($e$jscomp$7_result$$)}})}catch($e$$){$res$$.status(400).send($e$$)}};$router$$&&($router$$.route(`${this.base_path+this.module}`).get($mainRoute$$),$router$$.route(`${this.base_path+ this.module}`).post($mainRoute$$),$router$$.route(`${this.base_path+this.module}/excel`).get($excelRoute$$),$router$$.route(`${this.base_path+this.module}/excel`).post($excelRoute$$),$router$$.route(`${this.base_path+this.module}/export`).get($excelRoute$$),$router$$.route(`${this.base_path+this.module}/export`).post($excelRoute$$))}getData($req$$,$callback$$){const $ctrl$$=this;let $callback_run$$=!1;setImmediate(()=>{try{$ctrl$$.fecthDataFunc($req$$,($err$$,$data$$,$event$$)=>{if($ctrl$$.options?.stream){if($err$$)return $callback$$($err$$); $event$$!="data"||$callback_run$$||($callback_run$$=!0,this.handleResult($req$$,{error:$err$$,result:$data$$},($e$$,$rs$$)=>{$callback$$($e$$,$rs$$)}))}else $callback_run$$=!0,this.handleResult($req$$,{error:$err$$,result:$data$$},($e$$,$rs$$)=>{$callback$$($e$$,$rs$$)})})}catch($e$$){Logger.error("[report controller] [getData]",$e$$),$callback$$($e$$.message)}})}createRoute($routeName$$,$callbackRoute_handler$$,$_options$$={method:"GET",not_use_worker:!1,action_code:"view"}){const $self$$=this;$_options$$.method= $_options$$.method?$_options$$.method.toUpperCase():"GET";const $route_action_key$$=`rpt_route_action_${$self$$.module}_${$routeName$$}_${$_options$$.method}`;$self$$[$route_action_key$$]=$callbackRoute_handler$$;$callbackRoute_handler$$=async function($ip$jscomp$2_req$$,$res$$){const {query:$query$$,body:$body$$,user:$user$$,params:$params$$,files:$files$$}=$ip$jscomp$2_req$$;var $_req$jscomp$2_user_agent$$=$ip$jscomp$2_req$$.header("user-agent");$ip$jscomp$2_req$$=$ip$jscomp$2_req$$.ip||$ip$jscomp$2_req$$.headers["x-forwarded-for"]|| $ip$jscomp$2_req$$.connection.remoteAddress;try{if($_req$jscomp$2_user_agent$$={handler:"rptCreateRouteHandler",routeName:$routeName$$,_options:$_options$$,route_action_key:$route_action_key$$,query:$query$$,body:$body$$,user:$user$$,params:$params$$,user_agent:$_req$jscomp$2_user_agent$$,ip:$ip$jscomp$2_req$$,files:$files$$},!global.reportMainPool||global.reportMainPool.fullQueue()||$_options$$.not_use_worker)handlers.rptCreateRouteHandler($self$$,$_req$jscomp$2_user_agent$$,($e$$,$returnvalue$$)=> {if($e$$)return $res$$.status(400).send($e$$);$res$$.send($returnvalue$$)});else{const $id_task$$=`report-create-route-${crypto.randomBytes(20).toString("hex")}`;global.reportMainPool.exec({id_task:$id_task$$,req:$_req$jscomp$2_user_agent$$,module:$self$$.module.toUpperCase(),configs:JSON.stringify(configs)},$response$jscomp$6_result$$=>{if($response$jscomp$6_result$$.error)return $res$$.status(400).send($response$jscomp$6_result$$.error);({result:$response$jscomp$6_result$$}=$response$jscomp$6_result$$); $res$$.send($response$jscomp$6_result$$)})}}catch($e$$){$res$$.status(400).send($e$$)}};this.router&&($_options$$.method=="DELETE"?this.router.route(`${this.base_path+this.module}/${$routeName$$}`).delete($callbackRoute_handler$$):$_options$$.method=="POST"?this.router.route(`${this.base_path+this.module}/${$routeName$$}`).post($callbackRoute_handler$$):$_options$$.method=="PUT"?this.router.route(`${this.base_path+this.module}/${$routeName$$}`).put($callbackRoute_handler$$):this.router.route(`${this.base_path+ this.module}/${$routeName$$}`).get($callbackRoute_handler$$))}}module.exports=controllerRPT;