-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
147 lines (136 loc) · 4.01 KB
/
index.js
File metadata and controls
147 lines (136 loc) · 4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
'use strict';
// [START imports]
var firebase = require('firebase-admin');
var schedule = require('node-schedule');
var Promise = require('promise');
var https = require('https');
// [END imports]
// [START definitions]
var {google} = require('googleapis');
var PROJECT_ID = 'somos-com-vc';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];
var serviceAccount = require('./service-account.json');
// [END definitions]
// [START initialize]
firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: 'https://somos-com-vc.firebaseio.com'
});
// [END initialize]
/**
* Keep server up listenning to missions path.
*/
function startListeners() {
firebase.database().ref('/missions').on('child_changed', function(snapshot) {
console.log('missão alterada');
});
startMissionExpirySchedule();
console.log('Mission observer started...');
}
/**
* Construct a JSON object that will be used to define the
* common parts of a notification message that will be sent
* to any app instance.
*/
function buildCommonMessage(token, title, body) {
return {
'message': {
'token': token,
'notification': {
'title': title,
'body': body
}
}
};
}
/*
* send firebase message to user.
*/
function sendFcmMessage(fcmMessage) {
getAccessToken().then(function(accessToken) {
var options = {
hostname: HOST,
path: PATH,
method: 'POST',
// [START use_access_token]
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'Application/json'
}
// [END use_access_token]
};
var request = https.request(options, function(resp) {
resp.setEncoding('utf8');
resp.on('data', function(data) {
console.log('Message sent to Firebase for delivery, response:');
console.log(data);
});
});
request.on('error', function(err) {
console.log('Unable to send message to Firebase');
console.log(err);
});
request.write(JSON.stringify(fcmMessage));
request.end();
});
}
/**
* Send a notification to followers 3 days before mission expire.
*/
function startMissionExpirySchedule() {
// Run this job every weekday at 5pm.
var rule = new schedule.RecurrenceRule();
rule.dayOfWeek = new schedule.Range(1, 5);
rule.hour = 17;
rule.minute = 0;
schedule.scheduleJob(rule, function () {
firebase.database().ref('/missions').once('value', function(snapshots) {
Object.keys(snapshots.val()).map((key) => {
const mission = snapshots.val()[key].content;
const missionKey = key;
const finishDate = new Date(mission.endDate).getTime();
const now = new Date().getTime();
const daysToFinish = now - (3*24*60*60*1000); //three days in milliseconds
if(mission.usersAccepted && finishDate > daysToFinish && finishDate > now) {
const userPromises = mission.usersAccepted.map((userKey) => {
return firebase.database().ref(`/users/${userKey.uid}/content/token`).once('value');
});
Promise.all(userPromises).then(results => {
results.map(u => {
var message = buildCommonMessage(u.val(), 'Lembrete: ' + mission.title, 'Sua missão está perto de encerrar!');
sendFcmMessage(message);
});
});
}
});
});
});
console.log('Mission expiry notifier started...');
}
/**
* Request access token to send message.
*/
function getAccessToken() {
return new Promise(function(resolve, reject) {
var key = require('./service-account.json');
var jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
SCOPES,
null
);
jwtClient.authorize(function(err, tokens) {
if (err) {
reject(err);
return;
}
resolve(tokens.access_token);
});
});
}
// Start the server.
startListeners();