All checks were successful
Deploy to production / deploy (push) Successful in 1m55s
- Added user blocking checks in authentication and reporting processes, returning appropriate error responses. - Expanded moderation report functionality to include new target types and optional fields for reports. - Implemented a new API endpoint to retrieve the count of open moderation reports. - Enhanced frontend components to allow users to report profiles, images, and guestbook entries, with corresponding UI updates. - Updated internationalization files to include new strings for reporting features in both German and English.
80 lines
2.7 KiB
JavaScript
80 lines
2.7 KiB
JavaScript
import Joi from 'joi';
|
|
import moderationService from '../services/moderationService.js';
|
|
|
|
const moderationController = {
|
|
async createReport(req, res) {
|
|
const allowedTargetTypes = [
|
|
'forum_message',
|
|
'gallery_image',
|
|
'guestbook_entry',
|
|
'one_to_one_message',
|
|
'diary_entry',
|
|
'user_profile',
|
|
'blog',
|
|
'blog_post'
|
|
];
|
|
const schema = Joi.object({
|
|
targetType: Joi.string().valid(...allowedTargetTypes).required(),
|
|
targetId: Joi.number().integer().min(1).optional(),
|
|
targetRef: Joi.string().trim().max(255).allow('').optional(),
|
|
reason: Joi.string().trim().min(3).max(120).required(),
|
|
details: Joi.string().allow('').max(2000).optional()
|
|
}).or('targetId', 'targetRef');
|
|
const { error, value } = schema.validate(req.body || {});
|
|
if (error) {
|
|
return res.status(400).json({ error: error.details[0].message });
|
|
}
|
|
try {
|
|
const { userid: userId } = req.headers;
|
|
const result = await moderationService.createReport(userId, value);
|
|
return res.status(201).json(result);
|
|
} catch (err) {
|
|
console.error('Error in createReport:', err);
|
|
return res.status(400).json({ error: err.message });
|
|
}
|
|
},
|
|
|
|
async listReports(req, res) {
|
|
try {
|
|
const { userid: userId } = req.headers;
|
|
const result = await moderationService.listReports(userId, req.query || {});
|
|
return res.status(200).json(result);
|
|
} catch (err) {
|
|
console.error('Error in listReports:', err);
|
|
return res.status(400).json({ error: err.message });
|
|
}
|
|
},
|
|
|
|
async updateReportStatus(req, res) {
|
|
const schema = Joi.object({
|
|
status: Joi.string().valid('open', 'in_review', 'resolved', 'rejected').required(),
|
|
reviewerNote: Joi.string().allow('').max(2000).optional()
|
|
});
|
|
const { error, value } = schema.validate(req.body || {});
|
|
if (error) {
|
|
return res.status(400).json({ error: error.details[0].message });
|
|
}
|
|
try {
|
|
const { userid: userId } = req.headers;
|
|
const result = await moderationService.updateReportStatus(userId, req.params.reportId, value);
|
|
return res.status(200).json(result);
|
|
} catch (err) {
|
|
console.error('Error in updateReportStatus:', err);
|
|
return res.status(400).json({ error: err.message });
|
|
}
|
|
},
|
|
|
|
async getOpenReportCount(req, res) {
|
|
try {
|
|
const { userid: userId } = req.headers;
|
|
const result = await moderationService.getOpenReportCount(userId);
|
|
return res.status(200).json(result);
|
|
} catch (err) {
|
|
console.error('Error in getOpenReportCount:', err);
|
|
return res.status(400).json({ error: err.message });
|
|
}
|
|
}
|
|
};
|
|
|
|
export default moderationController;
|