83 lines
2.2 KiB
JavaScript
83 lines
2.2 KiB
JavaScript
import { model as User } from '../../models/user';
|
|
import * as slack from '../slack';
|
|
import { param , validationResult } from 'express-validator';
|
|
|
|
import ChatReporter from './chatReporter';
|
|
import {
|
|
BadRequest,
|
|
NotFound,
|
|
} from '../errors';
|
|
|
|
export default class ProfileReporter extends ChatReporter {
|
|
constructor (req, res) {
|
|
super(req, res);
|
|
|
|
this.user = res.locals.user;
|
|
}
|
|
|
|
async validate () {
|
|
await param('memberId', this.res.t('memberIdRequired')).notEmpty().isUUID().run(req)
|
|
|
|
const validationErrors = this.validationResult(req).array();
|
|
if (validationErrors && validationErrors.length > 0) throw validationErrors;
|
|
|
|
const flaggedUser = await User.findOne(
|
|
{ _id: this.req.params.memberId },
|
|
{ auth: 1, profile: 1 },
|
|
).exec();
|
|
if (!flaggedUser) {
|
|
throw new NotFound(this.res.t('userWithIDNotFound', { userId: this.req.params.memberId }));
|
|
}
|
|
|
|
if (flaggedUser.profile.flags && flaggedUser.profile.flags[this.user._id]
|
|
&& !this.user.hasPermission('moderator')) {
|
|
throw new BadRequest('A profile can not be flagged more than once by the same user.');
|
|
}
|
|
|
|
const { comment, source } = this.req.body;
|
|
|
|
return { flaggedUser, comment, source };
|
|
}
|
|
|
|
async flagProfile (flaggedUser, comment, source) {
|
|
const timestamp = new Date();
|
|
// Log user ids that have flagged the account
|
|
if (!flaggedUser.profile.flags) {
|
|
flaggedUser.profile.flags = {};
|
|
}
|
|
|
|
flaggedUser.profile.flags[this.user._id] = {
|
|
comment,
|
|
source,
|
|
timestamp,
|
|
};
|
|
flaggedUser.markModified('profile.flags');
|
|
await flaggedUser.save();
|
|
return timestamp;
|
|
}
|
|
|
|
notify (flaggedUser, comment, source) {
|
|
slack.sendProfileFlagNotification({
|
|
reporter: this.user,
|
|
flaggedUser,
|
|
userComment: comment,
|
|
source,
|
|
});
|
|
}
|
|
|
|
async flag () {
|
|
const { flaggedUser, comment, source } = await this.validate();
|
|
const timestamp = await this.flagProfile(flaggedUser, comment, source);
|
|
this.notify(flaggedUser, comment, source);
|
|
if (!this.user.hasPermission('moderator')) {
|
|
flaggedUser.profile.flags = {};
|
|
flaggedUser.profile.flags[this.user._id] = {
|
|
comment,
|
|
source,
|
|
timestamp,
|
|
};
|
|
}
|
|
return flaggedUser;
|
|
}
|
|
}
|