UNPKG

flexbiz-server

Version:

Flexible Server

16 lines (15 loc) 6.7 kB
const axios=require("axios"),async=require("async"),fbconversationSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},page_id:{type:String,required:!0,maxlength:1024},id:String,link:String,updated_time:Date,with:Schema.Types.Mixed,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}}); (global.configs||{}).createIndexes&&(fbconversationSchema.index({id_app:1,page_id:1,id:1},{unique:!0}),fbconversationSchema.index({id_app:1,page_id:1,updated_time:-1}),fbconversationSchema.index({id_app:1,page_id:1,"with.id":1}),fbconversationSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1,updated_time:-1}),fbconversationSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1,page_id:1,updated_time:-1}),fbconversationSchema.index({id_app:1,user_created:1,visible_to:1, visible_to_users:1,page_id:1,"with.id":1,updated_time:-1}),fbconversationSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1,page_id:1,id:1,updated_time:-1}));const model=mongoose.models.fbconversation||mongoose.model("fbconversation",fbconversationSchema); model.getConversations=async($id_app$$,$page_id$$,$page_access_token$$,$user_id$$)=>new Promise(($resolve$$,$reject$$)=>{let $url$$=`https://graph.facebook.com/${$page_id$$}/conversations/?platform=messenger&access_token=${$page_access_token$$}`;$user_id$$&&($url$$=`${$url$$}&user_id=${$user_id$$}`);let $rs$$=[],$next_page$$;async.forever($next$$=>{setImmediate(()=>{$next_page$$&&Logger.info("sync next page",$next_page$$);axios.request({method:"get",maxBodyLength:Infinity,url:$next_page$$?$next_page$$: $url$$,headers:{}}).then($response$$=>{const $convs$$=($response$$.data||{}).data||[];$next_page$$=(($response$$.data||{}).paging||{}).next;$rs$$=[...$rs$$,...$convs$$];$next$$($next_page$$?void 0:"end")}).catch($error$$=>{$next$$($error$$)})})},async $error$$=>{if($error$$!="end")return $reject$$({error:$error$$});try{for(let $c$$ of $rs$$){await global.getModel("fbconversation").findOne({id_app:$id_app$$,page_id:$page_id$$,id:$c$$.id},{id:1})||($c$$.page_id=$page_id$$,$c$$.id_app=$id_app$$,await global.getModel("fbconversation").create($c$$)); $c$$.messages=await global.getModel("fbconversation").sync($id_app$$,$page_id$$,$c$$.id);if($c$$.messages.length>0){let $m$$=$c$$.messages[0],$customer$$;if($customer$$=$m$$.from?.id!==$page_id$$?$m$$.from:$m$$.to?.data?.[0])$c$$.customer_info=$customer$$,$c$$.customer_info.fb_id=$customer$$.id,($c$$.customer_info.email||"").endsWith("@facebook.com")&&delete $c$$.customer_info.email;$c$$.messages=($c$$.messages||[]).map($m$$=>({[$m$$.from?.id===$page_id$$?"company":"customer"]:$m$$.message}))}$c$$.conversation_id= $c$$.id;$c$$.page_id=$page_id$$;delete $c$$.id;delete $c$$.link}}catch($e$$){return $reject$$($e$$)}$resolve$$($rs$$)})}); model.getConvByUserId=async($id_app$$,$page_id$$,$page_access_token$$,$user_id$$)=>{let $conv$$=await global.getModel("fbconversation").findOne({id_app:$id_app$$,"with.id":$user_id$$}).lean();if($conv$$)return $conv$$;let $config$$={method:"get",maxBodyLength:Infinity,url:`https://graph.facebook.com/${$page_id$$}/conversations/?platform=messenger&access_token=${$page_access_token$$}&user_id=${$user_id$$}`,headers:{}};return new Promise(($rs$$,$rj$$)=>{axios.request($config$$).then(async $convs$jscomp$1_response$$=> {$convs$jscomp$1_response$$=($convs$jscomp$1_response$$.data||[]).data||[];if($convs$jscomp$1_response$$.length>0){$conv$$=$convs$jscomp$1_response$$[0];$conv$$.id_app=$id_app$$;$conv$$.page_id=$page_id$$;try{await model.create($conv$$),Logger.info("created conversation",$conv$$)}catch($e$$){Logger.error("Kh\u00f4ng th\u1ec3 l\u01b0u facebook conversation",$e$$,$conv$$)}return $rs$$($conv$$)}$rj$$("Kh\u00f4ng tim th\u1ea5y cu\u1ed9c h\u1ed9i tho\u1ea1i v\u1edbi user n\u00e0y")}).catch($e$$=>{$rj$$($e$$)})})}; model.getMessage=async($id_app$$,$page_id$$,$conv_id$$,$page_access_token$$,$id$$,$conv$$)=>{let $ex$$=await global.getModel("fbmessage").findOne({id_app:$id_app$$,page_id:$page_id$$,conv_id:$conv_id$$,id:$id$$}).lean();if($ex$$)return $ex$$;$conv$$||=await model.findOne({id_app:$id_app$$,page_id:$page_id$$,id:$conv_id$$});let $config$$={method:"get",maxBodyLength:Infinity,url:`https://graph.facebook.com/${$id$$}/?&access_token=${$page_access_token$$}&fields=id,created_time,from,to,message,attachments`, headers:{}};return new Promise(($resolve$$,$reject$$)=>{axios.request($config$$).then(async $c$jscomp$1_response$$=>{$c$jscomp$1_response$$=$c$jscomp$1_response$$.data;$c$jscomp$1_response$$.page_id=$page_id$$;$c$jscomp$1_response$$.id_app=$id_app$$;$c$jscomp$1_response$$.conv_id=$conv_id$$;try{if(await global.getModel("fbmessage").create($c$jscomp$1_response$$),$conv$$&&!$conv$$.with){let $chat_with$$;if($chat_with$$=$c$jscomp$1_response$$.from?.id!==$page_id$$?$c$jscomp$1_response$$.from:$c$jscomp$1_response$$.to.data[0])$conv$$.with= $chat_with$$,await $conv$$.save()}}catch($e$$){Logger.error("can't sync fb message",$e$$)}$reject$$(null,$c$jscomp$1_response$$)}).catch($e$$=>{$resolve$$($e$$)})})}; model.sync=async($id_app$$,$page_id$$,$conv_id$$,$page_access_token$$)=>{if(!$page_access_token$$){const $pageInfo$$=await global.getModel("fbpage").findOne({id_app:$id_app$$,page_id:$page_id$$}).lean();if(!$pageInfo$$)throw"Kh\u00f4ng t\u00ecm th\u1ea5y th\u00f4ng tin trang n\u00e0y";$page_access_token$$=$pageInfo$$.page_access_token}const $conv$$=await model.findOne({id_app:$id_app$$,page_id:$page_id$$,id:$conv_id$$});Logger.info("sync conversation",{page_id:$page_id$$,conv_id:$conv_id$$});return new Promise(($resole$$, $reject$$)=>{let $rs$$=[],$next_page$$;async.forever($next$$=>{setImmediate(()=>{axios.request({method:"get",maxBodyLength:Infinity,url:$next_page$$?$next_page$$:`https://graph.facebook.com/${$conv_id$$}/?&access_token=${$page_access_token$$}&fields=messages`,headers:{}}).then(async $response$$=>{const $ms$$=(($response$$.data||{}).messages||{}).data||[];$next_page$$=((($response$$.data||{}).messages||{}).paging||{}).next;async.map($ms$$,($m$$,$cb$$)=>{setImmediate(()=>{model.getMessage($id_app$$, $page_id$$,$conv_id$$,$page_access_token$$,$m$$.id,$conv$$).then(async $c$$=>{$cb$$(null,$c$$)}).catch($e$$=>{$cb$$($e$$)})})},($e$$,$_ms$$)=>{if($e$$)return $next$$($e$$);$rs$$=[...$rs$$,...$_ms$$];$next$$($next_page$$?void 0:"end")})}).catch($error$$=>{$next$$($error$$)})})},$error$$=>{if($error$$!=="end")return $reject$$($error$$);$resole$$($rs$$.sort(($a$$,$b$$)=>(new Date($a$$.created_time)).getTime()-(new Date($b$$.created_time)).getTime()))})})};module.exports=model;