DTP Social Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

129 lines
3.3 KiB

// content-report.js
// Copyright (C) 2022 DTP Technologies, LLC
// License: Apache-2.0
'use strict';
const path = require('path');
const mongoose = require('mongoose');
const ContentReport = mongoose.model('ContentReport');
const pug = require('pug');
const striptags = require('striptags');
const { SiteService, SiteError } = require('../../lib/site-lib');
class ContentReportService extends SiteService {
constructor (dtp) {
super(dtp, module.exports);
this.populateContentReport = [
{
path: 'user',
select: '_id username username_lc displayName picture',
},
{
path: 'resource',
populate: [
{
path: 'author',
select: '_id username username_lc displayName picture',
},
],
},
];
}
async start ( ) {
await super.start();
this.templates = { };
this.templates.comment = pug.compileFile(path.join(this.dtp.config.root, 'app', 'views', 'comment', 'components', 'comment-standalone.pug'));
}
async create (user, reportDefinition) {
const NOW = new Date();
const report = new ContentReport();
report.created = NOW;
report.user = user._id;
report.resourceType = reportDefinition.resourceType;
report.resource = reportDefinition.resourceId;
report.status = 'new';
report.category = reportDefinition.category;
report.reason = striptags(reportDefinition.reason.trim());
await report.save();
return report.toObject();
}
async getReports (status, pagination) {
if (!Array.isArray(status)) {
status = [status];
}
const reports = await ContentReport
.find({ status: { $in: status } })
.sort({ created: 1 })
.skip(pagination.skip)
.limit(pagination.cpp)
.populate(this.populateContentReport)
.lean();
return reports;
}
async getById (reportId) {
const report = await ContentReport
.findById(reportId)
.populate(this.populateContentReport)
.lean();
return report;
}
async setStatus (report, status) {
await ContentReport.updateOne({ _id: report._id }, { $set: { status } });
}
async removeResource (report) {
switch (report.resourceType) {
case 'Comment':
return this.removeComment(report);
case 'Chat':
return this.removeChatMessage(report);
default:
break;
}
this.log.error('invalid resource type in content report', {
reportId: report._id,
resourceType: report.resourceType,
});
throw new SiteError(406, 'Invalid resource type in content report');
}
async removeComment (report) {
const { comment: commentService } = this.dtp.services;
await commentService.remove(report.resource._id || report.resource, 'mod-removed');
await this.setStatus(report, 'resolved');
}
async removeChatMessage (report) {
const { chat: chatService } = this.dtp.services;
await chatService.removeMessage(report.resource);
}
async removeForResource (resource) {
await ContentReport.deleteMany({ resource: resource._id });
}
async removeReport (report) {
await ContentReport.deleteOne({ _id: report._id });
}
}
module.exports = {
slug: 'content-report',
name: 'contentReport',
create: (dtp) => { return new ContentReportService(dtp); },
};