forked from adorsys/notification-service
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
161 lines (149 loc) · 4.25 KB
/
server.js
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var bodyParser = require('body-parser');
app.set('port', (process.env.PORT || 3000));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
/**
* Configuration from package.json
*/
var pjson = require('./package.json');
var pushService = (function() {
var connections = {};
return {
/**
* Register user in connections. This method must be executed as first in whole registration process.
* @param userId id of user.
* @param connectionId id of connection.
*/
registerUser: function(userId, connectionId) {
if (connections[userId] === undefined) {
connections[userId] = {};
}
connections[userId][connectionId] = null;
console.log('Registered connection ' + connectionId.substring(0, 4) + '*** for user ' + userId);
},
/**
* Register socket to communication. Must be executed after registerUser.
* Modify socket object and set field userId and connectionId.
* @param userId id of user.
* @param connectionId id of connection.
* @param socket socket.
* @returns {boolean} if socket was registered or not, if false then you have to do everything again.
*/
registerSocket: function(userId, connectionId, socket) {
if (connections[userId] != null && connections[userId][connectionId] == null) {
socket.userId = userId;
socket.connectionId = connectionId;
connections[userId][connectionId] = socket;
console.log('Registered socket for connection ' + connectionId.substring(0, 4) + '*** and user ' + userId);
return true;
} else {
console.log('Not found empty conn for connection ' + connectionId.substring(0, 4) + '*** and user ' + userId);
return false;
}
},
/**
* Remove connection.
* @param socket socket to remove.
*/
removeConnection: function(socket) {
var userId = socket.userId;
var connectionId = socket.connectionId;
if (userId && connectionId && connections[userId] && connections[userId][connectionId]) {
console.log('Removed socket for user ' + userId + ' and connection: ' + connectionId.substring(0, 4) + '***');
delete connections[socket.connectionId];
}
},
/**
* Send notification to user.
* @param userId id of user.
* @param message message.
*/
pushMessage: function(userId, message) {
var userConnections = connections[userId];
if (userConnections) {
for (var connectionId in userConnections) {
if (userConnections.hasOwnProperty(connectionId)) {
var socket = userConnections[connectionId];
if (socket != null) {
socket.emit('message', message);
}
}
}
}
}
}
}());
/**
* Handle connection to socket.io.
*/
io.on('connection', function(socket) {
/**
* On registered socket from client.
*/
socket.on('register', function(userId, connectionId) {
pushService.registerSocket(userId, connectionId, socket);
});
/**
* On disconnected socket.
*/
socket.on('disconnect', function() {
pushService.removeConnection(socket);
});
});
/**
* Api to register user.
*/
app.put('/api/:userId/register', function(req, res) {
if (req.header('X-AUTH-TOKEN') != process.env['AUTH_TOKEN']) {
res.status(401).send();
} else {
var userId = req.params['userId'];
var connectionId = req.query['connectionId'];
if (userId && connectionId) {
pushService.registerUser(userId, connectionId);
res.send();
} else {
res.status(400).send('Bad Request');
}
}
});
/**
* Api to send message to user.
*/
app.post('/api/:userId/push', function(req, res) {
if (req.header('X-AUTH-TOKEN') != process.env['AUTH_TOKEN']) {
res.status(401).send();
} else {
var userId = req.params['userId'];
if (userId && req.body.message) {
pushService.pushMessage(userId, req.body.message);
res.send();
}
else {
res.status(400).send('Bad Request');
}
}
});
/**
* Ping endpoint.
*/
app.get('/api/status/ping', function(req, res) {
res.send('pong')
});
/**
* Info endpoint.
*/
app.get('/api/status/info', function(req, res) {
res.setHeader('Content-Type', 'application/json');
var info = {
'name': pjson.name,
'version': pjson.version
};
res.send(info)
});
http.listen(app.get('port'), function() {
console.log('Node app is running on port', app.get('port'));
});