UNPKG

flexbiz-server

Version:

Flexible Server

26 lines (25 loc) 12.5 kB
'use strict';const model=global.getModel("file"),app=global.getModel("app"),path=require("path"),fs=require("fs"),controller=require("../../controllers/controller"),ffmpeg=require("fluent-ffmpeg"),ffmpegInstaller=require("@ffmpeg-installer/ffmpeg");ffmpeg.setFfmpegPath(ffmpegInstaller.path); const sharp=require("sharp"),watermark=require("dynamic-watermark"),permission=require("../../libs/permission"),convertVideo=async($fileInput$$,$fileOutput$$)=>new Promise(($resolve$$,$reject$$)=>{ffmpeg($fileInput$$,{timeout:432E3}).addOptions("-profile:v baseline;-level 3.0;-start_number 0;-hls_time 10;-hls_list_size 0;-f hls".split(";")).output($fileOutput$$).on("error",function($err$$){$reject$$($err$$.message)}).on("end",()=>{$resolve$$($fileOutput$$)}).run()}),setWaterMark4Image=async($app_info$$, $file_name$$,$extension_root$$,$recache$$)=>{let $file_name_watermark$$=`${$file_name$$}.watermark.${$extension_root$$}.webp`;if(!$app_info$$.logo_watermark)return $file_name$$;if(!$recache$$&&fs.existsSync($file_name_watermark$$))return $file_name_watermark$$;$extension_root$$=configs.paths.images;$extension_root$$||($extension_root$$=__dirname,$extension_root$$=path.dirname($extension_root$$),$extension_root$$=path.dirname($extension_root$$),$extension_root$$=path.join($extension_root$$,"images")); let $file_logo$$=path.join($extension_root$$,$app_info$$.logo_watermark.split("getfile/")[1]);return fs.existsSync($file_logo$$)?new Promise($resolve$$=>{sharp($file_name$$,{failOnError:!1}).metadata().then($value$$=>{const $watermark_size$$=10*$value$$.width/100;watermark.embed({type:"image",source:$file_name$$,logo:$file_logo$$,destination:$file_name_watermark$$,position:{logoX:$value$$.width-$watermark_size$$-10,logoY:10,logoHeight:$watermark_size$$,logoWidth:$watermark_size$$}},function($status$$){1=== $status$$.status?$resolve$$($file_name_watermark$$):(console.log("status set watermark",$status$$),$resolve$$($file_name$$))})}).catch($error$$=>{console.log($error$$);return $resolve$$($file_name$$)})}):(console.log("file logo watermark is not exists",$file_logo$$),$file_name$$)},configResizeImage=async($_size_file_name_resize$$,$file_name$$,$extension$$,$recache$$)=>{let $size$$,$cache$$;if($_size_file_name_resize$$)switch($_size_file_name_resize$$.toString().toUpperCase()){case "64":case "X":$size$$= 64;$cache$$=!0;break;case "256":$size$$=256;$cache$$=!0;break;case "S":case "320":$size$$=320;$cache$$=!0;break;case "512":case "M":$size$$=512;$cache$$=!0;break;case "1024":case "L":$size$$=1024;$cache$$=!0;break;case "1080":case "XL":case "FULLHD":$size$$=1080;$cache$$=!0;break;case "1440":case "2K":$size$$=1440;$cache$$=!0;break;default:try{$size$$=Number($_size_file_name_resize$$);if(isNaN($size$$)||!$size$$)$size$$=1080;$cache$$=!0}catch($e$$){console.log("size param must be X or S or M or L or 2K or FULLHD or a number")}}return $size$$? ($_size_file_name_resize$$=`${$file_name$$}.${$size$$}.${$extension$$}.webp`,!$recache$$&&fs.existsSync($_size_file_name_resize$$)?{file_name_resize:$_size_file_name_resize$$,exist:!0}:{cache:$cache$$,size:$size$$,file_name_resize:$_size_file_name_resize$$}):{file_name_resize:$file_name$$}}; module.exports=function($router$$){const $contr$$=new controller($router$$,model,"file",{sort:{date_created:-1},onView:($user$$,$items$$,$next$$)=>{$items$$.forEach($item$$=>{$item$$.file&&(delete $item$$.file.encoding,delete $item$$.file.mimetype,delete $item$$.file.path,$item$$.id_app&&configs.api_url&&($item$$.download_link=`${configs.api_url||""}/api/${$item$$.id_app}/file/download/${$item$$._id.toString()}`))});$next$$(null,$items$$)}});$contr$$.creating=async function($file_name$jscomp$2_input_user$$, $obj$$,$fn$$){if($obj$$.file&&$obj$$.read_image&&$obj$$.file.name&&$obj$$.file.extension&&!$obj$$.file.url){$file_name$jscomp$2_input_user$$=$obj$$.file.name;var $bk_document_extension$jscomp$2_root$$=$obj$$.file.extension.toLowerCase();if(0<=["png","jpg","jpeg"].indexOf($bk_document_extension$jscomp$2_root$$)&&($bk_document_extension$jscomp$2_root$$=configs.paths.uploads,$bk_document_extension$jscomp$2_root$$||($bk_document_extension$jscomp$2_root$$=__dirname,$bk_document_extension$jscomp$2_root$$= path.dirname($bk_document_extension$jscomp$2_root$$),$bk_document_extension$jscomp$2_root$$=path.dirname($bk_document_extension$jscomp$2_root$$),$bk_document_extension$jscomp$2_root$$=path.join($bk_document_extension$jscomp$2_root$$,"uploads")),$file_name$jscomp$2_input_user$$=path.join($bk_document_extension$jscomp$2_root$$,$file_name$jscomp$2_input_user$$),fs.existsSync($file_name$jscomp$2_input_user$$)))try{$bk_document_extension$jscomp$2_root$$=document;document=void 0;var $folder_tesseractWorker$$= await require("tesseract.js").createWorker("vie+eng");document=$bk_document_extension$jscomp$2_root$$;const $ret$$=await $folder_tesseractWorker$$.recognize($file_name$jscomp$2_input_user$$);$obj$$.text_from_image=$ret$$.data.text;await $folder_tesseractWorker$$.terminate()}catch($error$$){console.error("read text from image",$error$$.message,$file_name$jscomp$2_input_user$$)}}$obj$$.id_folder&&global.mongoose.Types.ObjectId.isValid($obj$$.id_folder)&&($folder_tesseractWorker$$=await global.getModel("folder").findOne({_id:$obj$$.id_folder}))&& ($obj$$.update_right=$folder_tesseractWorker$$.update_right,$obj$$.delete_right=$folder_tesseractWorker$$.delete_right,$obj$$.visible_to=$folder_tesseractWorker$$.visible_to,$obj$$.visible_to_users=$folder_tesseractWorker$$.visible_to_users,$obj$$.visible_to_usergroups=$folder_tesseractWorker$$.visible_to_usergroups);$fn$$(null,$obj$$)};$contr$$.created=function($file_name$jscomp$3_user$$,$obj$$,$fn$$){if($obj$$.file&&$obj$$.file.name&&$obj$$.file.extension){$file_name$jscomp$3_user$$=$obj$$.file.name; var $extension$jscomp$3_input$jscomp$1_root$$=$obj$$.file.extension.toLowerCase();if(0<=["mp4","mov","avi"].indexOf($extension$jscomp$3_input$jscomp$1_root$$)){$extension$jscomp$3_input$jscomp$1_root$$=configs.paths.uploads;$extension$jscomp$3_input$jscomp$1_root$$||($extension$jscomp$3_input$jscomp$1_root$$=__dirname,$extension$jscomp$3_input$jscomp$1_root$$=path.dirname($extension$jscomp$3_input$jscomp$1_root$$),$extension$jscomp$3_input$jscomp$1_root$$=path.dirname($extension$jscomp$3_input$jscomp$1_root$$), $extension$jscomp$3_input$jscomp$1_root$$=path.join($extension$jscomp$3_input$jscomp$1_root$$,"uploads"));$extension$jscomp$3_input$jscomp$1_root$$=path.join($extension$jscomp$3_input$jscomp$1_root$$,$file_name$jscomp$3_user$$);let $output$$=configs.paths.videos;$output$$||($output$$=__dirname,$output$$=path.dirname($output$$),$output$$=path.dirname($output$$),$output$$=path.join($output$$,"videos"));fs.existsSync($output$$)||fs.mkdirSync($output$$);$output$$=path.join($output$$,$obj$$._id.toString()); fs.existsSync($output$$)||fs.mkdirSync($output$$);$output$$=path.join($output$$,$file_name$jscomp$3_user$$);convertVideo($extension$jscomp$3_input$jscomp$1_root$$,$output$$).catch($e$$=>{console.error("Can't convert video. Error:",$e$$)})}}else console.log("file not exists",$obj$$);$fn$$(null,$obj$$)};$contr$$.route(function($router$$){$router$$.route("/:id_app/file/download/:id").get(function($req$$,$res$$){let $id$$=$req$$.params.id.split("-")[0];if(!global.mongoose.Types.ObjectId.isValid($id$$))return $res$$.status(400).send({error:"File ID kh\u00f4ng h\u1ee3p l\u1ec7"}); let $size$$=$req$$.query.size||$req$$.query.resize||"FULLHD";app.findOne({_id:$req$$.user.current_id_app}).lean().exec(function($e$jscomp$0$$,$app_info$$){if($e$jscomp$0$$||!$app_info$$)return $res$$.status(400).send("Kh\u00f4ng th\u1ec3 t\u1ea3i file n\u00e0y");model.findOne({_id:$id$$}).lean().exec(async($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$rs$$&&$rs$$.file?permission.hasRight($rs$$.id_app,$req$$.user.email,$contr$$.module,"view",async function($error$jscomp$3_extension$$, $_new_file_file_name$jscomp$4_permission$$){if(!$_new_file_file_name$jscomp$4_permission$$)return $res$$.status(403).send({error:$error$jscomp$3_extension$$||"B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp file n\u00e0y"});if($rs$$.file.url)return $res$$.redirect($rs$$.file.url);$_new_file_file_name$jscomp$4_permission$$=$rs$$.file.name;$error$jscomp$3_extension$$=$rs$$.file.extension;let $root$$=configs.paths.uploads;$root$$||($root$$=__dirname,$root$$=path.dirname($root$$),$root$$=path.dirname($root$$), $root$$=path.join($root$$,"uploads"));$_new_file_file_name$jscomp$4_permission$$=path.join($root$$,$_new_file_file_name$jscomp$4_permission$$);if(fs.existsSync($_new_file_file_name$jscomp$4_permission$$))if(0<="png jpg jpeg webp tiff heif avif gif jp2 jxl".split(" ").indexOf($error$jscomp$3_extension$$)){$_new_file_file_name$jscomp$4_permission$$=await setWaterMark4Image($app_info$$,$_new_file_file_name$jscomp$4_permission$$,$error$jscomp$3_extension$$,$req$$.query.recache);let $_resize_conf$$=await configResizeImage($size$$, $_new_file_file_name$jscomp$4_permission$$,$error$jscomp$3_extension$$,$req$$.query.recache);if($_resize_conf$$.exist)return sharp($_resize_conf$$.file_name_resize,{failOnError:!1}).pipe($res$$);let $_gm$$=sharp($_new_file_file_name$jscomp$4_permission$$,{failOnError:!1});($error$jscomp$3_extension$$=await $_gm$$.metadata())&&$_resize_conf$$.size&&$_resize_conf$$.size<$error$jscomp$3_extension$$.width&&$_resize_conf$$.size<$error$jscomp$3_extension$$.height&&($_gm$$=$_gm$$.resize({width:$_resize_conf$$.size}).rotate()); $error$jscomp$3_extension$$&&"webp"!=$error$jscomp$3_extension$$.format&&(console.log("convert ",$error$jscomp$3_extension$$.format,"to","webp","..."),$_gm$$=$_gm$$.webp({lossless:!1,quality:50,nearLossless:!0}));$_resize_conf$$.cache&&setImmediate(()=>{$_gm$$.toFile($_resize_conf$$.file_name_resize,$error$$=>{if($error$$)return console.error("save resize image:",$error$$.message);console.log("cache file",$_resize_conf$$.file_name_resize)})});$_gm$$.pipe($res$$)}else $res$$.download($_new_file_file_name$jscomp$4_permission$$, $rs$$.file.originalname);else $res$$.status(400).send({error:"File n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i"})},{data:$rs$$,obj:$rs$$,notNeedRight:!$rs$$.id_link&&!$rs$$.id_folder||$rs$$.shared}):$res$$.status(400).send({error:"Kh\u00f4ng t\u00ecm th\u1ea5y file n\u00e0y"})})})});$router$$.route("/:id_app/file/stream/:id/:file").get(function($req$$,$res$$){let $id$$=$req$$.params.id.split("-")[0];if(!global.mongoose.Types.ObjectId.isValid($id$$))return $res$$.status(400).send({error:"File ID kh\u00f4ng h\u1ee3p l\u1ec7"}); app.findOne({_id:$req$$.user.current_id_app}).lean().exec(function($e$jscomp$0$$,$app_info$$){if($e$jscomp$0$$||!$app_info$$)return $res$$.status(400).send("Kh\u00f4ng th\u1ec3 stream file n\u00e0y");model.findOne({_id:$id$$}).lean().exec(async($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$rs$$&&$rs$$.file?permission.hasRight($rs$$.id_app,$req$$.user.email,$contr$$.module,"view",async function($error$jscomp$5_file_name$jscomp$5_output$$,$file_permission$jscomp$2_root$$){if(!$file_permission$jscomp$2_root$$)return $res$$.status(403).send({error:$error$jscomp$5_file_name$jscomp$5_output$$|| "B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp file n\u00e0y"});if($rs$$.file.url)return $res$$.redirect($rs$$.file.url);$error$jscomp$5_file_name$jscomp$5_output$$=$rs$$.file.name;$file_permission$jscomp$2_root$$=$req$$.params.file;".ts"==$file_permission$jscomp$2_root$$.substr(-3)&&($error$jscomp$5_file_name$jscomp$5_output$$=$file_permission$jscomp$2_root$$);$file_permission$jscomp$2_root$$=configs.paths.videos;$file_permission$jscomp$2_root$$||($file_permission$jscomp$2_root$$=__dirname, $file_permission$jscomp$2_root$$=path.dirname($file_permission$jscomp$2_root$$),$file_permission$jscomp$2_root$$=path.dirname($file_permission$jscomp$2_root$$),$file_permission$jscomp$2_root$$=path.join($file_permission$jscomp$2_root$$,"videos"));$error$jscomp$5_file_name$jscomp$5_output$$=path.join($file_permission$jscomp$2_root$$,$rs$$._id.toString(),$error$jscomp$5_file_name$jscomp$5_output$$);if(fs.existsSync($error$jscomp$5_file_name$jscomp$5_output$$)){const $readStream$$=fs.createReadStream($error$jscomp$5_file_name$jscomp$5_output$$); $readStream$$.on("open",function(){$readStream$$.pipe($res$$)});$readStream$$.on("error",function($err$$){$res$$.end($err$$)})}else $res$$.status(400).send("File n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i")},{data:$rs$$,obj:$rs$$,notNeedRight:!$rs$$.id_link&&!$rs$$.id_folder||$rs$$.shared}):$res$$.status(400).send("Kh\u00f4ng t\u00ecm th\u1ea5y file n\u00e0y")})})})})};