wanglian/workbase-server

View on GitHub
imports/model/server/methods.js

Summary

Maintainability
A
1 hr
Test Coverage
import moment from 'moment';

const logThread = (thread, user, content) => {
  Threads.addMessage(thread, user, {
    contentType: 'log',
    content
  });
};

Meteor.methods({
  sendMessage(threadId, params) {
    check(threadId, String);
    check(params, {
      contentType:   Match.Maybe(String),
      content:       String,
      internal:      Match.Maybe(Boolean),
      parentId:      Match.Maybe(String),
      fileIds:       Match.Maybe([String]),
      inlineFileIds: Match.Maybe([String])
    });

    let userId = this.userId;
    let user = Meteor.users.findOne(userId);
    let thread = Threads.findOne(threadId);
    let threadUser = ThreadUsers.findOne({threadId, userId, userType: 'Users'});

    if (thread && thread.scope !== 'private' || threadUser) {
      return Threads.addMessage(thread, user, params);
    }
  },
  revokeMessage(messageId) {
    check(messageId, String);

    let message = Messages.findOne(messageId);
    if (message.createdAt < moment().subtract(2, 'minutes').toDate()) {
      return false;
    }

    let user = Users.findOne(this.userId);
    let thread = Threads.findOne(message.threadId);

    let re = Threads.revokeMessage(thread, message);
    logThread(thread, user, {
      action: "thread.revoke",
      params: {user: user.name()}
    });
    return re;
  },
  queryContacts(keyword) {
    check(keyword, String);

    let search = {$or: [
      {"profile.name": {$regex: keyword, $options: 'i'}},
      {"emails.address": {$regex: keyword, $options: 'i'}}
    ]};
    return Users.find(search, {limit: 12}).map((c) => [{name: c.name(), email: c.email()}]);
  },
  queryContactsForThread(keyword, params) {
    check(keyword, String);
    check(params, Object);

    let threadId = params.id;
    let userIds = ThreadUsers.find({threadId, userType: 'Users'}).map((tu) => tu.userId);
    let contactIds = ThreadUsers.find({threadId, userType: 'Contacts'}).map((tu) => tu.userId);

    let search = {$or: [
      {"profile.name": {$regex: keyword, $options: 'i'}},
      {"emails.address": {$regex: keyword, $options: 'i'}}
    ]};
    return Users.find(_.extend(search, {_id: {$nin: userIds}}), {limit: 5}).map((c) => [{name: c.name(), email: c.email()}]);
  },
  addThreadMembers(threadId, userIds) {
    check(threadId, String);
    check(userIds, [String]);

    let user = Users.findOne(this.userId);
    // TODO: 权限

    let thread = Threads.findOne(threadId);
    let members = userIds.map((userId) => Users.findOne(userId));
    members.forEach((c) => Threads.ensureMember(thread, c));

    logThread(thread, user, {action: "thread.members.add", params: {count: members.length, emails: members.map((m) => m.address()).join(", ")}});
    return members.length;
  },
  removeThreadMember(threadId, userType, userId) {
    check(threadId, String);
    check(userType, String);
    check(userId, String);

    let user = Users.findOne(this.userId);
    let thread = Threads.findOne(threadId);
    let member = Users.findOne(userId);
    ThreadUsers.remove({threadId, userType, userId});
    logThread(thread, user, {action: "thread.members.remove", params: {email: member.address()}});
  }
});