Skip to content

Commit

Permalink
[IMPROVE] Replace snippetedMessage publication by REST (RocketChat#15679
Browse files Browse the repository at this point in the history
)
  • Loading branch information
MarcosSpessatto authored and ggazzo committed Oct 30, 2019
1 parent 8cd87f3 commit 8bbc9cc
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 11 deletions.
31 changes: 31 additions & 0 deletions app/api/server/lib/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,42 @@ export async function findStarredMessages({ uid, roomId, pagination: { offset, c
};
}

export async function findSnippetedMessageById({ uid, messageId }) {
if (!await getValue('Message_AllowSnippeting')) {
throw new Error('error-not-allowed');
}

if (!uid) {
throw new Error('invalid-user');
}

const snippet = await Messages.findOne({ _id: messageId, snippeted: true });

if (!snippet) {
throw new Error('invalid-message');
}

const room = await Rooms.findOneById(snippet.rid);

if (!room) {
throw new Error('invalid-message');
}

if (!await canAccessRoomAsync(room, { _id: uid })) {
throw new Error('error-not-allowed');
}

return {
message: snippet,
};
}

export async function findSnippetedMessages({ uid, roomId, pagination: { offset, count, sort } }) {
if (!await getValue('Message_AllowSnippeting')) {
throw new Error('error-not-allowed');
}
const room = await Rooms.findOneById(roomId);

if (!await canAccessRoomAsync(room, { _id: uid })) {
throw new Error('error-not-allowed');
}
Expand Down
16 changes: 15 additions & 1 deletion app/api/server/v1/chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { API } from '../api';
import Rooms from '../../../models/server/models/Rooms';
import Users from '../../../models/server/models/Users';
import { settings } from '../../../settings';
import { findMentionedMessages, findStarredMessages, findSnippetedMessages } from '../lib/messages';
import { findMentionedMessages, findStarredMessages, findSnippetedMessageById, findSnippetedMessages } from '../lib/messages';

API.v1.addRoute('chat.delete', { authRequired: true }, {
post() {
Expand Down Expand Up @@ -644,6 +644,20 @@ API.v1.addRoute('chat.getStarredMessages', { authRequired: true }, {
},
});

API.v1.addRoute('chat.getSnippetedMessageById', { authRequired: true }, {
get() {
const { messageId } = this.queryParams;

if (!messageId) {
throw new Meteor.Error('error-invalid-params', 'The required "messageId" query param is missing.');
}
const message = Promise.await(findSnippetedMessageById({
uid: this.userId,
messageId,
}));
return API.v1.success(message);
},
});

API.v1.addRoute('chat.getSnippetedMessages', { authRequired: true }, {
get() {
Expand Down
21 changes: 11 additions & 10 deletions app/message-snippet/client/page/snippetPage.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { Meteor } from 'meteor/meteor';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { ReactiveVar } from 'meteor/reactive-var';
import { Template } from 'meteor/templating';
import moment from 'moment';

import { DateFormat } from '../../../lib';
import { settings } from '../../../settings';
import { Markdown } from '../../../markdown/client';
import { SnippetedMessages } from '../lib/collections';
import { APIClient } from '../../../utils/client';

Template.snippetPage.helpers({
snippet() {
return SnippetedMessages.findOne({ _id: FlowRouter.getParam('snippetId') });
return Template.instance().message.get();
},
snippetContent() {
const message = SnippetedMessages.findOne({ _id: FlowRouter.getParam('snippetId') });
const message = Template.instance().message.get();
if (message === undefined) {
return null;
}
Expand All @@ -22,22 +22,23 @@ Template.snippetPage.helpers({
return markdown.tokens[0].text;
},
date() {
const snippet = SnippetedMessages.findOne({ _id: FlowRouter.getParam('snippetId') });
const snippet = Template.instance().message.get();
if (snippet !== undefined) {
return moment(snippet.ts).format(settings.get('Message_DateFormat'));
}
},
time() {
const snippet = SnippetedMessages.findOne({ _id: FlowRouter.getParam('snippetId') });
const snippet = Template.instance().message.get();
if (snippet !== undefined) {
return DateFormat.formatTime(snippet.ts);
}
},
});

Template.snippetPage.onCreated(function() {
Template.snippetPage.onCreated(async function() {
const snippetId = FlowRouter.getParam('snippetId');
this.autorun(function() {
Meteor.subscribe('snippetedMessage', snippetId);
});
this.message = new ReactiveVar({});

const { message } = await APIClient.v1.get(`chat.getSnippetedMessageById?messageId=${ snippetId }`);
this.message.set(message);
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Meteor } from 'meteor/meteor';
import { Messages, Users, Rooms } from '../../../models';

Meteor.publish('snippetedMessage', function(_id) {
console.warn('The publication "snippetedMessage" is deprecated and will be removed after version v3.0.0');
if (typeof this.userId === 'undefined' || this.userId === null) {
return this.ready();
}
Expand Down
41 changes: 41 additions & 0 deletions tests/end-to-end/api/05-chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -2159,6 +2159,35 @@ describe('Threads', () => {
});
});

describe('[/chat.getSnippetedMessageById]', () => {
it('should return an error when the snippeted messages is disabled', (done) => {
updateSetting('Message_AllowSnippeting', false).then(() => {
request.get(api('chat.getSnippetedMessageById?messageId=invalid-id'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(400)
.expect((res) => {
expect(res.body).to.have.property('success', false);
expect(res.body.error).to.be.equal('error-not-allowed');
})
.end(done);
});
});
it('should return an error when the required "messageId" parameter is not sent', (done) => {
updateSetting('Message_AllowSnippeting', true).then(() => {
request.get(api('chat.getSnippetedMessageById'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(400)
.expect((res) => {
expect(res.body).to.have.property('success', false);
expect(res.body.errorType).to.be.equal('error-invalid-params');
})
.end(done);
});
});
});

describe('[/chat.getSnippetedMessages]', () => {
it('should return an error when the required "roomId" parameter is not sent', (done) => {
request.get(api('chat.getSnippetedMessages'))
Expand Down Expand Up @@ -2214,5 +2243,17 @@ describe('Threads', () => {
.end(done);
});
});

it('should return an error when the messageId is invalid', (done) => {
request.get(api('chat.getSnippetedMessageById?messageId=invalid-id'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(400)
.expect((res) => {
expect(res.body).to.have.property('success', false);
expect(res.body.error).to.be.equal('invalid-message');
})
.end(done);
});
});
});

0 comments on commit 8bbc9cc

Please sign in to comment.