feat: new delete routes that don't need body params, #14064

This commit is contained in:
Julian Lam
2026-04-10 13:27:34 -04:00
parent 420f8c75b5
commit 5c21a557af
2 changed files with 35 additions and 52 deletions

View File

@@ -32,54 +32,9 @@ Categories.update = async (req, res) => {
helpers.formatApiResponse(200, res, categoryObjs[0]);
};
Categories.deleteWatch = async (req, res) => {
const { cid } = req.params;
let { uid, state } = req.query;
if (!uid || !state) {
throw new Error('[[error:invalid-data]]');
}
if (Object.keys(categories.watchStates).includes(state)) {
state = categories.watchStates[state]; // convert to integer for backend processing
} else {
throw new Error('[[error:invalid-data]]');
}
const { cids: modified } = await api.categories.setWatchState(req, { cid, state, uid });
helpers.formatApiResponse(200, res, { modified });
};
Categories.deletePrivilege = async (req, res) => {
const { cid, privilege } = req.params;
let { member } = req.query;
if (!member) {
throw new Error('[[error:invalid-data]]');
}
await api.categories.setPrivilege(req, {
cid,
privilege,
member,
set: false,
});
const privilegeSet = await api.categories.getPrivileges(req, { cid: req.params.cid });
helpers.formatApiResponse(200, res, privilegeSet);
};
Categories.unfollow = async (req, res) => {
const { actor } = req.query;
const id = parseInt(req.params.cid, 10);
if (!id || !actor) { // disallow cid 0
return next();
}
await activitypub.out.undo.follow('cid', id, actor);
helpers.formatApiResponse(200, res, {});
Categories.delete = async (req, res) => {
await api.categories.delete(req, { cid: req.params.cid });
helpers.formatApiResponse(200, res);
};
Categories.getTopicCount = async (req, res) => {
@@ -118,7 +73,14 @@ Categories.setWatchState = async (req, res) => {
}
const { cids: modified } = await api.categories.setWatchState(req, { cid, state, uid });
helpers.formatApiResponse(200, res, { modified });
};
Categories.removeWatchState = async (req, res) => {
const { cid, uid } = req.params;
const state = categories.watchStates[meta.config.categoryWatchState];
const { cids: modified } = await api.categories.setWatchState(req, { cid, state, uid });
helpers.formatApiResponse(200, res, { modified });
};
@@ -141,6 +103,20 @@ Categories.setPrivilege = async (req, res) => {
helpers.formatApiResponse(200, res, privilegeSet);
};
Categories.removePrivilege = async (req, res) => {
const { cid, privilege, member } = req.params;
await api.categories.setPrivilege(req, {
cid,
privilege,
member,
set: false,
});
const privilegeSet = await api.categories.getPrivileges(req, { cid: req.params.cid });
helpers.formatApiResponse(200, res, privilegeSet);
};
Categories.setModerator = async (req, res) => {
await api.categories.setModerator(req, {
cid: req.params.cid,
@@ -167,7 +143,11 @@ Categories.follow = async (req, res, next) => {
};
Categories.unfollow = async (req, res, next) => {
const { actor } = req.body;
let { actor } = req.body;
if (req.params?.actor) {
({ actor } = req.params);
}
const id = parseInt(req.params.cid, 10);
if (!id) { // disallow cid 0
@@ -176,4 +156,4 @@ Categories.unfollow = async (req, res, next) => {
await activitypub.out.undo.follow('cid', id, actor);
helpers.formatApiResponse(200, res, {});
};
};

View File

@@ -22,17 +22,20 @@ module.exports = function () {
setupApiRoute(router, 'get', '/:cid/topics', [middleware.assert.category], controllers.write.categories.getTopics);
setupApiRoute(router, 'put', '/:cid/watch', [...middlewares, middleware.assert.category], controllers.write.categories.setWatchState);
setupApiRoute(router, 'delete', '/:cid/watch', [...middlewares, middleware.assert.category], controllers.write.categories.deleteWatch);
setupApiRoute(router, 'delete', '/:cid/watch', [...middlewares, middleware.assert.category], controllers.write.categories.setWatchState);
setupApiRoute(router, 'delete', '/:cid/watch/:uid', [...middlewares, middleware.assert.category], controllers.write.categories.removeWatchState);
setupApiRoute(router, 'get', '/:cid/privileges', [...middlewares], controllers.write.categories.getPrivileges);
setupApiRoute(router, 'put', '/:cid/privileges/:privilege', [...middlewares, middleware.checkRequired.bind(null, ['member'])], controllers.write.categories.setPrivilege);
setupApiRoute(router, 'delete', '/:cid/privileges/:privilege', [...middlewares, middleware.checkRequired.bind(null, ['member'])], controllers.write.categories.deletePrivilege);
setupApiRoute(router, 'delete', '/:cid/privileges/:privilege', [...middlewares, middleware.checkRequired.bind(null, ['member'])], controllers.write.categories.setPrivilege);
setupApiRoute(router, 'delete', '/:cid/privileges/:privilege/:member', controllers.write.categories.removePrivilege);
setupApiRoute(router, 'put', '/:cid/moderator/:uid', [...middlewares, middleware.assert.category], controllers.write.categories.setModerator);
setupApiRoute(router, 'delete', '/:cid/moderator/:uid', [...middlewares, middleware.assert.category], controllers.write.categories.setModerator);
setupApiRoute(router, 'put', '/:cid/follow', [...middlewares, middleware.activitypub.enabled, middleware.admin.checkPrivileges, middleware.assert.category], controllers.write.categories.follow);
setupApiRoute(router, 'delete', '/:cid/follow', [...middlewares, middleware.activitypub.enabled, middleware.admin.checkPrivileges, middleware.assert.category], controllers.write.categories.unfollow);
setupApiRoute(router, 'delete', '/:cid/follow/:actor', [...middlewares, middleware.activitypub.enabled, middleware.admin.checkPrivileges, middleware.assert.category], controllers.write.categories.unfollow);
return router;
};