From 0122e2a3431e0eaabe4e6a7c78b3c1b8f2c1db2e Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Mon, 2 Apr 2018 10:59:18 -0500 Subject: [PATCH 01/12] Add support for more listeners and reorder the calling stack on sendMessage --- packages/rocketchat-apps/package.js | 2 +- .../server/bridges/listeners.js | 28 +++++++++++++++++-- .../server/functions/sendMessage.js | 26 ++++++++++------- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index 588f97d1faad..fd704616bd67 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.4.8', + '@rocket.chat/apps-engine': '0.4.11', '@rocket.chat/apps-ts-definition': '0.7.15' }); diff --git a/packages/rocketchat-apps/server/bridges/listeners.js b/packages/rocketchat-apps/server/bridges/listeners.js index 8577310c71f3..ecace02cbdbd 100644 --- a/packages/rocketchat-apps/server/bridges/listeners.js +++ b/packages/rocketchat-apps/server/bridges/listeners.js @@ -5,11 +5,35 @@ export class AppListenerBridge { messageEvent(inte, message) { const msg = this.orch.getConverters().get('messages').convertMessage(message); - return this.orch.getManager().getListenerManager().executeListener(inte, msg); + const result = this.orch.getManager().getListenerManager().executeListener(inte, msg); + + if (typeof result === 'boolean') { + return result; + } else { + return this.orch.getConverters().get('messages').convertAppMessage(result); + } + // try { + + // } catch (e) { + // console.log(`${ e.name }: ${ e.message }`); + // console.log(e.stack); + // } } roomEvent(inte, room) { const rm = this.orch.getConverters().get('rooms').convertRoom(room); - return this.orch.getManager().getListenerManager().executeListener(inte, rm); + const result = this.orch.getManager().getListenerManager().executeListener(inte, rm); + + if (typeof result === 'boolean') { + return result; + } else { + return this.orch.getConverters().get('rooms').convertAppRoom(result); + } + // try { + + // } catch (e) { + // console.log(`${ e.name }: ${ e.message }`); + // console.log(e.stack); + // } } } diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index baf979687e52..ac9e7281de1c 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -41,6 +41,22 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { message.unread = true; } + // For the Rocket.Chat Apps :) + if (message && Apps && Apps.isLoaded()) { + const prevent = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message); + if (prevent) { + return false; + } + + let result; + result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentExtend', message); + result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', message); + + if (typeof result === 'object') { + message = result; + } + } + message = RocketChat.callbacks.run('beforeSaveMessage', message); if (message) { // Avoid saving sandstormSessionId to the database @@ -50,16 +66,6 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { delete message.sandstormSessionId; } - // For the Rocket.Chat Apps :) - if (Apps && Apps.isLoaded()) { - const prevent = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message); - if (prevent) { - return false; - } - - // TODO: The rest of the IPreMessageSent events - } - if (message._id && upsert) { const _id = message._id; delete message._id; From 3875a98d7bff0340fe7a0b1245dd3e97d0890af5 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Mon, 2 Apr 2018 15:29:56 -0500 Subject: [PATCH 02/12] Improve the message converters and fix message listeners --- packages/rocketchat-apps/server/converters/messages.js | 8 ++++++++ packages/rocketchat-lib/server/functions/sendMessage.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js index 2c957ddafb4e..7430ced89ac1 100644 --- a/packages/rocketchat-apps/server/converters/messages.js +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -108,6 +108,14 @@ export class AppMessagesConverter { video_url: attachment.videoUrl, fields: attachment.fields }; + }).map((a) => { + Object.keys(a).forEach((k) => { + if (typeof a[k] === 'undefined') { + delete a[k]; + } + }); + + return a; }); } diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index ac9e7281de1c..2aaba9c17e00 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -50,7 +50,7 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { let result; result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentExtend', message); - result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', message); + result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', result); if (typeof result === 'object') { message = result; From b7dda74ed459ee8e8a1bfb935eb8506979188a76 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Wed, 4 Apr 2018 16:52:50 -0500 Subject: [PATCH 03/12] Allow updating of an app. Add buttons to view logs and update app. Fix various issues related to the apps --- packages/rocketchat-apps/README.md | 2 +- .../client/admin/appInstall.js | 24 +++++++- .../client/admin/appManage.html | 4 +- .../rocketchat-apps/client/admin/appManage.js | 6 +- .../server/communication/rest.js | 37 +++++++----- .../server/converters/messages.js | 19 +++--- .../server/functions/createRoom.js | 58 ++++++++++++------- .../server/functions/sendMessage.js | 28 ++++----- .../rocketchat-lib/server/models/Rooms.js | 7 +++ 9 files changed, 123 insertions(+), 62 deletions(-) diff --git a/packages/rocketchat-apps/README.md b/packages/rocketchat-apps/README.md index 65b130d4c5d7..e314d30598d2 100644 --- a/packages/rocketchat-apps/README.md +++ b/packages/rocketchat-apps/README.md @@ -8,4 +8,4 @@ An orchestrator is the file/class which is responsible for orchestrating (starti A bridge is a file/class which is responsible for bridging the Rocket.Chat system's data and the App system's data. They are implementations of the interfaces inside of the Rocket.Chat Apps-engine project `src/server/bridges`. They allow the two systems to talk to each other (hince the name bridge, as they "bridge the gap"). ## What is a "Converter"? -A converter does what the name implies, it handles converting from one system's data type into the other's. +A converter does what the name implies, it handles converting from one system's data type into the other's. **Note**: This causes a schema to be forced on the rooms and messages. diff --git a/packages/rocketchat-apps/client/admin/appInstall.js b/packages/rocketchat-apps/client/admin/appInstall.js index fc0caa695f37..f41dcb84401b 100644 --- a/packages/rocketchat-apps/client/admin/appInstall.js +++ b/packages/rocketchat-apps/client/admin/appInstall.js @@ -29,12 +29,17 @@ Template.appInstall.onCreated(function() { instance.file = new ReactiveVar(''); instance.isInstalling = new ReactiveVar(false); instance.appUrl = new ReactiveVar(''); + instance.isUpdatingId = new ReactiveVar(''); // Allow passing in a url as a query param to show installation of if (FlowRouter.getQueryParam('url')) { instance.appUrl.set(FlowRouter.getQueryParam('url')); FlowRouter.setQueryParams({ url: null }); } + + if (FlowRouter.getQueryParam('isUpdatingId')) { + instance.isUpdatingId.set(FlowRouter.getQueryParam('isUpdatingId')); + } }); Template.appInstall.events({ @@ -55,13 +60,21 @@ Template.appInstall.events({ if (url) { try { t.isInstalling.set(true); - const result = await RocketChat.API.post('apps', { url }); + let result; + + if (t.isUpdatingId.get()) { + result = await RocketChat.API.post(`apps/${ t.isUpdatingId.get() }`, { url }); + } else { + result = await RocketChat.API.post('apps', { url }); + } + FlowRouter.go(`/admin/apps/${ result.app.id }`); } catch (err) { console.warn('err', err); } finally { t.isInstalling.set(false); } + return; } @@ -85,7 +98,14 @@ Template.appInstall.events({ t.isInstalling.set(true); try { - const result = await RocketChat.API.upload('apps', data); + let result; + + if (t.isUpdatingId.get()) { + result = await RocketChat.API.upload(`apps/${ t.isUpdatingId.get() }`, data); + } else { + result = await RocketChat.API.upload('apps', data); + } + FlowRouter.go(`/admin/apps/${ result.app.id }`); } catch (err) { console.warn('err', err); diff --git a/packages/rocketchat-apps/client/admin/appManage.html b/packages/rocketchat-apps/client/admin/appManage.html index e9003525e4e8..3c67940499b5 100644 --- a/packages/rocketchat-apps/client/admin/appManage.html +++ b/packages/rocketchat-apps/client/admin/appManage.html @@ -24,7 +24,7 @@
{{name}}
-
v {{version}}
+
v{{version}}
{{description}}
@@ -236,6 +236,8 @@ + +
{{else if hasError}} diff --git a/packages/rocketchat-apps/client/admin/appManage.js b/packages/rocketchat-apps/client/admin/appManage.js index 9014c3cea822..707e1d6b2317 100644 --- a/packages/rocketchat-apps/client/admin/appManage.js +++ b/packages/rocketchat-apps/client/admin/appManage.js @@ -183,7 +183,11 @@ Template.appManage.events({ }); }, - 'click .logs': (e, t) => { + 'click .js-update': (e, t) => { + FlowRouter.go(`/admin/app/install?isUpdatingId=${ t.id.get() }`); + }, + + 'click .js-view-logs': (e, t) => { FlowRouter.go(`/admin/apps/${ t.id.get() }/logs`); }, diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js index 972466d32a47..72caf41238c0 100644 --- a/packages/rocketchat-apps/server/communication/rest.js +++ b/packages/rocketchat-apps/server/communication/rest.js @@ -71,15 +71,10 @@ export class AppsRestApi { return RocketChat.API.v1.failure({ error: 'Failed to get a file to install for the App. '}); } - const item = Meteor.wrapAsync((callback) => { - manager.add(buff.toString('base64'), false).then((rl) => callback(undefined, rl)).catch((e) => { - console.warn('Error!', e); - callback(e); - }); - })(); + const prl = Promise.await(manager.add(buff.toString('base64'), false)); - const info = item.getInfo(); - info.status = item.getStatus(); + const info = prl.getInfo(); + info.status = prl.getStatus(); return RocketChat.API.v1.success({ app: info }); } @@ -116,13 +111,27 @@ export class AppsRestApi { console.log('Updating:', this.urlParams.id); // TODO: Verify permissions - const buff = fileHandler(this.request, 'app'); - const item = Meteor.wrapAsync((callback) => { - manager.update(buff.toString('base64')).then((rl) => callback(rl)).catch((e) => callback(e)); - }); + let buff; + + if (this.bodyParams.url) { + const result = HTTP.call('GET', this.bodyParams.url, { npmRequestOptions: { encoding: 'base64' }}); + + if (result.statusCode !== 200 || !result.headers['content-type'] || result.headers['content-type'] !== 'application/zip') { + return RocketChat.API.v1.failure({ error: 'Invalid url. It doesn\'t exist or is not "application/zip".' }); + } + + buff = Buffer.from(result.content, 'base64'); + } else { + buff = fileHandler(this.request, 'app'); + } + + if (!buff) { + return RocketChat.API.v1.failure({ error: 'Failed to get a file to install for the App. '}); + } - const info = item.getInfo(); - info.status = item.getStatus(); + const prl = Promise.await(manager.update(buff.toString('base64'))); + const info = prl.getInfo(); + info.status = prl.getStatus(); return RocketChat.API.v1.success({ app: info }); }, diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js index 7430ced89ac1..7e34668728fe 100644 --- a/packages/rocketchat-apps/server/converters/messages.js +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -47,10 +47,18 @@ export class AppMessagesConverter { } const room = RocketChat.models.Rooms.findOneById(message.room.id); - const user = RocketChat.models.Users.findOneById(message.sender.id); - if (!room || !user) { - throw new Error('Invalid user or room provided on the message.'); + if (!room) { + throw new Error('Invalid room provided on the message.'); + } + + let u; + if (message.sender && message.sender.id) { + const user = RocketChat.models.Users.findOneById(message.sender.id); + u = { + _id: user._id, + username: user.username + }; } let editedBy; @@ -67,10 +75,7 @@ export class AppMessagesConverter { return { _id: message.id || Random.id(), rid: room._id, - u: { - _id: user._id, - username: user.username - }, + u, msg: message.text, ts: message.createdAt || new Date(), _updatedAt: message.updatedAt || new Date(), diff --git a/packages/rocketchat-lib/server/functions/createRoom.js b/packages/rocketchat-lib/server/functions/createRoom.js index 386680e6b797..64626cbed5b9 100644 --- a/packages/rocketchat-lib/server/functions/createRoom.js +++ b/packages/rocketchat-lib/server/functions/createRoom.js @@ -16,36 +16,46 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData throw new Meteor.Error('error-invalid-user', 'Invalid user', { function: 'RocketChat.createRoom' }); } - const slugifiedRoomName = RocketChat.getValidRoomName(name); - - const now = new Date(); if (!_.contains(members, owner.username)) { members.push(owner.username); } - if (type === 'c') { - RocketChat.callbacks.run('beforeCreateChannel', owner, { - t: 'c', - name: slugifiedRoomName, - fname: name, - ts: now, - ro: readOnly === true, - sysMes: readOnly !== true, - usernames: members, - u: { - _id: owner._id, - username: owner.username - } - }); - } - - extraData = Object.assign({}, extraData, { + const now = new Date(); + let room = Object.assign({ + name, + fname: RocketChat.getValidRoomName(name), + t: type, + usernames: members, + u: { + _id: owner._id, + username: owner.username + } + }, extraData, { ts: now, ro: readOnly === true, sysMes: readOnly !== true }); - const room = RocketChat.models.Rooms.createWithTypeNameUserAndUsernames(type, slugifiedRoomName, name, owner, members, extraData); + if (Apps && Apps.isLoaded()) { + const prevent = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreatePrevent', room); + if (prevent) { + throw new Meteor.Error('error-app-prevented-creation', 'A Rocket.Chat App prevented the room creation.'); + } + + let result; + result = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateExtend', room); + result = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateModify', result); + + if (typeof result === 'object') { + room = Object.assign(room, result); + } + } + + if (type === 'c') { + RocketChat.callbacks.run('beforeCreateChannel', owner, room); + } + + room = RocketChat.models.Rooms.createWithFullRoomData(room); for (const username of members) { const member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }}); @@ -79,8 +89,12 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData }); } + if (Apps && Apps.isLoaded()) { + Apps.getBridges().getListenerBridge().roomEvent('IPostRoomCreate', room); + } + return { rid: room._id, - name: slugifiedRoomName + name: room.fname }; }; diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index 2aaba9c17e00..308d68d0b7b5 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -25,18 +25,6 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { } } - if (message.parseUrls !== false) { - const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g); - - if (urls) { - message.urls = urls.map(function(url) { - return { - url - }; - }); - } - } - if (RocketChat.settings.get('Message_Read_Receipt_Enabled')) { message.unread = true; } @@ -45,7 +33,7 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { if (message && Apps && Apps.isLoaded()) { const prevent = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message); if (prevent) { - return false; + throw new Meteor.Error('error-app-prevented-sending', 'A Rocket.Chat App prevented the messaging sending.'); } let result; @@ -53,7 +41,19 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', result); if (typeof result === 'object') { - message = result; + message = Object.assign(message, result); + } + } + + if (message.parseUrls) { + const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g); + + if (urls) { + message.urls = urls.map(function(url) { + return { + url + }; + }); } } diff --git a/packages/rocketchat-lib/server/models/Rooms.js b/packages/rocketchat-lib/server/models/Rooms.js index cc7806c8e152..00eecb9685db 100644 --- a/packages/rocketchat-lib/server/models/Rooms.js +++ b/packages/rocketchat-lib/server/models/Rooms.js @@ -800,6 +800,13 @@ class ModelRooms extends RocketChat.models._Base { return room; } + createWithFullRoomData(room) { + delete room._id; + + room._id = this.insert(room); + return room; + } + // REMOVE removeById(_id) { From 8e1407f777d2c123beb37046828604368a9ae0f8 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Wed, 4 Apr 2018 16:55:07 -0500 Subject: [PATCH 04/12] Whoops, name instead of fname for rooms returned name --- packages/rocketchat-lib/server/functions/createRoom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-lib/server/functions/createRoom.js b/packages/rocketchat-lib/server/functions/createRoom.js index 64626cbed5b9..1b3926883270 100644 --- a/packages/rocketchat-lib/server/functions/createRoom.js +++ b/packages/rocketchat-lib/server/functions/createRoom.js @@ -95,6 +95,6 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData return { rid: room._id, - name: room.fname + name: room.name }; }; From 57d7f2d816dcb0b9bf40fcb2b8a0d5c46893f49d Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Wed, 4 Apr 2018 16:59:51 -0500 Subject: [PATCH 05/12] Bump the versions of the Rocket.Chat Apps system --- packages/rocketchat-apps/package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index fd704616bd67..cf02072b6106 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.4.11', - '@rocket.chat/apps-ts-definition': '0.7.15' + '@rocket.chat/apps-engine': '0.4.12', + '@rocket.chat/apps-ts-definition': '0.7.16' }); From 2337f440b03fb2f20b5af59d8a5debf229c1fe97 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Thu, 5 Apr 2018 14:54:56 -0500 Subject: [PATCH 06/12] Add the missing 'msgs' property on rooms back --- packages/rocketchat-lib/server/functions/createRoom.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rocketchat-lib/server/functions/createRoom.js b/packages/rocketchat-lib/server/functions/createRoom.js index 1b3926883270..a9656aa56586 100644 --- a/packages/rocketchat-lib/server/functions/createRoom.js +++ b/packages/rocketchat-lib/server/functions/createRoom.js @@ -25,6 +25,7 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData name, fname: RocketChat.getValidRoomName(name), t: type, + msgs: 0, usernames: members, u: { _id: owner._id, From 7c5a2d26c4b2f96143c0348dd1f95d2aa634cc54 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Thu, 5 Apr 2018 16:24:44 -0500 Subject: [PATCH 07/12] Fix the sendMessage parseUrls not correctly being checked --- packages/rocketchat-lib/server/functions/sendMessage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index 308d68d0b7b5..8cf7c8fff244 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -45,7 +45,7 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { } } - if (message.parseUrls) { + if (message.parseUrls !== false) { const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g); if (urls) { From 0f8bf47cb6fa915dca8e64e1f5cb68614464127f Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Fri, 6 Apr 2018 12:59:47 -0500 Subject: [PATCH 08/12] Update the apps dependencies and use the new property on message attachments --- packages/rocketchat-apps/package.js | 4 ++-- packages/rocketchat-apps/server/converters/messages.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index cf02072b6106..9d35f69b6e45 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.4.12', - '@rocket.chat/apps-ts-definition': '0.7.16' + '@rocket.chat/apps-engine': '0.4.13', + '@rocket.chat/apps-ts-definition': '0.8.0' }); diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js index 7e34668728fe..423fce5a35bc 100644 --- a/packages/rocketchat-apps/server/converters/messages.js +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -107,7 +107,7 @@ export class AppMessagesConverter { author_icon: attachment.author ? attachment.author.icon : undefined, title: attachment.title ? attachment.title.value : undefined, title_link: attachment.title ? attachment.title.link : undefined, - title_link_download: attachment.title ? attachment.title.downloadLink : undefined, + title_link_download: attachment.title ? attachment.title.displayDownloadLink : undefined, image_url: attachment.imageUrl, audio_url: attachment.audioUrl, video_url: attachment.videoUrl, @@ -144,7 +144,7 @@ export class AppMessagesConverter { title = { value: attachment.title, link: attachment.title_link, - downloadLink: attachment.title_link_download + displayDownloadLink: attachment.title_link_download }; } From c80c7357bdca7d2a4d512fb9be6e552159190bf6 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Mon, 16 Apr 2018 15:39:30 -0500 Subject: [PATCH 09/12] Convert over to using the promises everywhere --- .../rocketchat-apps/client/admin/appLogs.js | 10 ++-- .../client/admin/appManage.html | 4 +- .../rocketchat-apps/client/admin/appManage.js | 2 +- .../rocketchat-apps/client/admin/apps.html | 10 ++-- packages/rocketchat-apps/client/admin/apps.js | 3 ++ packages/rocketchat-apps/package.js | 4 +- .../server/bridges/activation.js | 16 +++--- .../server/bridges/environmental.js | 6 +-- .../rocketchat-apps/server/bridges/http.js | 10 ++-- .../server/bridges/listeners.js | 8 +-- .../server/bridges/messages.js | 19 +++---- .../server/bridges/persistence.js | 16 +++--- .../rocketchat-apps/server/bridges/rooms.js | 8 +-- .../server/bridges/settings.js | 12 ++--- .../rocketchat-apps/server/bridges/users.js | 4 +- .../server/communication/rest.js | 27 ++++++---- .../server/communication/websockets.js | 52 ++++++++++--------- .../rocketchat-apps/server/orchestrator.js | 2 +- packages/rocketchat-i18n/i18n/en.i18n.json | 12 +++++ .../server/functions/createRoom.js | 8 +-- .../server/functions/sendMessage.js | 8 +-- 21 files changed, 133 insertions(+), 108 deletions(-) diff --git a/packages/rocketchat-apps/client/admin/appLogs.js b/packages/rocketchat-apps/client/admin/appLogs.js index 94071b3564c3..3a2eac8043f3 100644 --- a/packages/rocketchat-apps/client/admin/appLogs.js +++ b/packages/rocketchat-apps/client/admin/appLogs.js @@ -59,13 +59,17 @@ Template.appLogs.helpers({ return moment(date).format('L LTS'); }, jsonStringify(data) { + let value = ''; + if (!data) { - return ''; + return value; } else if (typeof data === 'object') { - return hljs.highlight('json', JSON.stringify(data, null, 2)).value; + value = hljs.highlight('json', JSON.stringify(data, null, 2)).value; } else { - return hljs.highlight('json', data).value; + value = hljs.highlight('json', data).value; } + + return value.replace(/\\\\n/g, '
'); } }); diff --git a/packages/rocketchat-apps/client/admin/appManage.html b/packages/rocketchat-apps/client/admin/appManage.html index 79f069b7917e..1bacc0d9cf81 100644 --- a/packages/rocketchat-apps/client/admin/appManage.html +++ b/packages/rocketchat-apps/client/admin/appManage.html @@ -37,13 +37,13 @@ {{#if author.homepage}} {{> icon icon='permalink'}} - author homepage + {{_ "App_author_homepage"}} {{/if}} {{#if author.support}} {{> icon icon='at'}} - support url + {{_ "App_support_url"}} {{/if}} diff --git a/packages/rocketchat-apps/client/admin/appManage.js b/packages/rocketchat-apps/client/admin/appManage.js index 49dc1128133f..b39022f97e13 100644 --- a/packages/rocketchat-apps/client/admin/appManage.js +++ b/packages/rocketchat-apps/client/admin/appManage.js @@ -20,7 +20,7 @@ Template.appManage.onCreated(function() { function _morphSettings(settings) { Object.keys(settings).forEach((k) => { settings[k].i18nPlaceholder = settings[k].i18nPlaceholder || ' '; - settings[k].value = settings[k].value !== undefined ? settings[k].value : settings[k].packageValue; + settings[k].value = settings[k].value !== undefined && settings[k].value !== null ? settings[k].value : settings[k].packageValue; settings[k].oldValue = settings[k].value; settings[k].hasChanged = false; }); diff --git a/packages/rocketchat-apps/client/admin/apps.html b/packages/rocketchat-apps/client/admin/apps.html index 31022e02d319..560d3685c2af 100644 --- a/packages/rocketchat-apps/client/admin/apps.html +++ b/packages/rocketchat-apps/client/admin/apps.html @@ -9,9 +9,9 @@ - - - + + + @@ -33,7 +33,7 @@ {{/each}} diff --git a/packages/rocketchat-apps/client/admin/apps.js b/packages/rocketchat-apps/client/admin/apps.js index 9582e1e494ab..ba009f1b2220 100644 --- a/packages/rocketchat-apps/client/admin/apps.js +++ b/packages/rocketchat-apps/client/admin/apps.js @@ -54,6 +54,9 @@ Template.apps.helpers({ }, apps() { return Template.instance().apps.get(); + }, + parseStatus(status) { + return t(`App_status_${ status }`); } }); diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index 9d35f69b6e45..fc2652dc9d31 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.4.13', - '@rocket.chat/apps-ts-definition': '0.8.0' + '@rocket.chat/apps-engine': '0.5.10', + '@rocket.chat/apps-ts-definition': '0.9.5' }); diff --git a/packages/rocketchat-apps/server/bridges/activation.js b/packages/rocketchat-apps/server/bridges/activation.js index b15bcc0c4e24..30983357bdff 100644 --- a/packages/rocketchat-apps/server/bridges/activation.js +++ b/packages/rocketchat-apps/server/bridges/activation.js @@ -3,19 +3,19 @@ export class AppActivationBridge { this.orch = orch; } - appAdded(app) { - this.orch.getNotifier().appAdded(app.getID()); + async appAdded(app) { + await this.orch.getNotifier().appAdded(app.getID()); } - appUpdated(app) { - this.orch.getNotifier().appUpdated(app.getID()); + async appUpdated(app) { + await this.orch.getNotifier().appUpdated(app.getID()); } - appRemoved(app) { - this.orch.getNotifier().appRemoved(app.getID()); + async appRemoved(app) { + await this.orch.getNotifier().appRemoved(app.getID()); } - appStatusChanged(app, status) { - this.orch.getNotifier().appStatusUpdated(app.getID(), status); + async appStatusChanged(app, status) { + await this.orch.getNotifier().appStatusUpdated(app.getID(), status); } } diff --git a/packages/rocketchat-apps/server/bridges/environmental.js b/packages/rocketchat-apps/server/bridges/environmental.js index d175037fc3e2..2cf4a47715be 100644 --- a/packages/rocketchat-apps/server/bridges/environmental.js +++ b/packages/rocketchat-apps/server/bridges/environmental.js @@ -4,7 +4,7 @@ export class AppEnvironmentalVariableBridge { this.allowed = ['NODE_ENV', 'ROOT_URL', 'INSTANCE_IP']; } - getValueByName(envVarName, appId) { + async getValueByName(envVarName, appId) { console.log(`The App ${ appId } is getting the environmental variable value ${ envVarName }.`); if (this.isReadable(envVarName, appId)) { @@ -14,13 +14,13 @@ export class AppEnvironmentalVariableBridge { throw new Error(`The environmental variable "${ envVarName }" is not readable.`); } - isReadable(envVarName, appId) { + async isReadable(envVarName, appId) { console.log(`The App ${ appId } is checking if the environmental variable is readable ${ envVarName }.`); return this.allowed.includes(envVarName.toUpperCase()); } - isSet(envVarName, appId) { + async isSet(envVarName, appId) { console.log(`The App ${ appId } is checking if the environmental variable is set ${ envVarName }.`); if (this.isReadable(envVarName, appId)) { diff --git a/packages/rocketchat-apps/server/bridges/http.js b/packages/rocketchat-apps/server/bridges/http.js index 23853301b6c4..1632b093ba27 100644 --- a/packages/rocketchat-apps/server/bridges/http.js +++ b/packages/rocketchat-apps/server/bridges/http.js @@ -6,10 +6,10 @@ export class AppHttpBridge { console.log(`The App ${ info.appId } is requesting from the outter webs:`, info); - try { - return HTTP.call(info.method, info.url, info.request); - } catch (e) { - return e.response; - } + return new Promise((resolve, reject) => { + HTTP.call(info.method, info.url, info.request, (e, result) => { + return e ? reject(e.response) : resolve(result); + }); + }); } } diff --git a/packages/rocketchat-apps/server/bridges/listeners.js b/packages/rocketchat-apps/server/bridges/listeners.js index ecace02cbdbd..d62edfcf0f07 100644 --- a/packages/rocketchat-apps/server/bridges/listeners.js +++ b/packages/rocketchat-apps/server/bridges/listeners.js @@ -3,9 +3,9 @@ export class AppListenerBridge { this.orch = orch; } - messageEvent(inte, message) { + async messageEvent(inte, message) { const msg = this.orch.getConverters().get('messages').convertMessage(message); - const result = this.orch.getManager().getListenerManager().executeListener(inte, msg); + const result = await this.orch.getManager().getListenerManager().executeListener(inte, msg); if (typeof result === 'boolean') { return result; @@ -20,9 +20,9 @@ export class AppListenerBridge { // } } - roomEvent(inte, room) { + async roomEvent(inte, room) { const rm = this.orch.getConverters().get('rooms').convertRoom(room); - const result = this.orch.getManager().getListenerManager().executeListener(inte, rm); + const result = await this.orch.getManager().getListenerManager().executeListener(inte, rm); if (typeof result === 'boolean') { return result; diff --git a/packages/rocketchat-apps/server/bridges/messages.js b/packages/rocketchat-apps/server/bridges/messages.js index 4e4c37f3813f..7fc5bc884a37 100644 --- a/packages/rocketchat-apps/server/bridges/messages.js +++ b/packages/rocketchat-apps/server/bridges/messages.js @@ -3,7 +3,7 @@ export class AppMessageBridge { this.orch = orch; } - create(message, appId) { + async create(message, appId) { console.log(`The App ${ appId } is creating a new message.`); let msg = this.orch.getConverters().get('messages').convertAppMessage(message); @@ -15,13 +15,13 @@ export class AppMessageBridge { return msg._id; } - getById(messageId, appId) { + async getById(messageId, appId) { console.log(`The App ${ appId } is getting the message: "${ messageId }"`); return this.orch.getConverters().get('messages').convertById(messageId); } - update(message, appId) { + async update(message, appId) { console.log(`The App ${ appId } is updating a message.`); if (!message.editor) { @@ -38,7 +38,7 @@ export class AppMessageBridge { RocketChat.updateMessage(msg, editor); } - notifyUser(user, message, appId) { + async notifyUser(user, message, appId) { console.log(`The App ${ appId } is notifying a user.`); const msg = this.orch.getConverters().get('messages').convertAppMessage(message); @@ -51,16 +51,9 @@ export class AppMessageBridge { })); } - notifyRoom(room, message, appId) { + async notifyRoom(room, message, appId) { console.log(`The App ${ appId } is notifying a room's users.`); - const msg = this.orch.getConverters().get('messages').convertAppMessage(message); - - RocketChat.Notifications.notifyUsersOfRoom(room.id, 'message', Object.assign(msg, { - _id: Random.id(), - ts: new Date(), - u: undefined, - editor: undefined - })); + throw new Error('Not implemented yet.'); } } diff --git a/packages/rocketchat-apps/server/bridges/persistence.js b/packages/rocketchat-apps/server/bridges/persistence.js index adc591788f44..fad093587fc7 100644 --- a/packages/rocketchat-apps/server/bridges/persistence.js +++ b/packages/rocketchat-apps/server/bridges/persistence.js @@ -3,13 +3,13 @@ export class AppPersistenceBridge { this.orch = orch; } - purge(appId) { + async purge(appId) { console.log(`The App's persistent storage is being purged: ${ appId }`); this.orch.getPersistenceModel().remove({ appId }); } - create(data, appId) { + async create(data, appId) { console.log(`The App ${ appId } is storing a new object in their persistence.`, data); if (typeof data !== 'object') { @@ -19,7 +19,7 @@ export class AppPersistenceBridge { return this.orch.getPersistenceModel().insert({ appId, data }); } - createWithAssociations(data, associations, appId) { + async createWithAssociations(data, associations, appId) { console.log(`The App ${ appId } is storing a new object in their persistence that is associated with some models.`, data, associations); if (typeof data !== 'object') { @@ -29,7 +29,7 @@ export class AppPersistenceBridge { return this.orch.getPersistenceModel().insert({ appId, associations, data }); } - readById(id, appId) { + async readById(id, appId) { console.log(`The App ${ appId } is reading their data in their persistence with the id: "${ id }"`); const record = this.orch.getPersistenceModel().findOneById(id); @@ -37,7 +37,7 @@ export class AppPersistenceBridge { return record.data; } - readByAssociations(associations, appId) { + async readByAssociations(associations, appId) { console.log(`The App ${ appId } is searching for records that are associated with the following:`, associations); const records = this.orch.getPersistenceModel().find({ @@ -48,7 +48,7 @@ export class AppPersistenceBridge { return Array.isArray(records) ? records.map((r) => r.data) : []; } - remove(id, appId) { + async remove(id, appId) { console.log(`The App ${ appId } is removing one of their records by the id: "${ id }"`); const record = this.orch.getPersistenceModel().findOne({ _id: id, appId }); @@ -62,7 +62,7 @@ export class AppPersistenceBridge { return record.data; } - removeByAssociations(associations, appId) { + async removeByAssociations(associations, appId) { console.log(`The App ${ appId } is removing records with the following associations:`, associations); const query = { @@ -83,7 +83,7 @@ export class AppPersistenceBridge { return Array.isArray(records) ? records.map((r) => r.data) : []; } - update(id, data, upsert, appId) { + async update(id, data, upsert, appId) { console.log(`The App ${ appId } is updating the record "${ id }" to:`, data); if (typeof data !== 'object') { diff --git a/packages/rocketchat-apps/server/bridges/rooms.js b/packages/rocketchat-apps/server/bridges/rooms.js index 85c4b946081e..28782d432940 100644 --- a/packages/rocketchat-apps/server/bridges/rooms.js +++ b/packages/rocketchat-apps/server/bridges/rooms.js @@ -5,7 +5,7 @@ export class AppRoomBridge { this.orch = orch; } - create(room, appId) { + async create(room, appId) { console.log(`The App ${ appId } is creating a new room.`, room); const rcRoom = this.orch.getConverters().get('rooms').convertAppRoom(room); @@ -31,19 +31,19 @@ export class AppRoomBridge { return rid; } - getById(roomId, appId) { + async getById(roomId, appId) { console.log(`The App ${ appId } is getting the roomById: "${ roomId }"`); return this.orch.getConverters().get('rooms').convertById(roomId); } - getByName(roomName, appId) { + async getByName(roomName, appId) { console.log(`The App ${ appId } is getting the roomByName: "${ roomName }"`); return this.orch.getConverters().get('rooms').convertByName(roomName); } - update(room, appId) { + async update(room, appId) { console.log(`The App ${ appId } is updating a room.`); if (!room.id || RocketChat.models.Rooms.findOneById(room.id)) { diff --git a/packages/rocketchat-apps/server/bridges/settings.js b/packages/rocketchat-apps/server/bridges/settings.js index 96e6ffd1a78e..2ae1bf6237e4 100644 --- a/packages/rocketchat-apps/server/bridges/settings.js +++ b/packages/rocketchat-apps/server/bridges/settings.js @@ -19,7 +19,7 @@ export class AppSettingBridge { ]; } - getAll(appId) { + async getAll(appId) { console.log(`The App ${ appId } is getting all the settings.`); return RocketChat.models.Settings.find({ _id: { $nin: this.disallowedSettings } }).fetch().map((s) => { @@ -27,7 +27,7 @@ export class AppSettingBridge { }); } - getOneById(id, appId) { + async getOneById(id, appId) { console.log(`The App ${ appId } is getting the setting by id ${ id }.`); if (!this.isReadableById(id, appId)) { @@ -37,13 +37,13 @@ export class AppSettingBridge { return this.orch.getConverters().get('settings').convertById(id); } - hideGroup(name, appId) { + async hideGroup(name, appId) { console.log(`The App ${ appId } is hidding the group ${ name }.`); throw new Error('Method not implemented.'); } - hideSetting(id, appId) { + async hideSetting(id, appId) { console.log(`The App ${ appId } is hidding the setting ${ id }.`); if (!this.isReadableById(id, appId)) { @@ -53,13 +53,13 @@ export class AppSettingBridge { throw new Error('Method not implemented.'); } - isReadableById(id, appId) { + async isReadableById(id, appId) { console.log(`The App ${ appId } is checking if they can read the setting ${ id }.`); return !this.disallowedSettings.includes(id); } - updateOne(setting, appId) { + async updateOne(setting, appId) { console.log(`The App ${ appId } is updating the setting ${ setting.id } .`); if (!this.isReadableById(setting.id, appId)) { diff --git a/packages/rocketchat-apps/server/bridges/users.js b/packages/rocketchat-apps/server/bridges/users.js index 5b4a2d07de42..94f4f6833c83 100644 --- a/packages/rocketchat-apps/server/bridges/users.js +++ b/packages/rocketchat-apps/server/bridges/users.js @@ -3,13 +3,13 @@ export class AppUserBridge { this.orch = orch; } - getById(userId, appId) { + async getById(userId, appId) { console.log(`The App ${ appId } is getting the userId: "${ userId }"`); return this.orch.getConverters().get('users').convertById(userId); } - getByUsername(username, appId) { + async getByUsername(username, appId) { console.log(`The App ${ appId } is getting the username: "${ username }"`); return this.orch.getConverters().get('users').convertByUsername(username); diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js index 72caf41238c0..d5414b1676c2 100644 --- a/packages/rocketchat-apps/server/communication/rest.js +++ b/packages/rocketchat-apps/server/communication/rest.js @@ -71,12 +71,15 @@ export class AppsRestApi { return RocketChat.API.v1.failure({ error: 'Failed to get a file to install for the App. '}); } - const prl = Promise.await(manager.add(buff.toString('base64'), false)); - - const info = prl.getInfo(); - info.status = prl.getStatus(); - - return RocketChat.API.v1.success({ app: info }); + const aff = Promise.await(manager.add(buff.toString('base64'), false)); + const info = aff.getAppInfo(); + info.status = aff.getApp().getStatus(); + + return RocketChat.API.v1.success({ + app: info, + implemented: aff.getImplementedInferfaces(), + compilerErrors: aff.getCompilerErrors() + }); } }); @@ -129,11 +132,15 @@ export class AppsRestApi { return RocketChat.API.v1.failure({ error: 'Failed to get a file to install for the App. '}); } - const prl = Promise.await(manager.update(buff.toString('base64'))); - const info = prl.getInfo(); - info.status = prl.getStatus(); + const aff = Promise.await(manager.update(buff.toString('base64'))); + const info = aff.getAppInfo(); + info.status = aff.getApp().getStatus(); - return RocketChat.API.v1.success({ app: info }); + return RocketChat.API.v1.success({ + app: info, + implemented: aff.getImplementedInferfaces(), + compilerErrors: aff.getCompilerErrors() + }); }, delete() { console.log('Uninstalling:', this.urlParams.id); diff --git a/packages/rocketchat-apps/server/communication/websockets.js b/packages/rocketchat-apps/server/communication/websockets.js index f9cd49f4a1b6..098f65811f50 100644 --- a/packages/rocketchat-apps/server/communication/websockets.js +++ b/packages/rocketchat-apps/server/communication/websockets.js @@ -29,46 +29,48 @@ export class AppServerListener { this.engineStreamer.on(AppEvents.COMMAND_REMOVED, this.onCommandRemoved.bind(this)); } - onAppAdded(appId) { - this.orch.getManager().loadOne(appId).then(() => this.clientStreamer.emit(AppEvents.APP_ADDED, appId)); + async onAppAdded(appId) { + await this.orch.getManager().loadOne(appId); + this.clientStreamer.emit(AppEvents.APP_ADDED, appId); } - onAppStatusUpdated({ appId, status }) { + async onAppStatusUpdated({ appId, status }) { this.recieved.set(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`, { appId, status, when: new Date() }); if (AppStatusUtils.isEnabled(status)) { - this.orch.getManager().enable(appId) - .then(() => this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status })); + await this.orch.getManager().enable(appId); + this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status }); } else if (AppStatusUtils.isDisabled(status)) { - this.orch.getManager().disable(appId, AppStatus.MANUALLY_DISABLED === status) - .then(() => this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status })); + await this.orch.getManager().disable(appId, AppStatus.MANUALLY_DISABLED === status); + this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status }); } } - onAppSettingUpdated({ appId, setting }) { + async onAppSettingUpdated({ appId, setting }) { this.recieved.set(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`, { appId, setting, when: new Date() }); - this.orch.getManager().getSettingsManager().updateAppSetting(appId, setting) - .then(() => this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId })); + await this.orch.getManager().getSettingsManager().updateAppSetting(appId, setting); + this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId }); } - onAppRemoved(appId) { - this.orch.getManager().remove(appId).then(() => this.clientStreamer.emit(AppEvents.APP_REMOVED, appId)); + async onAppRemoved(appId) { + await this.orch.getManager().remove(appId); + this.clientStreamer.emit(AppEvents.APP_REMOVED, appId); } - onCommandAdded(command) { + async onCommandAdded(command) { this.clientStreamer.emit(AppEvents.COMMAND_ADDED, command); } - onCommandDisabled(command) { + async onCommandDisabled(command) { this.clientStreamer.emit(AppEvents.COMMAND_DISABLED, command); } - onCommandUpdated(command) { + async onCommandUpdated(command) { this.clientStreamer.emit(AppEvents.COMMAND_UPDATED, command); } - onCommandRemoved(command) { + async onCommandRemoved(command) { this.clientStreamer.emit(AppEvents.COMMAND_REMOVED, command); } } @@ -92,22 +94,22 @@ export class AppServerNotifier { this.listener = new AppServerListener(orch, this.engineStreamer, this.clientStreamer, this.recieved); } - appAdded(appId) { + async appAdded(appId) { this.engineStreamer.emit(AppEvents.APP_ADDED, appId); this.clientStreamer.emit(AppEvents.APP_ADDED, appId); } - appRemoved(appId) { + async appRemoved(appId) { this.engineStreamer.emit(AppEvents.APP_REMOVED, appId); this.clientStreamer.emit(AppEvents.APP_REMOVED, appId); } - appUpdated(appId) { + async appUpdated(appId) { this.engineStreamer.emit(AppEvents.APP_UPDATED, appId); this.clientStreamer.emit(AppEvents.APP_UPDATED, appId); } - appStatusUpdated(appId, status) { + async appStatusUpdated(appId, status) { if (this.recieved.has(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`)) { const details = this.recieved.get(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`); if (details.status === status) { @@ -120,7 +122,7 @@ export class AppServerNotifier { this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status }); } - appSettingsChange(appId, setting) { + async appSettingsChange(appId, setting) { if (this.recieved.has(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`)) { this.recieved.delete(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`); return; @@ -130,22 +132,22 @@ export class AppServerNotifier { this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId }); } - commandAdded(command) { + async commandAdded(command) { this.engineStreamer.emit(AppEvents.COMMAND_ADDED, command); this.clientStreamer.emit(AppEvents.COMMAND_ADDED, command); } - commandDisabled(command) { + async commandDisabled(command) { this.engineStreamer.emit(AppEvents.COMMAND_DISABLED, command); this.clientStreamer.emit(AppEvents.COMMAND_DISABLED, command); } - commandUpdated(command) { + async commandUpdated(command) { this.engineStreamer.emit(AppEvents.COMMAND_UPDATED, command); this.clientStreamer.emit(AppEvents.COMMAND_UPDATED, command); } - commandRemoved(command) { + async commandRemoved(command) { this.engineStreamer.emit(AppEvents.COMMAND_REMOVED, command); this.clientStreamer.emit(AppEvents.COMMAND_REMOVED, command); } diff --git a/packages/rocketchat-apps/server/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js index fbd29441e61e..af1d09e676b1 100644 --- a/packages/rocketchat-apps/server/orchestrator.js +++ b/packages/rocketchat-apps/server/orchestrator.js @@ -85,6 +85,6 @@ Meteor.startup(function _appServerOrchestrator() { global.Apps = new AppServerOrchestrator(); global.Apps.getManager().load() - .then(() => console.log('...done! :)')) + .then((affs) => console.log(`...done loading ${ affs.length }! ;)`)) .catch((err) => console.warn('...failed!', err)); }); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 2a545530cbbe..f686983ccb44 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -252,6 +252,17 @@ "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Api.ai Key", "Apiai_Language": "Api.ai Language", + "App_status_unknown": "Unknown", + "App_status_constructed": "Constructed", + "App_status_initialized": "Initialized", + "App_status_auto_enabled": "Enabled: Automatically", + "App_status_manually_enabled": "Enabled: Manually", + "App_status_compiler_error_disabled": "Disabled: Compiler Error", + "App_status_error_disabled": "Disabled: Uncaught Error", + "App_status_manually_disabled": "Disabled: Manually", + "App_status_disabled": "Disabled", + "App_author_homepage": "author homepage", + "App_support_url": "support url", "Appearance": "Appearance", "Application_added": "Application added", "Application_Name": "Application Name", @@ -1949,6 +1960,7 @@ "There_are_no_applications": "No oAuth Applications have been added yet.", "There_are_no_integrations": "There are no integrations", "There_are_no_users_in_this_role": "There are no users in this role.", + "There_are_no_applications_installed": "There are currently no Rocket.Chat Applications installed.", "This_conversation_is_already_closed": "This conversation is already closed.", "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "This email has already been used and has not been verified. Please change your password.", "This_is_a_desktop_notification": "This is a desktop notification", diff --git a/packages/rocketchat-lib/server/functions/createRoom.js b/packages/rocketchat-lib/server/functions/createRoom.js index a9656aa56586..5a3052429dfd 100644 --- a/packages/rocketchat-lib/server/functions/createRoom.js +++ b/packages/rocketchat-lib/server/functions/createRoom.js @@ -38,14 +38,14 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData }); if (Apps && Apps.isLoaded()) { - const prevent = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreatePrevent', room); + const prevent = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreatePrevent', room)); if (prevent) { throw new Meteor.Error('error-app-prevented-creation', 'A Rocket.Chat App prevented the room creation.'); } let result; - result = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateExtend', room); - result = Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateModify', result); + result = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateExtend', room)); + result = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateModify', result)); if (typeof result === 'object') { room = Object.assign(room, result); @@ -91,6 +91,8 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData } if (Apps && Apps.isLoaded()) { + // This returns a promise, but it won't mutate anything about the message + // so, we don't really care if it is successful or fails Apps.getBridges().getListenerBridge().roomEvent('IPostRoomCreate', room); } diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index 8cf7c8fff244..162614d77b4c 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -31,14 +31,14 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { // For the Rocket.Chat Apps :) if (message && Apps && Apps.isLoaded()) { - const prevent = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message); + const prevent = Promise.await(Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message)); if (prevent) { throw new Meteor.Error('error-app-prevented-sending', 'A Rocket.Chat App prevented the messaging sending.'); } let result; - result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentExtend', message); - result = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', result); + result = Promise.await(Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentExtend', message)); + result = Promise.await(Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentModify', result)); if (typeof result === 'object') { message = Object.assign(message, result); @@ -79,6 +79,8 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { } if (Apps && Apps.isLoaded()) { + // This returns a promise, but it won't mutate anything about the message + // so, we don't really care if it is successful or fails Apps.getBridges().getListenerBridge().messageEvent('IPostMessageSent', message); } From d41dd4092b1f418ef02de8b7e5de54418c12dd22 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Mon, 16 Apr 2018 16:18:10 -0500 Subject: [PATCH 10/12] Bump the apps packages versions --- packages/rocketchat-apps/package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index fc2652dc9d31..97399cdf6a5c 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.5.10', - '@rocket.chat/apps-ts-definition': '0.9.5' + '@rocket.chat/apps-engine': '0.5.11', + '@rocket.chat/apps-ts-definition': '0.9.6' }); From bb2095c5d31e8529431f37bb9b99d9bb9fe4a051 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Mon, 16 Apr 2018 16:48:24 -0500 Subject: [PATCH 11/12] Make all of the App Enabled status be simply Enabled and nothing more --- packages/rocketchat-i18n/i18n/en.i18n.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index f686983ccb44..f38b93997ac1 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -255,8 +255,8 @@ "App_status_unknown": "Unknown", "App_status_constructed": "Constructed", "App_status_initialized": "Initialized", - "App_status_auto_enabled": "Enabled: Automatically", - "App_status_manually_enabled": "Enabled: Manually", + "App_status_auto_enabled": "Enabled", + "App_status_manually_enabled": "Enabled", "App_status_compiler_error_disabled": "Disabled: Compiler Error", "App_status_error_disabled": "Disabled: Uncaught Error", "App_status_manually_disabled": "Disabled: Manually", From 4ec5263225c5929b06e8aa34bc154e82609232f9 Mon Sep 17 00:00:00 2001 From: Bradley Hilton Date: Mon, 16 Apr 2018 17:55:23 -0500 Subject: [PATCH 12/12] Add the debug npm script to the package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e88d1abbd7ef..e41ea8cc7b6c 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ ], "scripts": { "start": "meteor npm i && meteor", + "debug": "meteor run --inspect", "lint": "eslint .", "lint-fix": "eslint . --fix", "stylelint": "stylelint packages/**/*.css",
NameVersionStatus{{_ "Name"}}{{_ "Version"}}{{_ "Status"}}
{{version}} - {{status}} + {{parseStatus status}}
- you dont have any app installed :/ + {{_ "There_are_no_applications_installed"}}