mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-19 23:10:21 +01:00
feat: added POST and DELETE /api/v1/users/:uid/follow routes
This commit is contained in:
47
openapi.yaml
47
openapi.yaml
@@ -195,6 +195,53 @@ paths:
|
|||||||
$ref: '#/components/schemas/Status'
|
$ref: '#/components/schemas/Status'
|
||||||
response:
|
response:
|
||||||
type: object
|
type: object
|
||||||
|
'/{uid}/follow':
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- users
|
||||||
|
summary: follows a user
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: uid
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
required: true
|
||||||
|
description: uid of the user to follow
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successfully followed user
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
status:
|
||||||
|
$ref: '#/components/schemas/Status'
|
||||||
|
response:
|
||||||
|
type: object
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- users
|
||||||
|
summary: unfollows a user
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: uid
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
required: true
|
||||||
|
description: uid of the user to unfollow
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successfully unfollowed user
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
status:
|
||||||
|
$ref: '#/components/schemas/Status'
|
||||||
|
response:
|
||||||
|
type: object
|
||||||
components:
|
components:
|
||||||
schemas:
|
schemas:
|
||||||
Status:
|
Status:
|
||||||
|
|||||||
@@ -115,17 +115,18 @@ define('forum/account/header', [
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toggleFollow(type) {
|
function toggleFollow(type) {
|
||||||
socket.emit('user.' + type, {
|
$.ajax({
|
||||||
uid: ajaxify.data.uid,
|
url: config.relative_path + '/api/v1/users/' + ajaxify.data.uid + '/' + type,
|
||||||
}, function (err) {
|
method: type === 'follow' ? 'post' : 'delete',
|
||||||
if (err) {
|
}).done(function () {
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
components.get('account/follow').toggleClass('hide', type === 'follow');
|
components.get('account/follow').toggleClass('hide', type === 'follow');
|
||||||
components.get('account/unfollow').toggleClass('hide', type === 'unfollow');
|
components.get('account/unfollow').toggleClass('hide', type === 'unfollow');
|
||||||
app.alertSuccess('[[global:alert.' + type + ', ' + ajaxify.data.username + ']]');
|
app.alertSuccess('[[global:alert.' + type + ', ' + ajaxify.data.username + ']]');
|
||||||
|
}).fail(function (ev) {
|
||||||
|
console.log(ev);
|
||||||
|
app.alertError(ev.responseJSON.status.message);
|
||||||
});
|
});
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
const user = require('../../user');
|
const user = require('../../user');
|
||||||
const groups = require('../../groups');
|
const groups = require('../../groups');
|
||||||
|
const plugins = require('../../plugins');
|
||||||
const privileges = require('../../privileges');
|
const privileges = require('../../privileges');
|
||||||
|
const notifications = require('../../notifications');
|
||||||
const meta = require('../../meta');
|
const meta = require('../../meta');
|
||||||
const events = require('../../events');
|
const events = require('../../events');
|
||||||
const helpers = require('../helpers');
|
const helpers = require('../helpers');
|
||||||
@@ -119,3 +121,37 @@ Users.changePassword = async (req, res) => {
|
|||||||
|
|
||||||
helpers.formatApiResponse(200, res);
|
helpers.formatApiResponse(200, res);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Users.follow = async (req, res) => {
|
||||||
|
await user.follow(req.user.uid, req.params.uid);
|
||||||
|
plugins.fireHook('action:user.follow', {
|
||||||
|
fromUid: req.user.uid,
|
||||||
|
toUid: req.params.uid,
|
||||||
|
});
|
||||||
|
|
||||||
|
const userData = await user.getUserFields(req.user.uid, ['username', 'userslug']);
|
||||||
|
const notifObj = await notifications.create({
|
||||||
|
type: 'follow',
|
||||||
|
bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]',
|
||||||
|
nid: 'follow:' + req.params.uid + ':uid:' + req.user.uid,
|
||||||
|
from: req.user.uid,
|
||||||
|
path: '/uid/' + req.params.uid + '/followers',
|
||||||
|
mergeId: 'notifications:user_started_following_you',
|
||||||
|
});
|
||||||
|
if (!notifObj) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
notifObj.user = userData;
|
||||||
|
await notifications.push(notifObj, [req.params.uid]);
|
||||||
|
|
||||||
|
helpers.formatApiResponse(200, res);
|
||||||
|
};
|
||||||
|
|
||||||
|
Users.unfollow = async (req, res) => {
|
||||||
|
await user.unfollow(req.user.uid, req.params.uid);
|
||||||
|
plugins.fireHook('action:user.unfollow', {
|
||||||
|
fromUid: req.user.uid,
|
||||||
|
toUid: req.params.uid,
|
||||||
|
});
|
||||||
|
helpers.formatApiResponse(200, res);
|
||||||
|
};
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ function authenticatedRoutes() {
|
|||||||
|
|
||||||
setupApiRoute(router, '/:uid/password', middleware, [...middlewares, middleware.checkRequired.bind(null, ['newPassword'])], 'put', controllers.write.users.changePassword);
|
setupApiRoute(router, '/:uid/password', middleware, [...middlewares, middleware.checkRequired.bind(null, ['newPassword'])], 'put', controllers.write.users.changePassword);
|
||||||
|
|
||||||
|
setupApiRoute(router, '/:uid/follow', middleware, [...middlewares], 'post', controllers.write.users.follow);
|
||||||
|
setupApiRoute(router, '/:uid/unfollow', middleware, [...middlewares], 'delete', controllers.write.users.unfollow);
|
||||||
|
|
||||||
// app.put('/:uid/follow', apiMiddleware.requireUser, function(req, res) {
|
// app.put('/:uid/follow', apiMiddleware.requireUser, function(req, res) {
|
||||||
// Users.follow(req.user.uid, req.params.uid, function(err) {
|
// Users.follow(req.user.uid, req.params.uid, function(err) {
|
||||||
// return errorHandler.handle(err, res);
|
// return errorHandler.handle(err, res);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ const userController = require('../controllers/user');
|
|||||||
const privileges = require('../privileges');
|
const privileges = require('../privileges');
|
||||||
const utils = require('../utils');
|
const utils = require('../utils');
|
||||||
const flags = require('../flags');
|
const flags = require('../flags');
|
||||||
|
const sockets = require('.');
|
||||||
|
|
||||||
const SocketUser = module.exports;
|
const SocketUser = module.exports;
|
||||||
|
|
||||||
@@ -157,6 +158,8 @@ SocketUser.isFollowing = async function (socket, data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketUser.follow = async function (socket, data) {
|
SocketUser.follow = async function (socket, data) {
|
||||||
|
sockets.warnDeprecated(socket, 'POST /api/v1/users/follow');
|
||||||
|
|
||||||
if (!socket.uid || !data) {
|
if (!socket.uid || !data) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
@@ -179,6 +182,8 @@ SocketUser.follow = async function (socket, data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketUser.unfollow = async function (socket, data) {
|
SocketUser.unfollow = async function (socket, data) {
|
||||||
|
sockets.warnDeprecated(socket, 'DELETE /api/v1/users/unfollow');
|
||||||
|
|
||||||
if (!socket.uid || !data) {
|
if (!socket.uid || !data) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user