summaryrefslogtreecommitdiffstats
path: root/app/core/usermessages.js
blob: e69ea7556bba329580654e2547f93a1e45ba61f7 (plain)
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
'use strict';

var _ = require('lodash'),
    mongoose = require('mongoose'),
    helpers = require('./helpers');

function UserMessageManager(options) {
    this.core = options.core;
}

// options.currentUser, options.user

UserMessageManager.prototype.onMessageCreated = function(message, user, options, cb) {
    var User = mongoose.model('User');

    User.findOne(message.owner, function(err, owner) {
        if (err) {
            console.error(err);
            return cb(err);
        }
        if (cb) {
            cb(null, message, user, owner);
        }

        this.core.emit('user-messages:new', message, user, owner, options.data);
    }.bind(this));
};

UserMessageManager.prototype.create = function(options, cb) {
    var UserMessage = mongoose.model('UserMessage'),
        User = mongoose.model('User');

    User.findById(options.user, function(err, user) {
        if (err) {
            console.error(err);
            return cb(err);
        }
        if (!user) {
            return cb('User does not exist.');
        }

        var data = {
            users: [options.owner, options.user],
            owner: options.owner,
            text: options.text
        };

        var message = new UserMessage(data);

        // Test if this message is OTR
        if (data.text.match(/^\?OTR/)) {
            message._id = 'OTR';
            this.onMessageCreated(message, user, options, cb);
        } else {
            message.save(function(err) {
                if (err) {
                    console.error(err);
                    return cb(err);
                }
                this.onMessageCreated(message, user, options, cb);
            }.bind(this));
        }
    }.bind(this));
};

UserMessageManager.prototype.list = function(options, cb) {
    options = options || {};

    if (!options.room) {
        return cb(null, []);
    }

    options = helpers.sanitizeQuery(options, {
        defaults: {
            reverse: true,
            take: 500
        },
        maxTake: 5000
    });

    var UserMessage = mongoose.model('Message');

    var find = UserMessage.find({
        users: { $all: [options.currentUser, options.user] }
    });

    if (options.since_id) {
        find.where('_id').gt(options.since_id);
    }

    if (options.from) {
        find.where('posted').gt(options.from);
    }

    if (options.to) {
        find.where('posted').lte(options.to);
    }

    if (options.expand) {
        var includes = options.expand.split(',');

        if (_.includes(includes, 'owner')) {
            find.populate('owner', 'id username displayName email avatar');
        }
    }

    if (options.skip) {
        find.skip(options.skip);
    }

    if (options.reverse) {
        find.sort({ 'posted': -1 });
    } else {
        find.sort({ 'posted': 1 });
    }

    find.limit(options.take)
        .exec(function(err, messages) {
            if (err) {
                console.error(err);
                return cb(err);
            }
            cb(null, messages);
        });
};

module.exports = UserMessageManager;