flexbiz-server 12.6.18 → 12.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/server/global.js +2 -1
- package/server/modules/systems/sys-app.js +27 -27
- package/server/route.js +31 -29
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "flexbiz-server",
|
|
3
3
|
"main": "./server/app.js",
|
|
4
4
|
"description": "Flexible Server",
|
|
5
|
-
"version": "12.6.
|
|
5
|
+
"version": "12.6.19",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Van Truong Pham",
|
|
8
8
|
"email": "invncur@gmail.com"
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"mongodb-backup": "^1.6.9",
|
|
63
63
|
"mongodb-restore": "^1.6.2",
|
|
64
64
|
"mongoose": "^5.12.14",
|
|
65
|
+
"mongoose-storage-usage": "^1.3.0",
|
|
65
66
|
"morgan": "^1.10.0",
|
|
66
67
|
"multer": "^0.1.8",
|
|
67
68
|
"natives": "^1.1.6",
|
package/server/global.js
CHANGED
|
@@ -2,7 +2,8 @@ const fs=require("fs"),async=require("async"),logger=require("./libs/logger.js")
|
|
|
2
2
|
function globalListinfoCodePlugin($schema$$){$schema$$.path("listinfo_code")||$schema$$.add({listinfo_code:{type:String,default:null}});$schema$$.path("id_client")||$schema$$.add({id_client:{type:String,default:null}})}global.blockchainTransactionPool=new TransactionPool;global.new_schedules=[];global.rootDir=__dirname;global.ctrlVouchers={};global.controllers={};global.report_controllers={};global.postingVouchers={};global.cacheDatas={};
|
|
3
3
|
global.socketContainer={loadConnectionId:async()=>new Promise($res$$=>{global.clientRedis.get("client-io",function($err$$,$reply$$){if($err$$)return console.error($err$$),$res$$({});if($reply$$)try{let $ios$$=JSON.parse($reply$$);return $res$$($ios$$||{})}catch($e$$){return console.error($e$$),$res$$({})}else return $res$$({})})}),saveConnectionId:async($clientIO$$={})=>new Promise(($res$$,$rej$$)=>{global.clientRedis.set("client-io",JSON.stringify($clientIO$$),$e$$=>{if($e$$)return console.error($e$$),
|
|
4
4
|
$rej$$($e$$);$res$$($clientIO$$)})})};global.clientIO={};global.model_books="socai socaitmp socainpp vsocai sokho sokhott sokhonpp sokhokhongton sosanxuat vatvao vatra phucap".split(" ");global.secu_models="asskey assproduct assperiod assinvestment asssell assbuy assneedtobuy asswithdraw asscashwithdraw wallet assfindhash assbank asstransaction assissue token tokens user app listinfo right otp payload smsaccount emailaccount".split(" ");global.webPush=require("web-push");global.mongoose=require("mongoose");
|
|
5
|
-
const originalCast=global.mongoose.Number.cast();global.mongoose.Number.cast(function($value$$){return typeof $value$$==="number"&&Number.isNaN($value$$)?0:originalCast($value$$)});global.mongoose.plugin(mongooseSecurityPlugin);require("./libs/mongoosePatch.js");global.mongoose.plugin(leanID);global.mongoose.plugin(deletePost);global.mongoose.plugin(globalListinfoCodePlugin);
|
|
5
|
+
const originalCast=global.mongoose.Number.cast();global.mongoose.Number.cast(function($value$$){return typeof $value$$==="number"&&Number.isNaN($value$$)?0:originalCast($value$$)});global.mongoose.plugin(mongooseSecurityPlugin);require("./libs/mongoosePatch.js");global.mongoose.plugin(leanID);global.mongoose.plugin(deletePost);global.mongoose.plugin(globalListinfoCodePlugin);const {createStorageUsageTracker}=require("mongoose-storage-usage");
|
|
6
|
+
global.storageUsage=createStorageUsageTracker(mongoose,{autoApply:!0,fileFieldsConfig:{File:["file"]}});global.storageUsage.registerCronJob("0 2 * * *");global.mongoose.plugin(function($schema$$){$schema$$.set("versionKey",!1)});global.Schema=global.mongoose.Schema;
|
|
6
7
|
global.getModel=$model_name_name$$=>{$model_name_name$$=$model_name_name$$.split(".js")[0];var $_requireFields_manualMap_model_model_path_mySchema$$={kbmpttct:"kbmPttct",kbmtkgtgt:"kbmTkgtgt",token:"tokens",bn1:"pc1",bc1:"pt1",dmnhkh:"group",dmchucvu:"group",dmnhtask:"group",dmntt:"group",dmnt:"currentcy",dmtk:"account",dmkh:"customer",dmsp:"dmvt",data_socai:"socai",data_socaitc:"socaitc",data_sokho:"sokho"};$_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]&&($model_name_name$$=
|
|
7
8
|
$_requireFields_manualMap_model_model_path_mySchema$$[$model_name_name$$]);if($_requireFields_manualMap_model_model_path_mySchema$$=mongoose.models[$model_name_name$$])return $_requireFields_manualMap_model_model_path_mySchema$$;if(global.controllers[$model_name_name$$.toUpperCase()]&&global.controllers[$model_name_name$$.toUpperCase()].model)return global.controllers[$model_name_name$$].model;if(((global.configs||{}).paths||{}).models&&($_requireFields_manualMap_model_model_path_mySchema$$=((global.configs||
|
|
8
9
|
{}).paths||{}).models+"/"+$model_name_name$$+".js",fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$)))return require($_requireFields_manualMap_model_model_path_mySchema$$);$_requireFields_manualMap_model_model_path_mySchema$$=__dirname+"/models/"+$model_name_name$$+".js";if(fs.existsSync($_requireFields_manualMap_model_model_path_mySchema$$))return require($_requireFields_manualMap_model_model_path_mySchema$$);console.error("model",$model_name_name$$,"is not exists. create new model");
|
|
@@ -4,30 +4,30 @@ StaticPool=require("../../libs/WorkerStaticPool"),{encrypt}=require("../../libs/
|
|
|
4
4
|
$user$$.generateHash($user$$.email+($obj$$.default_password||$user$$.email+"@123456"));try{await $user$$.save();let $_p$$={email:$_p_owner$$,name:$_p_owner$$.split("@")[0],admin:!0,active:!0,cancel:!1,id_app:$obj$$._id.toString()};await Participant.asyncCreateParticipant($_p$$)}catch($e$$){Logger.error("[createUserOwner] create participant for owner user ",$_p_owner$$,$e$$)}}}$_p_owner$$={email:$obj$$.user_created,name:$obj$$.user_created.split("@")[0],admin:!0,active:!0,cancel:!1,id_app:$obj$$._id.toString()};
|
|
5
5
|
try{await Participant.asyncCreateParticipant($_p_owner$$)}catch($e$$){Logger.error("[create participant for created user ]",$obj$$.user_created,$e$$)}try{await Participant.asyncCreateParticipant({email:"public",name:"Public",admin:!1,active:!0,cancel:!1,id_app:$obj$$._id.toString()})}catch($e$$){Logger.error("[create public participant]",$e$$)}$next$$(null,$obj$$)};
|
|
6
6
|
module.exports=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"app",{unique:["app_code"],require_id_app:!1,sort:{name:1}});$contr_router$$.route();$contr_router$$.found=($user$$,$condition$$,$items$$,$fn$$)=>{async.mapLimit($items$$,20,($item$$,$callback$$)=>{calcTimeExpired($item$$);$callback$$()},$e$$=>{$e$$&&Logger.error($e$$);$fn$$(null,$items$$)})};$contr_router$$.view=function($user$$,$items$$,$fn$$){$items$$.forEach($item$$=>{$item$$.trang_thai=$item$$.trang_thai||
|
|
7
|
-
"0"});async.parallel({trangthai:$callback$$=>{$items$$.joinModel2(null,Trangthai,{where:$item$$=>({ma_ct:"APP",ma_trang_thai:$item$$.trang_thai}),fields:["ten_trang_thai","color"]},()=>{$callback$$()})},show_gia_von_va_nguoi_duyet:$callback$$=>{async.map($items$$,($item$$,$callback$$)=>{$item$$.options=$item$$.options||{};$item$$.show_gia_von=!0;$callback$$()},()=>{$callback$$()})},
|
|
8
|
-
{$item$$.
|
|
9
|
-
delete $item$$.
|
|
10
|
-
delete $item$$.
|
|
11
|
-
$next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp c\u00f4ng ty n\u00e0y"))};$contr_router$$.finding=async($user$$,$condition
|
|
12
|
-
{$
|
|
13
|
-
$e$$),$next$$($e$$.message||$e$$.error||$e$$)}};$contr_router$$.creating=async function($user$$,$obj$$,$next$$){if($user$$.token_id_app
|
|
14
|
-
|
|
15
|
-
$
|
|
16
|
-
|
|
17
|
-
$
|
|
18
|
-
$
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
$e$$.message),$callback$$()}},()=>{$next$$(null,$obj$$)})};$contr_router$$.router.route($contr_router$$.route_name+"/backup/:id").get(function($req
|
|
22
|
-
"/workers/backupApp.js",global.backupPool=new StaticPool($backupWorkerFile_e$$,0,1,18E5));global.getModel("log").create({id_app:$id_app$$,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
$req$$);global.restorePool||($response$$=path.dirname(path.dirname(__dirname))+"/workers/restoreApp.js",global.restorePool=new StaticPool($response$$,
|
|
27
|
-
|
|
28
|
-
$res$$){var $_appsOfUser$jscomp$1_email$$=$query_req$$.params.email_owner;if(!underscore.contains(configs.admins,$query_req$$.user.email)&&!isSupperAdmin($query_req$$.user.email.toLowerCase()))return $res$$.status(403).send("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp t\u00ednh n\u0103ng n\u00e0y")
|
|
29
|
-
$p$$.id_app),$query_req$$._id={$in:$_appsOfUser$jscomp$1_email$$});model.find($query_req$$).lean().exec(function($error$$,$apps$$){if($error$$)return $res$$.status(400).send($error$$);$apps$$.forEach(function($item$$){calcTimeExpired($item$$)});$res$$.send($apps$$)})});$contr_router$$.router.route($contr_router$$.route_name+
|
|
30
|
-
if(!$app_req$$)return $res$$.status(400).send("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");$app_req$$.participants&&($app_req$$.participants=$app_req$$.participants.filter($p$$=>$p$$.email!==$email$$),$app_req$$.save(()=>{}));if($id_app$jscomp$2_p$$=await Participant.findOne({id_app:$id_app$jscomp$2_p$$,email:$email$$}))await Participant.deleteOne({_id:$id_app$jscomp$2_p$$._id})
|
|
31
|
-
_Notification.createNotification($email$$,$app_req$$.user_created,$id_app$jscomp$2_p$$,$id_app$jscomp$2_p$$);$res$$.send("ok")});$contr_router$$.router.route($contr_router$$.route_name+"/join/:id/:group").get(async($req$$,$res$$)=>{let $id_app$$=$req$$.params.id,$group_id$$=$req$$.params.group,$email$$=$req$$.user.email,$user$$=$req$$.user,$app$$=await model.findById($id_app$$);
|
|
32
|
-
email:$email$$})&&$group_id$$&&global.mongoose.Types.ObjectId.isValid($group_id$$))try{if(!await UserGroup.findOne({_id:$group_id$$,is_customer_group:!0}))return $res$$.status(400).send("Nh\u00f3m kh\u00e1ch h\u00e0ng kh\u00f4ng t\u1ed3n t\u1ea1i");Participant.createParticipant({id_app:$id_app$$,email:$email$$,name:$user$$.name,group_id:$group_id$$,active:!0}
|
|
33
|
-
email:$user$$.email,id_app:$id_app$$,user_created:$user$$.email,user_updated:$user$$.email,kh_yn:!0,of_user:$user$$.email};isMobilePhone($user$$.email,["vi-VN"])&&($cust_e$$.dien_thoai=$user$$.email);try{Customer.asyncCreateCustomer($cust_e$$)}catch($e$$){Logger.info("Auto create new customer with error:",$e$$.message)}$res$$.send("ok")})}catch($e$$){$res$$.status(400).send($e$$.message)}$res$$.send("ok")})};
|
|
7
|
+
"0"});async.parallel({trangthai:$callback$$=>{$items$$.joinModel2(null,Trangthai,{where:$item$$=>({ma_ct:"APP",ma_trang_thai:$item$$.trang_thai}),fields:["ten_trang_thai","color"]},()=>{$callback$$()})},show_gia_von_va_nguoi_duyet:$callback$$=>{async.map($items$$,($item$$,$callback$$)=>{$item$$.options=$item$$.options||{};$item$$.show_gia_von=!0;$callback$$()},()=>{$callback$$()})},storageUsage:$callback$$=>{global.storageUsage?async.map($items$$,($item$$,$callback$$)=>{global.storageUsage.getTotalUsageByApp($item$$._id.toString()).then($rs$$=>
|
|
8
|
+
{$item$$.storage_usage=$rs$$;$callback$$()}).catch($e$$=>{Logger.error("[app] kh\u00f4ng th\u1ec3 l\u1ea5y th\u00f4ng tin dung l\u01b0\u1ee3ng \u0111\u00e3 s\u1eed d\u1ee5ng",$e$$);$callback$$()})},()=>{$callback$$()}):$callback$$()},get_par_info:$callback$$=>{async.mapLimit($items$$,20,($item$$,$callback$$)=>{getParticipantInfo($user$$,$item$$,()=>{$item$$.appAdmin||(delete $item$$.viettel_user,delete $item$$.viettel_password,delete $item$$.viettel_url_service,delete $item$$.vnpt_user,delete $item$$.vnpt_password,
|
|
9
|
+
delete $item$$.vnpt_url_service,delete $item$$.easy_user,delete $item$$.easy_password,delete $item$$.easy_url_service,delete $item$$.zalo_app_id,delete $item$$.zalo_secret_key,delete $item$$.zalo_code,delete $item$$.zalo_oa_id,delete $item$$.zalo_code_verifier,delete $item$$.zalo_code_challenge,delete $item$$.zalo_access_token,delete $item$$.zalo_refresh_token,delete $item$$.google_credentials,delete $item$$.wallet_address,delete $item$$.wallet_token,delete $item$$.voiip_access_token,delete $item$$.sip_password,
|
|
10
|
+
delete $item$$.email_host,delete $item$$.email_port,delete $item$$.email_secure,delete $item$$.email_authMethod,delete $item$$.email_user,delete $item$$.email_pass,delete $item$$.email_name,delete $item$$.zalo_app_id,delete $item$$.zalo_secret_key,delete $item$$.zalo_code,delete $item$$.zalo_oa_id,delete $item$$.zalo_access_token,delete $item$$.zalo_refresh_token,delete $item$$.google_credentials,delete $item$$.vnpt_user,delete $item$$.vnpt_password,delete $item$$.vnpt_url_service);$callback$$()})},
|
|
11
|
+
()=>{$callback$$()})}},function(){$items$$.forEach(function($item$$){calcTimeExpired($item$$)});$fn$$(null,$items$$)})};$contr_router$$.getting=async($user$$,$id_p$$,$next$$)=>{($id_p$$=await Participant.findOne({id_app:$id_p$$,email:$user$$.email}).lean())&&$id_p$$.cancel!==!0?$next$$():(Logger.error("[sys-app][getting]participant info of",$user$$.email,$id_p$$),$next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp c\u00f4ng ty n\u00e0y"))};$contr_router$$.finding=async($user$$,$condition$$,
|
|
12
|
+
$next$$)=>{try{var $_appsOfUser_or1$$=await Participant.appsOfUser($user$$.email);$_appsOfUser_or1$$=$_appsOfUser_or1$$.map($p$$=>$p$$.id_app);let $user_created_condition$$={user_created:$user$$.email};$_appsOfUser_or1$$=[{_id:{$in:$_appsOfUser_or1$$}},$user_created_condition$$];let $or2$$=$condition$$.$or;delete $condition$$.$or;$or2$$?$condition$$.$and=[{$or:$_appsOfUser_or1$$},{$or:$or2$$}]:$condition$$.$or=$_appsOfUser_or1$$;$condition$$.working||(isSupperAdmin($user$$.email.toLowerCase())?delete $user_created_condition$$.user_created:
|
|
13
|
+
underscore.contains(configs.admins,$user$$.email)&&($user_created_condition$$.user_created={$nin:["invncur@gmail.com","admin"]}));delete $condition$$.working;$user$$.token_id_app&&($condition$$._id=$user$$.token_id_app);$user$$.token_id_apps&&$user$$.token_id_apps.length>0&&($condition$$._id={$in:$user$$.token_id_apps});$next$$(null,$condition$$)}catch($e$$){Logger.error("[sys-app] finding:",$e$$),$next$$($e$$.message||$e$$.error||$e$$)}};$contr_router$$.creating=async function($user$$,$obj$$,$next$$){if($user$$.token_id_app||
|
|
14
|
+
$user$$.token_id_apps&&$user$$.token_id_apps.length>0)return $next$$({error:"Kh\u00f4ng th\u1ec3 t\u1ea1o c\u00f4ng ty m\u1edbi v\u1edbi m\u1eadt kh\u1ea9u b\u1ea1n \u0111ang s\u1eed d\u1ee5ng. H\u00e3y \u0111\u0103ng nh\u1eadp b\u1eb1ng m\u1eadt kh\u1ea9u ch\u00ednh c\u1ee7a b\u1ea1n \u0111\u1ec3 t\u1ea1o c\u00f4ng ty m\u1edbi"});if(!$user$$.admin){var $now_sl_da_tao$$=await model.countDocuments({user_created:$user$$.email});$user$$=await global.getModel("user").findOne({email:$user$$.email}).lean();
|
|
15
|
+
if($now_sl_da_tao$$>=($user$$?.so_luong_db||1))return $next$$("S\u1ed1 l\u01b0\u1ee3ng c\u00f4ng ty b\u1ea1n c\u00f3 th\u1ec3 kh\u1edfi t\u1ea1o \u0111\u00e3 h\u1ebft.");delete $obj$$.allow_modules;delete $obj$$.trang_thai;delete $obj$$.sale_online}if(!$obj$$.ngay_dn)return $next$$(Error("Ng\u00e0y \u0111\u1ea7u n\u0103m t\u00e0i ch\u00ednh kh\u00f4ng \u0111\u01b0\u1ee3c tr\u1ed1ng"));$obj$$.ngay_ks||($obj$$.ngay_ks=new Date("2000-01-01"));$obj$$.ngay_ky1||($obj$$.ngay_ky1=new Date);$now_sl_da_tao$$=
|
|
16
|
+
new Date;$now_sl_da_tao$$.setMonth($now_sl_da_tao$$.getMonth()+1);$obj$$.expire_date=new Date($now_sl_da_tao$$);$obj$$.nam_bd=$obj$$.ngay_ky1.getFullYear();$obj$$.options=$obj$$.options||{};$obj$$.ai_api_key&&!$obj$$.ai_api_key.startsWith("flexbiz::")&&($obj$$.ai_api_key="flexbiz::"+encrypt($obj$$.ai_api_key));$next$$(null,$obj$$)};$contr_router$$.created=function($user$$,$obj$$,$next$$){Logger.warn("\ud83d\udd25[app][created] Kh\u1edfi t\u1ea1o d\u1eef li\u1ec7u cho c\u00f4ng ty m\u1edbi...");require("../../libs/initDatabase").init($obj$$._id,
|
|
17
|
+
async $error$$=>{if($error$$)return Logger.error("[app][created] Kh\u00f4ng th\u1ec3 kh\u1edfi t\u1ea1o d\u1eef li\u1ec7u cho c\u00f4ng ty m\u1edbi. L\u1ed7i:"+$error$$),$next$$(`Kh\u00f4ng th\u1ec3 kh\u1edfi t\u1ea1o d\u1eef li\u1ec7u cho c\u00f4ng ty m\u1edbi. L\u1ed7i: ${$error$$.message||$error$$.error||$error$$}`);Logger.warn("\u2705 [app][created] \u0111\u00e3 kh\u1edfi t\u1ea1o xong d\u1eef li\u1ec7u cho c\u00f4ng ty m\u1edbi");createUserOwner($obj$$,$e$$=>{if($e$$)return Logger.error("[app][created] Kh\u00f4ng th\u1ec3 kh\u1edfi t\u1ea1o ng\u01b0\u1eddi d\u00f9ng cho c\u00f4ng ty m\u1edbi. L\u1ed7i:",
|
|
18
|
+
$e$$),$next$$(`Kh\u00f4ng th\u1ec3 kh\u1edfi t\u1ea1o ng\u01b0\u1eddi d\u00f9ng cho c\u00f4ng ty m\u1edbi. L\u1ed7i: ${$e$$.message||$e$$.error||$e$$}`);Logger.warn("\u2705 [app][created] \u0111\u00e3 t\u1ea1o xong c\u00f4ng ty m\u1edbi");$next$$(null,$obj$$)})})};$contr_router$$.updating=async function($user$$,$data$$,$obj$$,$next$$){delete $data$$.ngay_ks;$user$$.admin||(delete $data$$.allow_modules,delete $data$$.expire_date,delete $data$$.trang_thai,delete $data$$.sale_online,delete $data$$.menu_code,
|
|
19
|
+
delete $data$$.ai_api_key);$data$$.ai_api_key&&!$data$$.ai_api_key.startsWith("flexbiz::")&&($data$$.ai_api_key="flexbiz::"+encrypt($data$$.ai_api_key));permission.isAdmin($obj$$._id,$user$$.email,function($e$$,$admin$$){if(!$admin$$&&!$user$$.admin)return $next$$($user$$.email+" have not permission");$data$$.ngay_ky1&&($data$$.nam_bd=(new Date($data$$.ngay_ky1)).getFullYear());$data$$.options&&Object.keys($data$$.options).length===0&&delete $data$$.options;$data$$.options=$data$$.options?{...$obj$$.options,
|
|
20
|
+
...$data$$.options}:$obj$$.options||{};$next$$(null,$data$$,$obj$$)})};$contr_router$$.updated=function($user$$,$obj$$,$next$$){createUserOwner($obj$$,$e$$=>{$e$$&&Logger.error($e$$);$next$$(null,$obj$$)})};$contr_router$$.deleting=function($user$$,$obj$$,$next$$){if($user$$.email!=$obj$$.user_created&&!$user$$.admin)return $next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n x\u00f3a c\u00f4ng ty n\u00e0y");$next$$(null,$obj$$)};$contr_router$$.deleted=function($user$$,$obj$$,$next$$){async.mapLimit(fs.readdirSync(path.dirname(path.dirname(__dirname))+
|
|
21
|
+
"/models").filter($f$$=>$f$$.indexOf(".js")>0),20,($file$$,$callback$$)=>{try{let $_model$$=global.getModel(""+$file$$);underscore.has($_model$$.schema.paths,"id_app")?$_model$$.deleteMany({id_app:$obj$$._id},()=>{Logger.info("Deleted ",$file$$,"id_app",$obj$$._id);$callback$$()}):$callback$$()}catch($e$$){Logger.error("Can't delete mode",$file$$,"error:",$e$$.message),$callback$$()}},()=>{$next$$(null,$obj$$)})};$contr_router$$.router.route($contr_router$$.route_name+"/backup/:id").get(function($req$$,
|
|
22
|
+
$res$$){let $email$$=$req$$.user.email,$id_app$$=$req$$.params.id;permission.isAdmin($id_app$$,$email$$,function($backupWorkerFile_e$$,$admin$$){if(!$admin$$)return $res$$.status(400).send({error:"Ch\u1ec9 admin m\u1edbi c\u00f3 quy\u1ec1n backup d\u1eef li\u1ec7u c\u1ee7a c\u00f4ng ty"});global.backupPool||($backupWorkerFile_e$$=path.dirname(path.dirname(__dirname))+"/workers/backupApp.js",global.backupPool=new StaticPool($backupWorkerFile_e$$,0,1,18E5));global.getModel("log").create({id_app:$id_app$$,
|
|
23
|
+
id_func:"app",action:"BACKUP",data:{dateFrom:$req$$.query.dateFrom,dateTo:$req$$.query.dateTo,backup_app_info:$req$$.query.backup_app_info}},$req$$.user.email,$req$$.user_agent,$req$$);global.backupPool.exec({id:$id_app$$,user:$email$$,dateFrom:$req$$.query.dateFrom,dateTo:$req$$.query.dateTo,backup_app_info:$req$$.query.backup_app_info,configs:{database:global.configs.database}},$response$$=>{if($response$$.error)return $res$$.status(400).send($response$$.error);Logger.info("[app][backup]",JSON.stringify($response$$,
|
|
24
|
+
null,2));$res$$.sendFile($response$$.file)})})});$contr_router$$.router.route($contr_router$$.route_name+"/restore/:id").post(async function($req$$,$res$$){let $fileZip$$;$req$$.files&&$req$$.files.backup&&$req$$.files.backup.path?$fileZip$$=$req$$.files.backup.path:$req$$.body&&$req$$.body.file_from_server&&fs.existsSync($req$$.body.file_from_server)&&($fileZip$$=$req$$.body.file_from_server);if(!$fileZip$$)return $res$$.status(400).send("Kh\u00f4ng t\u00ecm th\u1ea5y file backup");let $email$$=
|
|
25
|
+
$req$$.user.email,$id_app$$=$req$$.params.id;permission.isAdmin($id_app$$,$email$$,function($backupWorkerFile$jscomp$1_e$$,$admin$$){if(!$admin$$)return $res$$.status(400).send({error:"Ch\u1ec9 admin m\u1edbi c\u00f3 quy\u1ec1n restore d\u1eef li\u1ec7u c\u1ee7a c\u00f4ng ty"});global.backupPool||($backupWorkerFile$jscomp$1_e$$=path.dirname(path.dirname(__dirname))+"/workers/backupApp.js",global.backupPool=new StaticPool($backupWorkerFile$jscomp$1_e$$,0,1,18E5));global.backupPool.exec({id:$id_app$$,
|
|
26
|
+
user:$email$$,configs:{database:global.configs.database}},$response$$=>{if($response$$.error)return $res$$.status(400).send($response$$.error);global.getModel("log").create({id_app:$id_app$$,id_func:"app",action:"RESTORE",data:{backup_file:path.dirname(path.dirname(__dirname))+"/backup/"+$response$$.file,restore_file:$fileZip$$}},$req$$.user.email,$req$$.user_agent,$req$$);global.restorePool||($response$$=path.dirname(path.dirname(__dirname))+"/workers/restoreApp.js",global.restorePool=new StaticPool($response$$,
|
|
27
|
+
0,1,18E5));global.restorePool.exec({id:$id_app$$,user:$email$$,file:$fileZip$$,configs:{database:global.configs.database}},$response$$=>{$response$$.error?(Logger.error("[restore data] l\u1ed7i khi restore data",$response$$.error),_Notification.createNotification($email$$,$email$$,$response$$.error,$response$$.error,null,null,!0,$req$$.access_token,!0)):(Logger.info("[restore data] \u0111\u00e3 ho\u00e0n th\u00e0nh restore d\u1eef li\u1ec7u. \u0110ang g\u1eedi email th\u00f4ng b\u00e1o k\u1ebft qu\u1ea3"),
|
|
28
|
+
_Notification.createNotification($email$$,$email$$,$response$$.result,$response$$.result,null,null,!0,$req$$.access_token,!0))});$res$$.send("Ch\u01b0\u01a1ng tr\u00ecnh \u0111ang th\u1ef1c hi\u1ec7n. Xin ch\u1edd trong gi\u00e2y l\u00e1t")})})});$contr_router$$.router.route($contr_router$$.route_name+"/apps/:email_owner").get(async function($query_req$$,$res$$){var $_appsOfUser$jscomp$1_email$$=$query_req$$.params.email_owner;if(!underscore.contains(configs.admins,$query_req$$.user.email)&&!isSupperAdmin($query_req$$.user.email.toLowerCase()))return $res$$.status(403).send("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp t\u00ednh n\u0103ng n\u00e0y");
|
|
29
|
+
$query_req$$={};$_appsOfUser$jscomp$1_email$$.toLowerCase()!="all"&&($_appsOfUser$jscomp$1_email$$=await Participant.appsOfUser($_appsOfUser$jscomp$1_email$$),$_appsOfUser$jscomp$1_email$$=$_appsOfUser$jscomp$1_email$$.map($p$$=>$p$$.id_app),$query_req$$._id={$in:$_appsOfUser$jscomp$1_email$$});model.find($query_req$$).lean().exec(function($error$$,$apps$$){if($error$$)return $res$$.status(400).send($error$$);$apps$$.forEach(function($item$$){calcTimeExpired($item$$)});$res$$.send($apps$$)})});$contr_router$$.router.route($contr_router$$.route_name+
|
|
30
|
+
"/remove/:id").get(async($app_req$$,$res$$)=>{var $id_app$jscomp$2_p$$=$app_req$$.params.id;let $email$$=$app_req$$.user.email;$app_req$$=await model.findById($id_app$jscomp$2_p$$);if(!$app_req$$)return $res$$.status(400).send("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");$app_req$$.participants&&($app_req$$.participants=$app_req$$.participants.filter($p$$=>$p$$.email!==$email$$),$app_req$$.save(()=>{}));if($id_app$jscomp$2_p$$=await Participant.findOne({id_app:$id_app$jscomp$2_p$$,email:$email$$}))await Participant.deleteOne({_id:$id_app$jscomp$2_p$$._id}),
|
|
31
|
+
$id_app$jscomp$2_p$$=`${$id_app$jscomp$2_p$$.name} (${$email$$}) \u0111\u00e3 r\u1eddi kh\u1ecfi c\u00f4ng ty ${$app_req$$.name}`,_Notification.createNotification($email$$,$app_req$$.user_created,$id_app$jscomp$2_p$$,$id_app$jscomp$2_p$$);$res$$.send("ok")});$contr_router$$.router.route($contr_router$$.route_name+"/join/:id/:group").get(async($req$$,$res$$)=>{let $id_app$$=$req$$.params.id,$group_id$$=$req$$.params.group,$email$$=$req$$.user.email,$user$$=$req$$.user,$app$$=await model.findById($id_app$$);
|
|
32
|
+
if(!$app$$)return $res$$.status(400).send("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");if(!await Participant.findOne({id_app:$id_app$$,email:$email$$})&&$group_id$$&&global.mongoose.Types.ObjectId.isValid($group_id$$))try{if(!await UserGroup.findOne({_id:$group_id$$,is_customer_group:!0}))return $res$$.status(400).send("Nh\u00f3m kh\u00e1ch h\u00e0ng kh\u00f4ng t\u1ed3n t\u1ea1i");Participant.createParticipant({id_app:$id_app$$,email:$email$$,name:$user$$.name,group_id:$group_id$$,active:!0},
|
|
33
|
+
$cust_e$$=>{if($cust_e$$)return $res$$.status(400).send("can't add user",$user$$.email,"to company",$app$$.name);$cust_e$$={ten_kh:$user$$.name,email:$user$$.email,id_app:$id_app$$,user_created:$user$$.email,user_updated:$user$$.email,kh_yn:!0,of_user:$user$$.email};isMobilePhone($user$$.email,["vi-VN"])&&($cust_e$$.dien_thoai=$user$$.email);try{Customer.asyncCreateCustomer($cust_e$$)}catch($e$$){Logger.info("Auto create new customer with error:",$e$$.message)}$res$$.send("ok")})}catch($e$$){$res$$.status(400).send($e$$.message)}$res$$.send("ok")})};
|
package/server/route.js
CHANGED
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
const fs=require("fs"),appModel=global.getModel("app"),listinfo=global.getModel("listinfo"),Token=global.getModel("token"),express=require("express"),passport=require("passport"),path=require("path"),async=require("async"),sharp=require("sharp"),docs=require("./libs/docs"),{isValidObjectId}=require("mongoose"),permission=require("./libs/permission"),{sendMessageZalo}=require("./libs/utils"),{getTmpFile}=require("./libs/excelHelper"),controllerRPT=require("./controllers/controllerRPT")
|
|
1
|
+
const fs=require("fs"),appModel=global.getModel("app"),listinfo=global.getModel("listinfo"),Token=global.getModel("token"),express=require("express"),passport=require("passport"),path=require("path"),async=require("async"),sharp=require("sharp"),docs=require("./libs/docs"),{isValidObjectId}=require("mongoose"),permission=require("./libs/permission"),{sendMessageZalo}=require("./libs/utils"),{getTmpFile}=require("./libs/excelHelper"),controllerRPT=require("./controllers/controllerRPT"),isAdmin=($req$$,
|
|
2
|
+
$res$$,$next$$)=>{$req$$.user&&$req$$.user.admin?$next$$():$res$$.status(403).json({message:"Y\u00eau c\u1ea7u quy\u1ec1n qu\u1ea3n tr\u1ecb vi\u00ean"})};
|
|
2
3
|
module.exports=async function($app$$,$cb$$=()=>{},$limiter$jscomp$2_limiter$$=!1){var $createRateLimiterMiddleware_limiter_others$$=global.createRateLimiterMiddleware;const $router$$=global.routerAPI=express.Router();if($limiter$jscomp$2_limiter$$!==!0){configs.trust_proxy&&$app$$.enable("trust proxy",!0);require("./auths/google")($app$$,passport);require("./auths/facebook")($app$$,passport);require("./auths/local")($app$$,passport);require("./auths/bearer")(passport);$router$$.use(async function($req$$,
|
|
3
4
|
$access_token_listinfo_code_res$$,$next$$){for(let $key$$ in $req$$.query)$req$$.query[$key$$]=="true"&&($req$$.query[$key$$]=!0),$req$$.query[$key$$]=="false"&&($req$$.query[$key$$]=!1);($access_token_listinfo_code_res$$=$req$$.query.access_token)||($access_token_listinfo_code_res$$=$req$$.get("X-Access-Token")||$req$$.get("access-token"));$access_token_listinfo_code_res$$&&($req$$.query.access_token=$access_token_listinfo_code_res$$,Token.updateOne({token:$access_token_listinfo_code_res$$,used:{$ne:!0}},
|
|
4
5
|
{used:!0}).catch($err$$=>Logger.error("Token update error:",$err$$)));($access_token_listinfo_code_res$$=$req$$.get("listinfo-code")||$req$$.query["listinfo-code"])&&($req$$.query["listinfo-code"]=$access_token_listinfo_code_res$$);$next$$()});var $authenticate_dynamic_list_limiter_limiter$$=require("./auths/authMiddleware");$router$$.use($authenticate_dynamic_list_limiter_limiter$$);$router$$.param("id_app",async function($req$$,$res$$,$next$$,$id_app$$){let $_clientIp$$=(($req$$.headers["x-forwarded-for"]||
|
|
5
6
|
"").split(",").pop()||$req$$.connection.remoteAddress||$req$$.socket.remoteAddress||$req$$.connection.socket.remoteAddress).split(":");if($id_app$$){if($req$$.user.token_id_app&&$req$$.user.token_id_app!=$id_app$$)return $res$$.status(400).send(`Token kh\u00f4ng c\u00f3 gi\u00e1 tr\u1ecb cho c\u00f4ng ty '${$id_app$$}'`);if(mongoose.Types.ObjectId.isValid($id_app$$))try{const $appInfo$$=await appModel.findById($id_app$$).lean();if($appInfo$$)$req$$.user.current_id_app=$id_app$$,$appInfo$$.options||
|
|
6
7
|
($appInfo$$.options={}),$req$$.user.current_app_info=$appInfo$$,$req$$.query.id_app=$id_app$$,$req$$.user.clientIp=$_clientIp$$[$_clientIp$$.length-1],$req$$.user.appAdmin=await new Promise($rs$$=>{permission.isAdmin($id_app$$,$req$$.user.email,function($e$$,$admin$$){$rs$$($admin$$)})}),$req$$.user.current_app_info.appAdmin=$req$$.user.appAdmin,$next$$();else return $res$$.status(400).send(`ID c\u00f4ng ty '${$id_app$$}' kh\u00f4ng t\u1ed3n t\u1ea1i`)}catch($error$$){$next$$($error$$)}else return $res$$.status(400).send("id_app:'"+
|
|
7
|
-
$id_app$$+"' kh\u00f4ng c\u00f3 gi\u00e1 tr\u1ecb")}else $req$$.user&&($req$$.user.current_id_app=void 0,$req$$.user.appAdmin=void 0,$req$$.user.current_app_info={},$req$$.user.clientIp=$_clientIp$$[$_clientIp$$.length-1],$next$$())});configs.limitRequest.api&&($authenticate_dynamic_list_limiter_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.api,"api"),$router$$.use($authenticate_dynamic_list_limiter_limiter$$))
|
|
8
|
-
"/dispatch-report/:id_app/:code","/dispatch-report/:code"],($req$$,$res$$,$next$$)=>{const {id_app:$id_app$$,code:$code$$,subReport:$subReport$$}=$req$$.params,$queryString$$=$req$$.url.includes("?")?$req$$.url.substring($req$$.url.indexOf("?")):"",$subPath$$=$subReport$$?`/${$subReport$$}`:"";if(global.controllers?.[$code$$.trim().toUpperCase()])$req$$.url=$id_app
|
|
9
|
-
$res$$.status(404).json({success:!1,message:`B\u00e1o c\u00e1o '${$code$$}' kh\u00f4ng t\u1ed3n t\u1ea1i v\u00e0 kh\u00f4ng h\u1ed7 tr\u1ee3 lu\u1ed3ng ph\u1ee5 (subReport).`});
|
|
10
|
-
$next$$()});const $funcs_inited$$={};configs.paths.modules&&fs.existsSync(configs.paths.modules+"/lists")&&fs.readdirSync(configs.paths.modules+
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
(require("
|
|
14
|
-
$
|
|
15
|
-
$ext$$.toLowerCase(),$ext$$===".exe")return $res$$.status(400).send({error:"Ki\u1ec3u file n\u00e0y kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn"})}else return $res$$.status(400).send({error:"Ki\u1ec3u file n\u00e0y kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn"});
|
|
16
|
-
$error$$.error||$error$$});if($_user$$){const $user$$=await global.getModel("user").findOne({email:$_user$$.email});fs.readFile($req$$.files.fileupload.path,async function($err$$,$data$$){if($err$$)return $res$$.status(400).send({error:$err$$.message||$err$$.error
|
|
17
|
-
$folder$$);$id_app$$&&$folder$$!="avatar"&&($folder$$=$folder$$+"/"+$id_app$$,fs.existsSync($err$$+$folder$$)||fs.mkdirSync($err$$+$folder$$));let $newPath$$=$folder$$+"/"+$user$$._id.toString()+"_"+(new Date).getTime().toString()+"_"+$originalname_p$$,$path_image$$;
|
|
18
|
-
$err$$.error||$err$$});fs.unlink($req$$.files.fileupload.path,$e$$=>{$e$$&&Logger.error($e$$)});$req$$.query.json?$res$$.send({fileUrl:"/getfile/"+$newPath$$}):($res$$.writeHead(200,{"Content-Type":"text/html"}),$res$$.end("<html><head><title>/getfile/"+$newPath$$+
|
|
19
|
-
1],$path_image_thumb$$=$err$$+$thumbPath$$,$_gm$$=sharp($req$$.files.fileupload.path,{failOnError:!1});($err$$=await $_gm$$.metadata())&&$err$$.format!="webp"&&($thumbPath$$+=".webp",$path_image_thumb$$+=".webp",$_gm$$=$_gm$$.webp({lossless:!1}));
|
|
20
|
-
$error$$.message,". Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd s\u1eed d\u1ee5ng file g\u1ed1c\n",$req$$.header("user-agent")),fs.writeFile($path_image$$,$data$$,$e$$=>{if($e$$)return $callback$$($error$$);$callback$$()})):
|
|
21
|
-
async function($error$$){if($error$$){Logger.error("Kh\u00f4ng th\u1ec3 t\u1ea1o thumbnail cho h\u00ecnh \u1ea3nh n\u00e0y\n"+$error$$,$req$$.files.fileupload.path,". Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd s\u1eed d\u1ee5ng file g\u1ed1c l\u00e0m thubnail\n"
|
|
22
|
-
($error$$.message||$error$$.error||$error$$)})}}fs.unlink($req$$.files.fileupload.path,$e$$=>{$e$$&&Logger.error($e$$)});let $path_avatar$$="/getfile/"+$newPath$$,$path_thumb$$="/getfile/"+$thumbPath$$;$folder$$==
|
|
23
|
-
$res$$.send("\u0110\u00e3 c\u1eadp nh\u1eadt th\u00e0nh c\u00f4ng")});$req$$.query.json?$res$$.send({image:$path_avatar$$,thumb:$path_thumb$$,fileUrl:$path_avatar$$}):($res$$.writeHead(200,{"Content-Type":"text/html"})
|
|
24
|
-
"</title></head><body>success</body></html>"))})})}})}else $res$$.status(404).send({error:"Not found"})})});$sys_router$$.route("/uploadexcel").post(function($req$$,$res$$){let $access_token$$=$req$$.query.access_token;
|
|
25
|
-
$ext$jscomp$1_ip$$.toLowerCase(),$ext$jscomp$1_ip$$!=".xlsx"&&$ext$jscomp$1_ip$$!=".xml")$res$$.status(400).send("Ch\u1ec9 ch\u1ea5p nh\u1eadn c\u00e1c \u0111\u1ecbnh d\u1ea1ng file: xlsx,xml");
|
|
26
|
-
function($error$$,$user$$){if($error$$)return $res$$.status(400).send({error:$error$$.message||$error$$.error||$error$$});$user$$?fs.readFile($req$$.files.fileupload.path,function($err$$,$data$$){if($err$$)return $res$$($err$$);
|
|
27
|
-
$root_dir_templates$$+$newPath$$);fs.writeFile($root_dir_templates$$+$newPath$$,$data$$,function($error$$){if($error$$)return Logger.error("Error upload file",$error$$),$res$$.status(404).send($error$$)
|
|
28
|
-
$res$$.status(404).send({error:"Not found"})})}else $res$$.status(400).send("Ch\u1ec9 ch\u1ea5p nh\u1eadn c\u00e1c \u0111\u1ecbnh d\u1ea1ng file: xlsx,xml")});let $funcs_sys_inited$$={};configs.paths.modules&&
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
configs.limitRequest.public&&($limiter$jscomp$2_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.public,"public"),$router$$.use($limiter$jscomp$2_limiter$$));$public_router$$.use(function($req
|
|
32
|
-
if($app$$)$req$$.user={current_id_app:$id_app$$,email:"public"},$req$$.query.id_app=$id_app$$,$next$$();else return $res$$.status(400).send("Kh\u00f4ng t\u1ed3n t\u1ea1i c\u00f4ng ty n\u00e0y")})}else $next$$()})
|
|
33
|
-
"/public
|
|
34
|
-
await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.other||{},"other");$app$$.get("/downloads/temp/:fileName",$createRateLimiterMiddleware_limiter_others$$,async function($fileName_req$$,$res$$){$fileName_req
|
|
8
|
+
$id_app$$+"' kh\u00f4ng c\u00f3 gi\u00e1 tr\u1ecb")}else $req$$.user&&($req$$.user.current_id_app=void 0,$req$$.user.appAdmin=void 0,$req$$.user.current_app_info={},$req$$.user.clientIp=$_clientIp$$[$_clientIp$$.length-1],$next$$())});configs.limitRequest.api&&($authenticate_dynamic_list_limiter_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.api,"api"),$router$$.use($authenticate_dynamic_list_limiter_limiter$$));global.storageUsage&&$app$$.use("/api/storage-usage",
|
|
9
|
+
isAdmin,global.storageUsage.createExpressRouter());$app$$.use("/api",$router$$)}$router$$.post(["/dispatch-report/:id_app/:code/:subReport","/dispatch-report/:id_app/:code","/dispatch-report/:code"],($req$$,$res$$,$next$$)=>{const {id_app:$id_app$$,code:$code$$,subReport:$subReport$$}=$req$$.params,$queryString$$=$req$$.url.includes("?")?$req$$.url.substring($req$$.url.indexOf("?")):"",$subPath$$=$subReport$$?`/${$subReport$$}`:"";if(global.controllers?.[$code$$.trim().toUpperCase()])$req$$.url=$id_app$$?
|
|
10
|
+
`/search/${$id_app$$}/${$code$$}${$subPath$$}${$queryString$$}`:`/search/${$code$$}${$subPath$$}${$queryString$$}`;else{if(!global.report_controllers?.[$code$$.toUpperCase()]){if($subReport$$)return Logger.error(`[dispatch-report] L\u1ed7i: B\u00e1o c\u00e1o '${$code$$}' kh\u00f4ng t\u1ed3n t\u1ea1i, t\u1eeb ch\u1ed1i x\u1eed l\u00fd subReport: '${$subReport$$}'`),$res$$.status(404).json({success:!1,message:`B\u00e1o c\u00e1o '${$code$$}' kh\u00f4ng t\u1ed3n t\u1ea1i v\u00e0 kh\u00f4ng h\u1ed7 tr\u1ee3 lu\u1ed3ng ph\u1ee5 (subReport).`});
|
|
11
|
+
Logger.warn("[route] T\u1ea1o customize report...",$code$$);new controllerRPT($router$$,$code$$,async function($req$$,$callback$$){$callback$$(null,[])})}$req$$.url=$id_app$$?`/${$id_app$$}/${$code$$}${$subPath$$}${$queryString$$}`:`/${$code$$}${$subPath$$}${$queryString$$}`}Logger.info(`[dispatch-report] ${$req$$.method} ${$req$$.originalUrl} ---> ${$req$$.url}`);$next$$()});const $funcs_inited$$={};configs.paths.modules&&fs.existsSync(configs.paths.modules+"/lists")&&fs.readdirSync(configs.paths.modules+
|
|
12
|
+
"/lists").forEach(function($file$$){$file$$.endsWith(".js")&&(require(configs.paths.modules+"/lists/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});fs.existsSync(__dirname+"/modules/lists")&&fs.readdirSync(__dirname+"/modules/lists").filter($file$$=>!$funcs_inited$$[$file$$]).forEach(function($file$$){$file$$.endsWith(".js")&&(require("./modules/lists/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});configs.paths.modules&&fs.existsSync(configs.paths.modules+"/vouchers")&&fs.readdirSync(configs.paths.modules+
|
|
13
|
+
"/vouchers").forEach(function($file$$){$file$$.endsWith(".js")&&(require(configs.paths.modules+"/vouchers/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});fs.existsSync(__dirname+"/modules/vouchers")&&fs.readdirSync(__dirname+"/modules/vouchers").filter($file$$=>!$funcs_inited$$[$file$$]).forEach(function($file$$){$file$$.endsWith(".js")&&(require("./modules/vouchers/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});configs.paths.modules&&fs.existsSync(configs.paths.modules+"/reports")&&
|
|
14
|
+
fs.readdirSync(configs.paths.modules+"/reports").forEach(function($file$$){$file$$.endsWith(".js")&&(require(configs.paths.modules+"/reports/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});fs.existsSync(__dirname+"/modules/reports")&&fs.readdirSync(__dirname+"/modules/reports").filter($file$$=>!$funcs_inited$$[$file$$]).forEach(function($file$$){$file$$.endsWith(".js")&&(require("./modules/reports/"+$file$$)($router$$),$funcs_inited$$[$file$$]=$file$$)});const $sys_router$$=express.Router();
|
|
15
|
+
$sys_router$$.use(passport.authenticate("bearer",{session:!1}));configs.limitRequest.sys&&($authenticate_dynamic_list_limiter_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.sys,"sys"),$sys_router$$.use($authenticate_dynamic_list_limiter_limiter$$));$app$$.use("/api",$sys_router$$);const $redisCache$$=require("./libs/redis-cache");$sys_router$$.route("/uploadfile").post(function($req$$,$res$$){const $access_token$$=$req$$.query.access_token;let $folder$$=$req$$.query.folder||
|
|
16
|
+
"";const $id_app$$=$req$$.query.id_app;if(!$req$$.files.fileupload)if($req$$.files.file)$req$$.files.fileupload=$req$$.files.file;else return $res$$.status(400).send({error:"File kh\u00f4ng t\u1ed3n t\u1ea1i"});const $path$$=require("path");if(!$req$$.files.fileupload.path)return $res$$.status(400).send({error:"File kh\u00f4ng t\u1ed3n t\u1ea1i"});let $ext$$=$path$$.extname($req$$.files.fileupload.path);if($ext$$){if($ext$$=$ext$$.toLowerCase(),$ext$$===".exe")return $res$$.status(400).send({error:"Ki\u1ec3u file n\u00e0y kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn"})}else return $res$$.status(400).send({error:"Ki\u1ec3u file n\u00e0y kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn"});
|
|
17
|
+
const $ip$$=$req$$.ip||$req$$.headers["x-forwarded-for"]||$req$$.socket.remoteAddress;global.getModel("user").findByToken($access_token$$,$ip$$,async($error$$,$_user$$)=>{if($error$$)return $res$$.status(400).send({error:$error$$.message||$error$$.error||$error$$});if($_user$$){const $user$$=await global.getModel("user").findOne({email:$_user$$.email});fs.readFile($req$$.files.fileupload.path,async function($err$$,$data$$){if($err$$)return $res$$.status(400).send({error:$err$$.message||$err$$.error||
|
|
18
|
+
$err$$});var $originalname_p$$=$req$$.files.fileupload.originalname.split(" ").join("_");$err$$=configs.paths.images||$path$$.dirname($path$$.dirname(__dirname))+"/images";$err$$+="/";fs.existsSync($err$$+$folder$$)||fs.mkdirSync($err$$+$folder$$);$id_app$$&&$folder$$!="avatar"&&($folder$$=$folder$$+"/"+$id_app$$,fs.existsSync($err$$+$folder$$)||fs.mkdirSync($err$$+$folder$$));let $newPath$$=$folder$$+"/"+$user$$._id.toString()+"_"+(new Date).getTime().toString()+"_"+$originalname_p$$,$path_image$$;
|
|
19
|
+
if($ext$$!==".png"&&$ext$$!==".jpeg"&&$ext$$!==".jpg"&&$ext$$!==".gif"&&$ext$$!==".webp")$path_image$$=$err$$+$newPath$$,fs.writeFile($path_image$$,$data$$,function($err$$){if($err$$)return $res$$.status(400).send({error:$err$$.message||$err$$.error||$err$$});fs.unlink($req$$.files.fileupload.path,$e$$=>{$e$$&&Logger.error($e$$)});$req$$.query.json?$res$$.send({fileUrl:"/getfile/"+$newPath$$}):($res$$.writeHead(200,{"Content-Type":"text/html"}),$res$$.end("<html><head><title>/getfile/"+$newPath$$+
|
|
20
|
+
"</title></head><body>success</body></html>"))});else{$ext$$!==".webp"&&($newPath$$+=".webp");$path_image$$=$err$$+$newPath$$;$originalname_p$$=$originalname_p$$.split(".");var $thumbPath$$=$newPath$$+".thumb."+$originalname_p$$[$originalname_p$$.length-1],$path_image_thumb$$=$err$$+$thumbPath$$,$_gm$$=sharp($req$$.files.fileupload.path,{failOnError:!1});($err$$=await $_gm$$.metadata())&&$err$$.format!="webp"&&($thumbPath$$+=".webp",$path_image_thumb$$+=".webp",$_gm$$=$_gm$$.webp({lossless:!1}));
|
|
21
|
+
async.parallel([function($callback$$){setImmediate(async()=>{let $orgin_file_size$$=await $_gm$$.metadata();$orgin_file_size$$&&$orgin_file_size$$.width>4096?$_gm$$.resize({width:4096}).rotate().toFile($path_image$$,async function($error$$){$error$$?(Logger.error("save resize image:",$error$$.message,". Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd s\u1eed d\u1ee5ng file g\u1ed1c\n",$req$$.header("user-agent")),fs.writeFile($path_image$$,$data$$,$e$$=>{if($e$$)return $callback$$($error$$);$callback$$()})):
|
|
22
|
+
(Logger.info("resize image",$path_image$$),$callback$$())}):fs.writeFile($path_image$$,$data$$,function($err$$){$callback$$($err$$)})})}],function($err$$){if($err$$)return $res$$.status(400).send({error:$err$$.message||$err$$.error||$err$$});$_gm$$.resize({width:350}).rotate().toFile($path_image_thumb$$,async function($error$$){if($error$$){Logger.error("Kh\u00f4ng th\u1ec3 t\u1ea1o thumbnail cho h\u00ecnh \u1ea3nh n\u00e0y\n"+$error$$,$req$$.files.fileupload.path,". Ch\u01b0\u01a1ng tr\u00ecnh s\u1ebd s\u1eed d\u1ee5ng file g\u1ed1c l\u00e0m thubnail\n",
|
|
23
|
+
$req$$.header("user-agent"));try{await new Promise(($res$$,$rej$$)=>{fs.writeFile($path_image_thumb$$,$data$$,$e$$=>{if($e$$)return $rej$$($e$$);$res$$()})})}catch($error$$){return $res$$.status(400).send({error:"Kh\u00f4ng th\u1ec3 t\u1ea1o thumbnail cho h\u00ecnh \u1ea3nh n\u00e0y. L\u1ed7i: "+($error$$.message||$error$$.error||$error$$)})}}fs.unlink($req$$.files.fileupload.path,$e$$=>{$e$$&&Logger.error($e$$)});let $path_avatar$$="/getfile/"+$newPath$$,$path_thumb$$="/getfile/"+$thumbPath$$;$folder$$==
|
|
24
|
+
"avatars"?($user$$.local.picture=$path_avatar$$,$user$$.picture=$user$$.local.picture,$user$$.save(function($error$$){if($error$$)return $res$$.status(400).send($error$$);$redisCache$$.set("user",$user$$.toObject(),function($e$$){$e$$?Logger.error($e$$):Logger.info("cache user infomation to redis");$res$$.send("\u0110\u00e3 c\u1eadp nh\u1eadt th\u00e0nh c\u00f4ng")});$req$$.query.json?$res$$.send({image:$path_avatar$$,thumb:$path_thumb$$,fileUrl:$path_avatar$$}):($res$$.writeHead(200,{"Content-Type":"text/html"}),
|
|
25
|
+
$res$$.end("<html><head><title>"+$path_avatar$$+"</title></head><body>success</body></html>"))})):$req$$.query.json?$res$$.send({image:$path_avatar$$,thumb:$path_thumb$$,fileUrl:$path_avatar$$}):($res$$.writeHead(200,{"Content-Type":"text/html"}),$res$$.end("<html><head><title>"+$path_avatar$$+"</title></head><body>success</body></html>"))})})}})}else $res$$.status(404).send({error:"Not found"})})});$sys_router$$.route("/uploadexcel").post(function($req$$,$res$$){let $access_token$$=$req$$.query.access_token;
|
|
26
|
+
if(!$req$$.files.fileupload)if($req$$.files.file)$req$$.files.fileupload=$req$$.files.file;else{$res$$.status(400).send({error:"File kh\u00f4ng t\u1ed3n t\u1ea1i"});return}var $path$$=require("path"),$ext$jscomp$1_ip$$=$path$$.extname($req$$.files.fileupload.path);if($ext$jscomp$1_ip$$)if($ext$jscomp$1_ip$$=$ext$jscomp$1_ip$$.toLowerCase(),$ext$jscomp$1_ip$$!=".xlsx"&&$ext$jscomp$1_ip$$!=".xml")$res$$.status(400).send("Ch\u1ec9 ch\u1ea5p nh\u1eadn c\u00e1c \u0111\u1ecbnh d\u1ea1ng file: xlsx,xml");
|
|
27
|
+
else{var $root_dir_templates$$=configs.paths.templates||$path$$.dirname($path$$.dirname(__dirname))+"/templates";$root_dir_templates$$+="/";$ext$jscomp$1_ip$$=$req$$.ip||$req$$.headers["x-forwarded-for"]||$req$$.connection.remoteAddress;global.getModel("user").findByToken($access_token$$,$ext$jscomp$1_ip$$,function($error$$,$user$$){if($error$$)return $res$$.status(400).send({error:$error$$.message||$error$$.error||$error$$});$user$$?fs.readFile($req$$.files.fileupload.path,function($err$$,$data$$){if($err$$)return $res$$($err$$);
|
|
28
|
+
fs.existsSync($root_dir_templates$$+"excels")||fs.mkdirSync($root_dir_templates$$+"excels");let $newPath$$="excels/"+$user$$._id.toString()+"_"+$path$$.basename($req$$.files.fileupload.path);fs.unlink($req$$.files.fileupload.path,$e$$=>{$e$$&&Logger.error($e$$)});Logger.info("uploading template file",$root_dir_templates$$+$newPath$$);fs.writeFile($root_dir_templates$$+$newPath$$,$data$$,function($error$$){if($error$$)return Logger.error("Error upload file",$error$$),$res$$.status(404).send($error$$);
|
|
29
|
+
$error$$="/templates/"+$newPath$$;Logger.info("Updated a file to ",$root_dir_templates$$+$newPath$$);if($req$$.query.json)return $res$$.send({fileUrl:$error$$});$res$$.writeHead(200,{"Content-Type":"text/html"});$res$$.end("<html><head><title>"+$error$$+"</title></head><body>success</body></html>")})}):$res$$.status(404).send({error:"Not found"})})}else $res$$.status(400).send("Ch\u1ec9 ch\u1ea5p nh\u1eadn c\u00e1c \u0111\u1ecbnh d\u1ea1ng file: xlsx,xml")});let $funcs_sys_inited$$={};configs.paths.modules&&
|
|
30
|
+
fs.existsSync(configs.paths.modules+"/systems")&&fs.readdirSync(configs.paths.modules+"/systems").forEach(function($file$$){$file$$.endsWith(".js")&&(require(configs.paths.modules+"/systems/"+$file$$)($sys_router$$),$funcs_sys_inited$$[$file$$]=$file$$)});fs.readdirSync(__dirname+"/modules/systems").filter($file$$=>!$funcs_sys_inited$$[$file$$]).forEach(function($file$$){$file$$.endsWith(".js")&&(require("./modules/systems/"+$file$$)($sys_router$$),$funcs_sys_inited$$[$file$$]=$file$$)});$authenticate_dynamic_list_limiter_limiter$$=
|
|
31
|
+
await listinfo.find({status:!0,create_model:!0}).lean();Logger.info("Creating dynamic APIs...",$authenticate_dynamic_list_limiter_limiter$$.length);$authenticate_dynamic_list_limiter_limiter$$.forEach($r$$=>{listinfo.createController(global.routerAPI,$r$$)});if($limiter$jscomp$2_limiter$$!==!0){const $bot_router$$=express.Router();configs.limitRequest.bot&&($limiter$jscomp$2_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.bot,"bot"),$router$$.use($limiter$jscomp$2_limiter$$));
|
|
32
|
+
$app$$.use("/bot",$bot_router$$);fs.existsSync(__dirname+"/modules/bot")&&(Logger.info("init bot..."),fs.readdirSync(__dirname+"/modules/bot").forEach(function($file$$){$file$$.endsWith(".js")&&require("./modules/bot/"+$file$$)($bot_router$$)}));const $public_router$$=express.Router();configs.limitRequest.public&&($limiter$jscomp$2_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.public,"public"),$router$$.use($limiter$jscomp$2_limiter$$));$public_router$$.use(function($req$$,
|
|
33
|
+
$res$$,$next$$){for(let $key$$ in $req$$.query)$req$$.query[$key$$]=="true"&&($req$$.query[$key$$]=!0),$req$$.query[$key$$]=="false"&&($req$$.query[$key$$]=!1);if($req$$.query.id_app){let $id_app$$=$req$$.query.id_app;appModel.findOne({_id:$id_app$$},function($error$$,$app$$){if($error$$)return $next$$($error$$);if($app$$)$req$$.user={current_id_app:$id_app$$,email:"public"},$req$$.query.id_app=$id_app$$,$next$$();else return $res$$.status(400).send("Kh\u00f4ng t\u1ed3n t\u1ea1i c\u00f4ng ty n\u00e0y")})}else $next$$()});
|
|
34
|
+
$app$$.use("/public",$public_router$$);const $funcs_public_inited$$={};configs.paths.modules&&fs.existsSync(configs.paths.modules+"/public")&&(Logger.info("init custom public..."),fs.readdirSync(configs.paths.modules+"/public").forEach(function($file$$){$file$$.endsWith(".js")&&(require(configs.paths.modules+"/public/"+$file$$)($public_router$$),$funcs_public_inited$$[$file$$]=$file$$)}));fs.existsSync(__dirname+"/modules/public")&&(Logger.info("init default public..."),fs.readdirSync(__dirname+"/modules/public").filter($file$$=>
|
|
35
|
+
!$funcs_public_inited$$[$file$$]).forEach(function($file$$){$file$$.endsWith(".js")&&(require("./modules/public/"+$file$$)($public_router$$),$funcs_public_inited$$[$file$$]=$file$$)}));configs.useFlow&&require("./flow/FlowEngine")($app$$);$createRateLimiterMiddleware_limiter_others$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.other||{},"other");$app$$.get("/downloads/temp/:fileName",$createRateLimiterMiddleware_limiter_others$$,async function($fileName_req$$,$res$$){$fileName_req$$=
|
|
36
|
+
$fileName_req$$.params.fileName;try{const $fileBuffer$$=await getTmpFile($fileName_req$$);if(!$fileBuffer$$)return Logger.error("[route][download temp file] Kh\u00f4ng t\u00ecm th\u1ea5y file",$fileName_req$$),$res$$.status(404).send('\n <div style="font-family: Arial; text-align: center; margin-top: 50px;">\n <h2 style="color: red;">\u0110\u01b0\u1eddng link \u0111\u00e3 h\u1ebft h\u1ea1n ho\u1eb7c kh\u00f4ng t\u1ed3n t\u1ea1i!</h2>\n <p>V\u00ec l\u00fd do b\u1ea3o m\u1eadt, link t\u1ea3i file ch\u1ec9 c\u00f3 hi\u1ec7u l\u1ef1c trong v\u00f2ng 1 ph\u00fat.</p>\n <p>Vui l\u00f2ng quay l\u1ea1i ph\u1ea7n m\u1ec1m v\u00e0 th\u1ef1c hi\u1ec7n xu\u1ea5t file l\u1ea7n n\u1eefa.</p>\n </div>\n ');
|
|
35
37
|
$fileName_req$$=$fileName_req$$.replace(/[\r\n]+/g,"").replace(/"/g,'\\"');const $asciiFileName$$=$fileName_req$$.replace(/[^\x20-\x7E]/g,"_"),$encodedFileName$$=encodeURIComponent($fileName_req$$);if($fileName_req$$.endsWith(".json"))return $res$$.setHeader("Content-Type","application/json; charset=utf-8"),$res$$.setHeader("Content-Disposition",`attachment; filename="${$asciiFileName$$}"; filename*=UTF-8''${$encodedFileName$$}`),$res$$.send($fileBuffer$$);$res$$.setHeader("Content-Disposition",`attachment; filename="${$fileName_req$$}"; filename*=UTF-8''${$encodedFileName$$}`);
|
|
36
38
|
$res$$.type($fileName_req$$);return $res$$.send($fileBuffer$$)}catch($e$$){Logger.error("[download tmp data]",$e$$,$fileName_req$$),$res$$.status(400).send($e$$.message)}});$app$$.get("/getfile/:folder/:filename",$createRateLimiterMiddleware_limiter_others$$,async function($orgin_file_size$jscomp$2_req$$,$res$$){let $root_dir$$=configs.paths.images||path.join(__dirname,"images"),$imgPath$$=path.join($root_dir$$,$orgin_file_size$jscomp$2_req$$.params.folder,$orgin_file_size$jscomp$2_req$$.params.filename);
|
|
37
39
|
if(fs.existsSync($imgPath$$)){let $size$$,$cache$$;if($orgin_file_size$jscomp$2_req$$.query.size||$orgin_file_size$jscomp$2_req$$.query.resize)switch(String($orgin_file_size$jscomp$2_req$$.query.size||$orgin_file_size$jscomp$2_req$$.query.resize).toUpperCase()){case "64":case "X":$size$$=64;$cache$$=!0;break;case "128":$size$$=128;$cache$$=!0;break;case "320":case "S":$size$$=320;$cache$$=!0;break;case "512":case "M":$size$$=512;$cache$$=!0;break;case "1024":case "L":$size$$=1024;$cache$$=!0;break;
|