mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: PUT /chats/:roomId/:mid
This commit is contained in:
@@ -13,6 +13,7 @@
|
|||||||
"invalid-tid": "Invalid Topic ID",
|
"invalid-tid": "Invalid Topic ID",
|
||||||
"invalid-pid": "Invalid Post ID",
|
"invalid-pid": "Invalid Post ID",
|
||||||
"invalid-uid": "Invalid User ID",
|
"invalid-uid": "Invalid User ID",
|
||||||
|
"invalid-mid": "Invalid Chat Message ID",
|
||||||
"invalid-date": "A valid date must be provided",
|
"invalid-date": "A valid date must be provided",
|
||||||
|
|
||||||
"invalid-username": "Invalid Username",
|
"invalid-username": "Invalid Username",
|
||||||
|
|||||||
@@ -8,27 +8,21 @@ define('forum/chats/messages', [
|
|||||||
const messages = {};
|
const messages = {};
|
||||||
|
|
||||||
messages.sendMessage = function (roomId, inputEl) {
|
messages.sendMessage = function (roomId, inputEl) {
|
||||||
const msg = inputEl.val();
|
const message = inputEl.val();
|
||||||
const mid = inputEl.attr('data-mid');
|
const mid = inputEl.attr('data-mid');
|
||||||
|
|
||||||
if (!msg.trim().length) {
|
if (!message.trim().length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
inputEl.val('');
|
inputEl.val('');
|
||||||
inputEl.removeAttr('data-mid');
|
inputEl.removeAttr('data-mid');
|
||||||
messages.updateRemainingLength(inputEl.parent());
|
messages.updateRemainingLength(inputEl.parent());
|
||||||
hooks.fire('action:chat.sent', {
|
hooks.fire('action:chat.sent', { roomId, message, mid });
|
||||||
roomId: roomId,
|
|
||||||
message: msg,
|
|
||||||
mid: mid,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!mid) {
|
if (!mid) {
|
||||||
api.post(`/chats/${roomId}`, {
|
api.post(`/chats/${roomId}`, { message }).catch((err) => {
|
||||||
message: msg,
|
inputEl.val(message);
|
||||||
}).catch((err) => {
|
|
||||||
inputEl.val(msg);
|
|
||||||
messages.updateRemainingLength(inputEl.parent());
|
messages.updateRemainingLength(inputEl.parent());
|
||||||
if (err.message === '[[error:email-not-confirmed-chat]]') {
|
if (err.message === '[[error:email-not-confirmed-chat]]') {
|
||||||
return messagesModule.showEmailConfirmWarning(err.message);
|
return messagesModule.showEmailConfirmWarning(err.message);
|
||||||
@@ -43,17 +37,11 @@ define('forum/chats/messages', [
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
socket.emit('modules.chats.edit', {
|
api.put(`/chats/${roomId}/${mid}`, { message }).catch((err) => {
|
||||||
roomId: roomId,
|
inputEl.val(message);
|
||||||
mid: mid,
|
|
||||||
message: msg,
|
|
||||||
}, function (err) {
|
|
||||||
if (err) {
|
|
||||||
inputEl.val(msg);
|
|
||||||
inputEl.attr('data-mid', mid);
|
inputEl.attr('data-mid', mid);
|
||||||
messages.updateRemainingLength(inputEl.parent());
|
messages.updateRemainingLength(inputEl.parent());
|
||||||
return alerts.error(err);
|
return alerts.error(err);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -67,7 +67,11 @@ Chats.kick = async (req, res) => {
|
|||||||
|
|
||||||
Chats.messages = {};
|
Chats.messages = {};
|
||||||
Chats.messages.edit = async (req, res) => {
|
Chats.messages.edit = async (req, res) => {
|
||||||
// ...
|
await messaging.canEdit(req.params.mid, req.uid);
|
||||||
|
await messaging.editMessage(req.uid, req.params.mid, req.params.roomId, req.body.message);
|
||||||
|
|
||||||
|
const messages = await messaging.getMessagesData([req.params.mid], req.uid, req.params.roomId, false);
|
||||||
|
helpers.formatApiResponse(200, res, messages.pop());
|
||||||
};
|
};
|
||||||
|
|
||||||
Chats.messages.delete = async (req, res) => {
|
Chats.messages.delete = async (req, res) => {
|
||||||
|
|||||||
@@ -47,6 +47,11 @@ module.exports = function (Messaging) {
|
|||||||
durationConfig = 'chatDeleteDuration';
|
durationConfig = 'chatDeleteDuration';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const exists = await Messaging.messageExists(messageId);
|
||||||
|
if (!exists) {
|
||||||
|
throw new Error('[[error:invalid-mid]]');
|
||||||
|
}
|
||||||
|
|
||||||
const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(uid);
|
const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(uid);
|
||||||
|
|
||||||
if (meta.config.disableChat) {
|
if (meta.config.disableChat) {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ require('./rooms')(Messaging);
|
|||||||
require('./unread')(Messaging);
|
require('./unread')(Messaging);
|
||||||
require('./notifications')(Messaging);
|
require('./notifications')(Messaging);
|
||||||
|
|
||||||
|
Messaging.messageExists = async mid => db.exists(`message:${mid}`);
|
||||||
|
|
||||||
Messaging.getMessages = async (params) => {
|
Messaging.getMessages = async (params) => {
|
||||||
const isNew = params.isNew || false;
|
const isNew = params.isNew || false;
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ module.exports = function () {
|
|||||||
// setupApiRoute(router, 'put', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.invite);
|
// setupApiRoute(router, 'put', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.invite);
|
||||||
// setupApiRoute(router, 'delete', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.kick);
|
// setupApiRoute(router, 'delete', '/:roomId/users', [...middlewares, middleware.assert.room, middleware.checkRequired.bind(null, ['uids'])], controllers.write.chats.kick);
|
||||||
|
|
||||||
// setupApiRoute(router, 'put', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.edit);
|
// setupApiRoute(router, 'get', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.get);
|
||||||
|
setupApiRoute(router, 'put', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.edit);
|
||||||
// setupApiRoute(router, 'delete', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.delete);
|
// setupApiRoute(router, 'delete', '/:roomId/:mid', [...middlewares, middleware.assert.room], controllers.write.chats.messages.delete);
|
||||||
|
|
||||||
return router;
|
return router;
|
||||||
|
|||||||
@@ -146,6 +146,8 @@ SocketModules.chats.leave = async function (socket, roomid) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketModules.chats.edit = async function (socket, data) {
|
SocketModules.chats.edit = async function (socket, data) {
|
||||||
|
sockets.warnDeprecated(socket, 'PUT /api/v3/chats/:roomId/:mid');
|
||||||
|
|
||||||
if (!data || !data.roomId || !data.message) {
|
if (!data || !data.roomId || !data.message) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,21 +151,18 @@ describe('Messaging Library', () => {
|
|||||||
await util.promisify(socketModules.chats.canMessage)({ uid: mocks.users.foo.uid }, roomId);
|
await util.promisify(socketModules.chats.canMessage)({ uid: mocks.users.foo.uid }, roomId);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should send a user-join system message when a chat room is created', (done) => {
|
it('should send a user-join system message when a chat room is created', async () => {
|
||||||
socketModules.chats.getMessages(
|
const { body } = await callv3API('get', `/chats/${roomId}`, {}, 'foo');
|
||||||
{ uid: mocks.users.foo.uid },
|
const { messages } = body.response;
|
||||||
{ uid: mocks.users.foo.uid, roomId: roomId, start: 0 },
|
|
||||||
(err, messages) => {
|
|
||||||
assert.ifError(err);
|
|
||||||
assert.equal(messages.length, 2);
|
assert.equal(messages.length, 2);
|
||||||
assert.strictEqual(messages[0].system, true);
|
assert.strictEqual(messages[0].system, true);
|
||||||
assert.strictEqual(messages[0].content, 'user-join');
|
assert.strictEqual(messages[0].content, 'user-join');
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, { roomId: roomId, mid: messages[0].messageId, message: 'test' }, (err) => {
|
|
||||||
assert.equal(err.message, '[[error:cant-edit-chat-message]]');
|
const { statusCode, body: body2 } = await callv3API('put', `/chats/${roomId}/${messages[0].messageId}`, {
|
||||||
done();
|
message: 'test',
|
||||||
});
|
}, 'foo');
|
||||||
}
|
assert.strictEqual(statusCode, 400);
|
||||||
);
|
assert.equal(body2.status.message, await translator.translate('[[error:cant-edit-chat-message]]'));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to add user to room with invalid data', (done) => {
|
it('should fail to add user to room with invalid data', (done) => {
|
||||||
@@ -637,42 +634,32 @@ describe('Messaging Library', () => {
|
|||||||
await socketModules.chats.leave({ uid: mocks.users.baz.uid }, roomId);
|
await socketModules.chats.leave({ uid: mocks.users.baz.uid }, roomId);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to edit message with invalid data', (done) => {
|
it('should fail to edit message with invalid data', async () => {
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, null, (err) => {
|
let { statusCode, body } = await callv3API('put', `/chats/1/10000`, { message: 'foo' }, 'foo');
|
||||||
assert.equal(err.message, '[[error:invalid-data]]');
|
assert.strictEqual(statusCode, 400);
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, { roomId: null }, (err) => {
|
assert.strictEqual(body.status.message, await translator.translate('[[error:invalid-mid]]'));
|
||||||
assert.equal(err.message, '[[error:invalid-data]]');
|
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, { roomId: 1, message: null }, (err) => {
|
({ statusCode, body } = await callv3API('put', `/chats/${roomId}/${mid}`, {}, 'foo'));
|
||||||
assert.equal(err.message, '[[error:invalid-data]]');
|
assert.strictEqual(statusCode, 400);
|
||||||
done();
|
assert.strictEqual(body.status.message, await translator.translate('[[error:invalid-chat-message]]'));
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to edit message if new content is empty string', (done) => {
|
it('should fail to edit message if new content is empty string', async () => {
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, { mid: mid, roomId: roomId, message: ' ' }, (err) => {
|
const { statusCode, body } = await callv3API('put', `/chats/${roomId}/${mid}`, { message: ' ' }, 'foo');
|
||||||
assert.equal(err.message, '[[error:invalid-chat-message]]');
|
assert.strictEqual(statusCode, 400);
|
||||||
done();
|
assert.strictEqual(body.status.message, await translator.translate('[[error:invalid-chat-message]]'));
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to edit message if not own message', (done) => {
|
it('should fail to edit message if not own message', async () => {
|
||||||
socketModules.chats.edit({ uid: mocks.users.herp.uid }, { mid: mid, roomId: roomId, message: 'message edited' }, (err) => {
|
const { statusCode, body } = await callv3API('put', `/chats/${roomId}/${mid}`, { message: 'message edited' }, 'herp');
|
||||||
assert.equal(err.message, '[[error:cant-edit-chat-message]]');
|
assert.strictEqual(statusCode, 400);
|
||||||
done();
|
assert.strictEqual(body.status.message, await translator.translate('[[error:cant-edit-chat-message]]'));
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit message', (done) => {
|
it('should edit message', async () => {
|
||||||
socketModules.chats.edit({ uid: mocks.users.foo.uid }, { mid: mid, roomId: roomId, message: 'message edited' }, (err) => {
|
const { statusCode, body } = await callv3API('put', `/chats/${roomId}/${mid}`, { message: 'message edited' }, 'foo');
|
||||||
assert.ifError(err);
|
assert.strictEqual(statusCode, 200);
|
||||||
socketModules.chats.getRaw({ uid: mocks.users.foo.uid }, { mid: mid }, (err, raw) => {
|
assert.strictEqual(body.response.content, 'message edited');
|
||||||
assert.ifError(err);
|
|
||||||
assert.equal(raw, 'message edited');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fail to delete message with invalid data', (done) => {
|
it('should fail to delete message with invalid data', (done) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user