summaryrefslogtreecommitdiffstats
path: root/app/core/files.js
blob: 90584ef3f7e4fee697719d4b09e57ca77e9622c4 (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
'use strict';

var fs = require('fs'),
    _ = require('lodash'),
    mongoose = require('mongoose'),
    settings = require('./../config').files,
    enabled = settings.enable,
    provider = _.find([
        require('./files/local'),
        require('./files/s3')
    ], function(provider) { return provider.enabled; });

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

FileManager.prototype.create = function(options, cb) {
    var File = mongoose.model('File'),
    Room = mongoose.model('Room'),
    User = mongoose.model('User');

    if (!enabled) {
        return cb('Files are disabled.');
    }

    if (settings.allowed_file_types &&
        settings.allowed_file_types.length &&
        !_.include(settings.allowed_file_types, options.file.mimetype)) {
            return cb('The MIME type ' + options.file.mimetype +
                      ' is not allowed');
    }

    Room.findById(options.room, function(err, room) {

        if (err) {
            console.error(err);
            return cb(err);
        }
        if (!room) {
            return cb('No room found!');
        }
        if (room.archived) {
            return cb('Room is archived.');
        }
        
        new File({
            owner: options.owner,
            name: options.file.originalname,
            type: options.file.mimetype,
            size: options.file.size,
            room: options.room
        }).save(function(err, savedFile) {
            provider.save({file: options.file, doc: savedFile}, function(err) {
                if (err) {
                    savedFile.remove();
                    return cb(err);
                }
                // Temporary workaround for _id until populate can do aliasing
                User.findOne(options.owner, function(err, user) {
                    if (err) {
                        console.error(err);
                        return cb(err);
                    }
                    cb(null, savedFile, room, user);
                    this.core.emit('files:new', savedFile, room, user);
                    options.post && this.core.messages.create({
                        room: room,
                        owner: user,
                        text: 'file:' + savedFile._id
                    });
                }.bind(this));
            }.bind(this));
        }.bind(this));
    }.bind(this));
};

FileManager.prototype.list = function(options, cb) {
    var File = mongoose.model('File'),
    User = mongoose.model('User');

    var find = File.find();

    if (options.room) {
        find.where('room', options.room);
    }

    find
    .populate('owner', 'id username displayName email avatar')
    .limit(options.limit || 500)
    .sort({ 'uploaded': -1 })
    .exec(function(err, files) {
        if (err) {
            console.error(err);
            return cb(err);
        }
        cb(null, files);
    });
};

FileManager.getUrl = provider ? provider.getUrl : function(){};

module.exports = FileManager;