habitica/website/server/libs/chatReporting/inboxChatReporter.js

115 lines
3.2 KiB
JavaScript
Raw Normal View History

import nconf from 'nconf';
2018-06-11 20:39:07 +00:00
import { model as User } from '../../models/user';
import ChatReporter from './chatReporter';
import {
NotFound,
} from '../errors';
import { getGroupUrl, sendTxn } from '../email';
import slack from '../slack';
import apiError from '../apiError';
import _find from 'lodash/find';
const FLAG_REPORT_EMAILS = nconf.get('FLAG_REPORT_EMAIL').split(',').map((email) => {
return { email, canSend: true };
});
export default class InboxChatReporter extends ChatReporter {
constructor (req, res) {
super(req, res);
2018-06-11 20:39:07 +00:00
this.reporter = res.locals.user;
this.inboxUser = res.locals.user;
}
async validate () {
this.req.checkParams('messageId', apiError('messageIdRequired')).notEmpty();
let validationErrors = this.req.validationErrors();
if (validationErrors) throw validationErrors;
2018-06-11 20:39:07 +00:00
if (this.reporter.contributor.admin && this.req.query.userId) {
this.inboxUser = await User.findOne({_id: this.req.query.userId});
}
let messages = this.inboxUser.inbox.messages;
const message = _find(messages, (m) => m.id === this.req.params.messageId);
if (!message) throw new NotFound(this.res.t('messageGroupChatNotFound'));
const userComment = this.req.body.comment;
return {message, userComment};
}
async notify (message, userComment) {
const group = {
type: 'private messages',
};
await super.notify(group, message);
const groupUrl = getGroupUrl(group);
sendTxn(FLAG_REPORT_EMAILS, 'flag-report-to-mods-with-comments', this.emailVariables.concat([
{name: 'GROUP_NAME', content: group.name},
{name: 'GROUP_TYPE', content: group.type},
{name: 'GROUP_ID', content: group._id},
{name: 'GROUP_URL', content: groupUrl},
{name: 'REPORTER_COMMENT', content: userComment || ''},
]));
slack.sendInboxFlagNotification({
authorEmail: this.authorEmail,
2018-06-11 20:39:07 +00:00
flagger: this.reporter,
message,
userComment,
});
}
2018-06-08 18:26:26 +00:00
updateMessageAndSave (message, updateFunc) {
updateFunc(message);
2018-06-11 20:39:07 +00:00
this.inboxUser.inbox.messages[message.id] = message;
this.inboxUser.markModified('inbox.messages');
2018-06-08 18:26:26 +00:00
2018-06-11 20:39:07 +00:00
return this.inboxUser.save();
2018-06-08 18:26:26 +00:00
}
flagInboxMessage (message) {
// Log user ids that have flagged the message
if (!message.flags) message.flags = {};
// TODO fix error type
2018-06-11 20:39:07 +00:00
if (message.flags[this.reporter._id] && !this.reporter.contributor.admin) {
2018-06-08 18:26:26 +00:00
throw new NotFound(this.res.t('messageGroupChatFlagAlreadyReported'));
}
2018-06-08 18:26:26 +00:00
return this.updateMessageAndSave(message, (m) => {
2018-06-11 20:39:07 +00:00
m.flags[this.reporter._id] = true;
2018-06-08 18:26:26 +00:00
// Log total number of flags (publicly viewable)
if (!m.flagCount) m.flagCount = 0;
2018-06-11 20:39:07 +00:00
if (this.reporter.contributor.admin) {
2018-06-08 18:26:26 +00:00
// Arbitrary amount, higher than 2
m.flagCount = 5;
} else {
m.flagCount++;
}
});
}
2018-06-08 18:26:26 +00:00
async markMessageAsReported (message) {
return this.updateMessageAndSave(message, (m) => {
m.reported = true;
});
}
async flag () {
let {message, userComment} = await this.validate();
await this.flagInboxMessage(message);
await this.notify(message, userComment);
2018-06-08 18:26:26 +00:00
await this.markMessageAsReported(message);
return message;
}
}