space_memberships.js 4.42 KB
Newer Older
mntmn's avatar
mntmn committed
1
2
"use strict";
var config = require('config');
3
4
5
6
const db = require('../../models/db');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const uuidv4 = require('uuid/v4');
mntmn's avatar
mntmn committed
7
8
9
10
11
12
13
14
15
16
17

var redis = require('../../helpers/redis');
var mailer = require('../../helpers/mailer');

var async = require('async');
var fs = require('fs');
var _ = require("underscore");
var request = require('request');
var url = require("url");
var path = require("path");
var glob = require('glob');
18
var crypto = require('crypto');
mntmn's avatar
mntmn committed
19
20
21
22
23

var express = require('express');
var router = express.Router({mergeParams: true});

router.get('/', function(req, res, next) {
24
25
26
27
28
  db.Membership
    .findAll({where: {
      space_id: req.space._id
    }, include: ['user']})
    .then(memberships => {
mntmn's avatar
mntmn committed
29
30
31
32
33
34
35
      res.status(200).json(memberships);
    });
});

router.post('/', function(req, res, next) {
  if (req.spaceRole == "admin") {
    var attrs = req.body;
36
37
38
39
40
    attrs.space_id = req.space._id;
    attrs.state = "pending";
    attrs._id = uuidv4();
    var membership = attrs;
    
mntmn's avatar
mntmn committed
41
42
43
    var msg = attrs.personal_message;

    if (membership.email_invited != req.user.email) {
44
      db.User.findOne({where:{
mntmn's avatar
mntmn committed
45
        "email": membership.email_invited
46
      }}).then(function(user) {
mntmn's avatar
mntmn committed
47

48
        // existing user? then immediately activate membership
mntmn's avatar
mntmn committed
49
        if (user) {
50
          membership.user_id = user._id;
mntmn's avatar
mntmn committed
51
52
          membership.state = "active";
        } else {
53
          // if not, invite via email and invite code
mntmn's avatar
mntmn committed
54
55
56
          membership.code = crypto.randomBytes(64).toString('hex').substring(0, 12);
        }

57
58
59
60
61
        db.Membership.create(membership).then(function() {
          var accept_link = config.endpoint + "/accept/" + membership._id + "?code=" + membership.code;

          if (user) {
            accept_link = config.endpoint + "/" + req.space.space_type + "s/" + req.space._id;
mntmn's avatar
mntmn committed
62
          }
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

          var openText = req.i18n.__("space_invite_membership_action");
          if (user) {
            req.i18n.__("open");
          }

          const name = req.user.nickname || req.user.email
          const subject = (req.space.space_type == "space") ? req.i18n.__("space_invite_membership_subject", name, req.space.name) : req.i18n.__("folder_invite_membership_subject", req.user.nickname, req.space.name)
          const body = (req.space.space_type == "space") ? req.i18n.__("space_invite_membership_body", name, req.space.name) : req.i18n.__("folder_invite_membership_body", req.user.nickname, req.space.name)

          mailer.sendMail(
            membership.email_invited, subject, body, {
              messsage: msg,
              action: {
                link: accept_link,
                name: openText
              }
            });

          res.status(201).json(membership);
mntmn's avatar
mntmn committed
83
84
85
86
87
88
        });

      });

    } else {
      res.status(400).json({
mntmn's avatar
mntmn committed
89
        "error": "This email is already included in the Space memberships."
mntmn's avatar
mntmn committed
90
91
92
93
94
      });
    }

  } else {
    res.status(403).json({
95
      "error": "Only administrators can do that."
mntmn's avatar
mntmn committed
96
97
98
99
100
101
102
    });
  }
});

router.put('/:membership_id', function(req, res, next) {
  if (req.user) {
    if (req.spaceRole == "admin") {
103
      db.Membership.findOne({ where: {
mntmn's avatar
mntmn committed
104
        _id: req.params.membership_id
105
106
      }}).then(function(mem) {
        if (mem) {
107
108
109
110
111
112
113
114
115
116
117
118
          // is the user trying to change their own role?
          if (mem.user_id == req.user._id) {
            res.status(400).json({
              "error": "Cannot change your own role."
            });
          } else {
            var attrs = req.body;
            mem.role = attrs.role;
            mem.save(function() {
              res.status(201).json(mem);
            });
          }
mntmn's avatar
mntmn committed
119
120
121
122
123
124
125
126
127
128
129
        }
      });
    } else {
      res.sendStatus(403);
    }
  } else {
    res.sendStatus(403);
  }
});

router.delete('/:membership_id', function(req, res, next) {
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  if (req.user && req.spaceRole == 'admin') {
    db.Membership.count({ where: {
      space_id: req.space._id,
      role: "admin"
    }}).then(function(adminCount) {
      db.Membership.findOne({ where: {
        _id: req.params.membership_id
      }}).then(function(mem) {
        // deleting an admin? need at least 1
        if (mem.role != "admin" || adminCount > 1) { 
          mem.destroy().then(function() {
            res.sendStatus(204);
          });
        } else {
          res.status(400).json({
            "error": "Space needs at least one administrator."
          });
        }
      })
mntmn's avatar
mntmn committed
149
150
151
152
153
154
155
    });
  } else {
    res.sendStatus(403);
  }
});

module.exports = router;