arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/server/controllers/conversationController.js
server/controllers/conversationController.jsRaw
  1var express = require('express');
  2var app = express();
  3var conversationModel = require('../models/conversationModel');
  4var userModel = require('../models/userModel');
  5//var trainerModel = require('../models/trainerModel');
  6var crypto = require('crypto');
  7
  8exports.getUserConversations = function (req, res) {
  9    userModel.findOne({'tokens.token': req.headers['x-access-token']})
 10        .lean()
 11        .populate({//això és per fer deep population
 12            path: 'conversations',
 13            populate: {
 14                path: 'userA userB',
 15                model: 'userModel',
 16                select: 'name avatar'
 17            }
 18        })
 19        .populate({//això és per fer deep population
 20            path: 'conversations',
 21            populate: {
 22                path: 'messages.user',
 23                model: 'userModel',
 24                select: 'name avatar'
 25            }
 26        })
 27        .exec(function (err, user) {
 28            if (err) return res.send(500, err.message);
 29            res.status(200).jsonp(user.conversations);
 30        });
 31};
 32
 33/**POST '/conversations' **/
 34exports.createConversation = function (req, res) {//req.body.userB
 35    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, userA) {
 36        if (err) return res.send(500, err.message);
 37        if (!userA) {
 38            res.json({success: false, message: 'userA not found.'});
 39        } else if (userA) {
 40            //aquí ja hem agafat el userA a partir del seu token
 41            userModel.findOne({_id: req.body.userB}, function (err, userB) {//busquem l'userB
 42                if (err) return res.send(500, err.message);
 43                if (!userB) {
 44                    res.json({success: false, message: 'userB not found.'});
 45                } else if (userB) {
 46                    conversationModel.findOne({$or:[{userA: userA._id, userB: userB._id},{userA: userB._id, userB: userA._id}]}, function (err, conversation) {
 47                        if (err) return res.send(500, err.message);
 48                        if (!conversation) {
 49                            console.log("conversation no exists, create new one");
 50                            var conversation = new conversationModel({
 51                                userA: userA._id,
 52                                userB: userB._id,
 53                                modifiedDate: Date()
 54                            });
 55                            conversation.save(function (err, conversation) {
 56                                if (err) return res.send(500, err.message);
 57
 58                                userA.conversations.push(conversation._id);
 59                                userA.save(function (err) {
 60                                    if (err) return res.send(500, err.message);
 61                                    userB.conversations.push(conversation._id);
 62                                    userB.save(function (err) {
 63                                        if (err) return res.send(500, err.message);
 64                                        userModel.findOne({'tokens.token': req.headers['x-access-token']})
 65                                            .lean()
 66                                            .populate({//això és per fer deep population
 67                                                path: 'conversations',
 68                                                populate: {
 69                                                    path: 'userA userB',
 70                                                    model: 'userModel',
 71                                                    select: 'name avatar'
 72                                                }
 73                                            })
 74                                            .populate({//això és per fer deep population
 75                                                path: 'conversations',
 76                                                populate: {
 77                                                    path: 'messages.user',
 78                                                    model: 'userModel',
 79                                                    select: 'name avatar'
 80                                                }
 81                                            })
 82                                            .exec(function (err, user) {
 83                                                if (err) return res.send(500, err.message);
 84                                                res.status(200).jsonp(user.conversations);
 85                                            });
 86                                    });
 87                                });
 88                            });
 89                        } else if (conversation) {
 90                            console.log("conversation exists");
 91                            userModel.findOne({'tokens.token': req.headers['x-access-token']})
 92                                .lean()
 93                                .populate({//això és per fer deep population
 94                                    path: 'conversations',
 95                                    populate: {
 96                                        path: 'userA userB',
 97                                        model: 'userModel',
 98                                        select: 'name avatar'
 99                                    }
100                                })
101                                .populate({//això és per fer deep population
102                                    path: 'conversations',
103                                    populate: {
104                                        path: 'messages.user',
105                                        model: 'userModel',
106                                        select: 'name avatar'
107                                    }
108                                })
109                                .exec(function (err, user) {
110                                    if (err) return res.send(500, err.message);
111                                    res.status(200).jsonp(user.conversations);
112                                });
113                        }
114                    });//end of conversation find
115
116                }//end else if (userB)
117            });//end of userB find
118        }//end else if (userA)
119    });//end of userA find
120};
121
122
123/**POST '/conversations/:conversationid' **/
124exports.addMessageToConversation = function (req, res) {
125    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, userSender) {
126        if (err) return res.send(500, err.message);
127        if (!userSender) {
128            res.json({success: false, message: 'userSender not found.'});
129        } else if (userSender) {
130            //aquí ja hem agafat el userSender a partir del seu token
131            conversationModel.findOne({_id: req.params.conversationid}, function (err, conversation) {
132                if (err) return res.send(500, err.message);
133                if (!conversation) {
134                    res.json({success: false, message: 'conversation not found.'});
135                } else if (conversation) {
136                    var newmessage = {
137                        user: userSender._id,
138                        content: req.body.message,
139                        date: Date()
140                    };
141                    conversation.messages.push(newmessage);
142                    conversation.modifiedDate=Date();
143
144                    conversation.save(function (err, conversation) {
145                        if (err) return res.send(500, err.message);
146
147                        //ara cal saber qui és l'userReciever (el que no ha enviat el missatge)
148                        var idUserReciever;
149                        if(userSender._id.equals(conversation.userA)==false){
150                            idUserReciever=conversation.userA;
151                        }else if(userSender._id.equals(conversation.userB)==false){
152                            idUserReciever=conversation.userB;
153                        }
154                        userModel.findOne({_id: idUserReciever}, function (err, userReciever) {//busquem l'userReciever
155                            if (err) return res.send(500, err.message);
156                            if (!userReciever) {
157                                res.json({success: false, message: 'userReciever not found.'});
158                            } else if (userReciever) {
159                                console.log("reciever: " + userReciever.name);
160                                /*notification*/
161                                var notification = {
162                                    state: "pendent",
163                                    message: userSender.name + " sent a message to you",
164                                    link: "messages",
165                                    icon: "message.png",
166                                    date: Date()
167                                };
168                                userReciever.notifications.push(notification);
169                                /* end of notification*/
170                                userReciever.save(function (err) {
171                                    if (err) return res.send(500, err.message);
172                                    userModel.findOne({'tokens.token': req.headers['x-access-token']})
173                                        .lean()
174                                        .populate({//això és per fer deep population
175                                            path: 'conversations',
176                                            populate: {
177                                                path: 'userA userB',
178                                                model: 'userModel',
179                                                select: 'name avatar'
180                                            }
181                                        })
182                                        .populate({//això és per fer deep population
183                                            path: 'conversations',
184                                            populate: {
185                                                path: 'messages.user',
186                                                model: 'userModel',
187                                                select: 'name avatar'
188                                            }
189                                        })
190                                        .exec(function (err, user) {
191                                            if (err) return res.send(500, err.message);
192                                            res.status(200).jsonp(user.conversations);
193                                        });
194                                });
195                            }//end else if (userReciever)
196                        });//end userReciever find
197                    });
198                }//end else if (conversation)
199            });//end of conversation find
200        }//end else if (userSender)
201    });//end of userSender find
202};