Files
NodeBB/src/api/flags.js
2024-04-14 00:51:53 +02:00

124 lines
3.1 KiB
JavaScript

'use strict';
const user = require('../user');
const flags = require('../flags');
const flagsApi = module.exports;
flagsApi.create = async (caller, data) => {
const required = ['type', 'id', 'reason'];
if (!required.every(prop => !!data[prop])) {
throw new Error('[[error:invalid-data]]');
}
const { type, id, reason, notifyRemote } = data;
await flags.validate({
uid: caller.uid,
type: type,
id: id,
});
const flagObj = await flags.create(type, id, caller.uid, reason, undefined, undefined, notifyRemote);
flags.notify(flagObj, caller.uid);
return flagObj;
};
flagsApi.get = async (caller, { flagId }) => {
const isPrivileged = await user.isPrivileged(caller.uid);
if (!isPrivileged) {
throw new Error('[[error:no-privileges]]');
}
return await flags.get(flagId);
};
flagsApi.update = async (caller, data) => {
const allowed = await user.isPrivileged(caller.uid);
if (!allowed) {
throw new Error('[[error:no-privileges]]');
}
const { flagId } = data;
delete data.flagId;
await flags.update(flagId, caller.uid, data);
return await flags.getHistory(flagId);
};
flagsApi.delete = async (_, { flagId }) => await flags.purge([flagId]);
flagsApi.rescind = async ({ uid }, { flagId }) => {
const { type, targetId } = await flags.get(flagId);
const exists = await flags.exists(type, targetId, uid);
if (!exists) {
throw new Error('[[error:no-flag]]');
}
await flags.rescindReport(type, targetId, uid);
};
flagsApi.rescindPost = async ({ uid }, { pid }) => {
const exists = await flags.exists('post', pid, uid);
if (!exists) {
throw new Error('[[error:no-flag]]');
}
await flags.rescindReport('post', pid, uid);
};
flagsApi.rescindUser = async ({ uid }, { uid: targetUid }) => {
const exists = await flags.exists('user', targetUid, uid);
if (!exists) {
throw new Error('[[error:no-flag]]');
}
await flags.rescindReport('user', targetUid, uid);
};
flagsApi.appendNote = async (caller, data) => {
const allowed = await user.isPrivileged(caller.uid);
if (!allowed) {
throw new Error('[[error:no-privileges]]');
}
if (data.datetime && data.flagId) {
try {
const note = await flags.getNote(data.flagId, data.datetime);
if (note.uid !== caller.uid) {
throw new Error('[[error:no-privileges]]');
}
} catch (e) {
// Okay if not does not exist in database
if (e.message !== '[[error:invalid-data]]') {
throw e;
}
}
}
await flags.appendNote(data.flagId, caller.uid, data.note, data.datetime);
const [notes, history] = await Promise.all([
flags.getNotes(data.flagId),
flags.getHistory(data.flagId),
]);
return { notes: notes, history: history };
};
flagsApi.deleteNote = async (caller, data) => {
const note = await flags.getNote(data.flagId, data.datetime);
if (note.uid !== caller.uid) {
throw new Error('[[error:no-privileges]]');
}
await flags.deleteNote(data.flagId, data.datetime);
await flags.appendHistory(data.flagId, caller.uid, {
notes: '[[flags:note-deleted]]',
datetime: Date.now(),
});
const [notes, history] = await Promise.all([
flags.getNotes(data.flagId),
flags.getHistory(data.flagId),
]);
return { notes: notes, history: history };
};