flexbiz-server
Version:
Flexible Server
10 lines (9 loc) • 4.06 kB
JavaScript
'use strict';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({status:1}),fbconversationSchema.index({"with.id":1}),fbconversationSchema.index({updated_time:-1}),fbconversationSchema.index({user_created:1,visible_to:1,visible_to_users:1}));const model=mongoose.models.fbconversation||mongoose.model("fbconversation",fbconversationSchema);
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_response$$=>
{$convs_response$$=($convs_response$$.data||[]).data||[];if(0<$convs_response$$.length){$conv$$=$convs_response$$[0];$conv$$.id_app=$id_app$$;$conv$$.page_id=$page_id$$;try{await model.create($conv$$),console.log("created conversation",$conv$$)}catch($e$$){console.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$$)=>{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$$;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(($rs$$,$rj$$)=>{axios.request($config$$).then(async $c_response$$=>
{$c_response$$=$c_response$$.data;$c_response$$.page_id=$page_id$$;$c_response$$.id_app=$id_app$$;$c_response$$.conv_id=$conv_id$$;try{await global.getModel("fbmessage").create($c_response$$),$c_response$$.from.id!==$page_id$$&&await model.updateOne({id_app:$id_app$$,page_id:$page_id$$,id:$conv_id$$,with:{$exists:!1}},{with:$c_response$$.from})}catch($e$$){console.error("can't sync fb message",$e$$)}$rs$$(null,$c_response$$)}).catch($e$$=>{$rj$$($e$$)})})};
model.sync=async($id_app$$,$page_id$$,$conv_id$$)=>{const $pageInfo$$=await global.getModel("fbpage").findOne({id_app:$id_app$$,page_id:$page_id$$});if(!$pageInfo$$)throw"Kh\u00f4ng t\u00ecm th\u1ea5y th\u00f4ng tin trang n\u00e0y";console.log("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=${$pageInfo$$.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$$,$pageInfo$$.page_access_token,$m$$.id).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("end"!==$error$$)return $reject$$($error$$);$resole$$($rs$$)})})};module.exports=model;