-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconversations.js
More file actions
122 lines (115 loc) · 3.49 KB
/
Copy pathconversations.js
File metadata and controls
122 lines (115 loc) · 3.49 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
var db = require('./db.js');
var tokens = require('./session.js');
var ObjectID = require('mongodb').ObjectID;
var wss = require('./wss.js');
var users, conversations;
db.event.on('load', function(){
users = db.users;
conversations = db.conversations;
});
function Conversation(users){
this.users = users;
}
function Message(sender, text){
this.sender = sender;
this.text = text;
this.time = new Date();
}
function isParticipant(user, id){
for(var i = 0; i < user.contacts.length; ++i)
if(user.contacts[i].convID == id) return true;
return user.conversations.indexOf(id) != -1;
}
exports.create = function(users){
var conv = new Conversation(users);
conversations.insertOne(conv, function(err){ if(err) throw err; });
db.getCollection("conversation" + conv._id).ensureIndex({time: 1});
return conv._id;
};
exports.remove = function(id){
conversations.removeOne({_id: id}, function(err){ if(err) throw err; });
db.getCollection("conversation" + id).drop();
};
exports.conversations = function(request, response){
var data = '';
var resp = response.json;
request.on('readable', function(){
var d = request.read();
if(d){
if(typeof d == 'string') data += d;
else if(d instanceof Buffer) data += d.toString('utf-8');
}
});
request.on('end', function(){
var query = data ? JSON.parse(data) : {};
var content = query.content || request.query.content;
var message = query.message || request.query.message;
var id = query.id || request.query.id;
var token = query.token || request.token;
var user = tokens.verify(token);
if(!id){
resp.error = "No conversation specified";
response.end(JSON.stringify(resp));
} else if(!user){
resp.error = "Invalid token";
response.end(JSON.stringify(resp));
} else users.find({login: user}).next(function(err, user){
if(!isParticipant(user, id)){
resp.error = "Access denied";
response.end(JSON.stringify(resp.error));
} else if(request.method == "GET"){
if(content == "users"){
conversations.find({_id: ObjectID.createFromHexString(id)}).next(function(err, conv){
if(conv){
resp.users = conv.users;
response.end(JSON.stringify(resp));
} else {
resp.error = "No such conversation";
response.end(JSON.stringify(resp));
}
});
} else if(content == "messages"){
var amount = query.amount || 10;
if(amount < 1) amount = 10;
db.getCollection("conversation" + id).find({}, {_id: 0})
.sort({time: -11}).limit(amount)
.toArray(function(err, res){
if(err) throw err;
resp.messages = res;
response.end(JSON.stringify(resp));
});
} else {
resp.error = "Unknown content type";
response.end(JSON.stringify(resp));
}
} else if(request.method == "POST"){
if(!message){
resp.error = "Nothing to post";
response.end(JSON.stringify(resp));
} else {
conversations.find({_id: ObjectID.createFromHexString(id)}).next(function(err, conv){
if(err) throw err;
if(!conv){
resp.error = "No such conversation";
response.end(JSON.stringify(resp));
} else {
var msg = new Message(user.login, message);
conv.users.forEach(function(target){
wss.send(target, JSON.stringify({
action: "new_message",
id: id,
msg: msg,
}));
});
db.getCollection("conversation" + id)
.insert(msg, function(err){
if(err) throw err;
response.end(JSON.stringify(resp));
});
}
});
}
}
});
});
}