Advertisement
sombriks

sample push notification on server side

Mar 5th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var request = require("request");
  2. var express = require('express');
  3. var apn = require('apn');
  4. var gcm = require('node-gcm');
  5. var router = express.Router();
  6. // rotas da tabela de estado
  7. module.exports = function(knex) {
  8.  
  9.   // como registrado em https://console.developers.google.com/project/PROJETO NO CONSOLE DO GOOGLE
  10.   var apikeyandroid = "API KEY DO PROJETO PARA ANDROID";
  11.   var apikeyios = "API KEY DO PROJETO PARA IOS";
  12.  
  13.   // guardar os tokens de aparelhos que aqui chegam
  14.   router.post("/regtoken",function(req,res){
  15.     var data = req.body;
  16.     // console.log(data);
  17.     var d = data.registrationId;
  18.     var p = data.platform;
  19.     var i = data.usuariologado.idcondomino;
  20.     knex("device").select().where({deviceregkey:d}).then(function(ret){
  21.       if(!ret.length){
  22.         knex("device").insert({
  23.           deviceregkey:d,
  24.           platform:p,
  25.           idcondomino:i
  26.         }).then(function(ret2){
  27.           res.send("ok");
  28.         });
  29.       }else{
  30.         res.send("salvo");
  31.       }
  32.     });
  33.   });
  34.  
  35.   router.post("/novo",function(req,res){
  36.     var alerta = req.body;
  37.     // console.log(alerta);
  38.     var msg = alerta.msgalerta;
  39.     if(!alerta.tipoalerta){
  40.       res.status(500).send({error:"Informe o tipo de alerta"});
  41.       console.log("ERRO: Informe o tipo de alerta");
  42.       console.log(alerta);
  43.     }else{
  44.       knex("alerta").insert({
  45.         idtipoalerta:alerta.tipoalerta.idtipoalerta,
  46.         idcomunidade:alerta.idcomunidade,
  47.         alertageral:alerta.alertageral,
  48.         msgalerta:alerta.msgalerta,
  49.       },"idalerta").then(function(ret){
  50.         alerta.idalerta=ret[0];
  51.         if(!alerta.alertageral){
  52.           var params = alerta.idcondominos;
  53.           console.log("recebidos "+params.length+" ids de moradores");
  54.           var qs = alerta.idcondominos.map(function(e){ return "?";});
  55.           var superq = "idcondomino in ("+qs.join(",")+")";
  56.           var ins = alerta.idcondominos.map(function(e){
  57.             return {
  58.               idcondomino:e,
  59.               idalerta:alerta.idalerta,
  60.             };
  61.           });
  62.           knex("alerta_condomino").insert(ins).then(function(ret){
  63.             console.log("done");
  64.           });
  65.         }else{
  66.           var superq = "idcondomino in (select idcondomino from comunidade_condomino where idcomunidade = ?)";
  67.           var params = [alerta.idcomunidade];
  68.         }
  69.         knex("device").select().whereRaw(superq,params).then(function(ret){
  70.           var i = ret.length;
  71.           console.log("broadcast para "+i+" condôminos");
  72.           while(i-->0){
  73.             var dvc = ret[i];
  74.             console.log(dvc);
  75.             // envio pra android
  76.             if(dvc.platform=="android"){
  77.               // https://github.com/ToothlessGear/node-gcm
  78.               var message = new gcm.Message({
  79.                 notification:{
  80.                   title:"\u2709 ambbi - "+msg,
  81.                   body:msg,
  82.                   icon:"logo"
  83.                 }
  84.               });
  85.               var sender = new gcm.Sender(apikeyandroid);
  86.               sender.send(message,{
  87.                 registrationIds:[dvc.deviceregkey]
  88.               },function(err,result){
  89.                 if(err)
  90.                   console.error(err);
  91.                 else
  92.                   console.log(result);
  93.               });
  94.               console.log("gcm ok");
  95.             // envio pra android
  96.             }else if(dvc.platform=="ios"){
  97.               // XXX essa guerra vai voltar quando o app subir pra produção
  98.               // var prod = typeof process.env.OPENSHIFT_CLOUD_DOMAIN != "undefined";
  99.               var prod = false;
  100.               var options = {
  101.                 cert:prod?"cert_prod.pem":"cert_dev.pem",
  102.                 key:prod?"key_prod.pem":"key_dev.pem",
  103.                 passphrase:"SENHA DO CERTIFICADO",
  104.                 production:prod
  105.               };
  106.               console.log("production: "+prod+" cert: "+options.cert+" key: "+options.key);
  107.               var apnConnection = new apn.Connection(options);
  108.               var myDevice = new apn.Device(dvc.deviceregkey);
  109.               var note = new apn.Notification();
  110.               note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
  111.               note.badge = 3;
  112.               note.sound = "ping.aiff";
  113.               note.alert = "\u2709 ambbi - "+msg;
  114.               note.payload = {'message': msg};
  115.               apnConnection.pushNotification(note, myDevice);
  116.               console.log("apn ok");
  117.             }
  118.           }
  119.           res.json({status:"sent"});
  120.         });
  121.       });
  122.     }
  123.   });
  124.  
  125.   // listar os alertas que já foram passados
  126.   router.get("/ultimos",function(req,res){
  127.     var idcondomino = req.query.idcondomino;
  128.     knex.select('*').from("alerta_condomino").joinRaw("natural join alerta")//
  129.     .where('idcondomino', idcondomino)//
  130.     .orderBy("dtcadalerta","desc")//
  131.     .limit(10)//
  132.     .then(function(ret){
  133.       res.json(ret);
  134.     });
  135.   });
  136.   router.get("/gerais",function(req,res){
  137.     var idcomunidade = req.query.idcomunidade;
  138.     knex.select('*').from("alerta")//
  139.     .where({
  140.       idcomunidade:req.query.idcomunidade,
  141.       alertageral:true
  142.     })//
  143.     .orderBy("dtcadalerta","desc")//
  144.     .limit(10)//
  145.     .then(function(ret){
  146.       res.json(ret);
  147.     });
  148.   });
  149.  
  150.   // listar os tipos de alerta
  151.   router.get("/tipos",function(req,res){
  152.     knex("tipoalerta").select().then(function(ret){
  153.       res.json(ret);
  154.     });
  155.   });
  156.  
  157.   return router;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement