From 26a3a71c3929b9b90afe40babd6735a535207947 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Sat, 6 Nov 2021 19:50:36 -0300 Subject: [PATCH 1/6] Permissions Raw --- app/api/server/v1/permissions.ts | 5 +- .../server/functions/upsertPermissions.ts | 40 +++++++-------- ...issionToRole.js => addPermissionToRole.ts} | 14 ++++-- ...mission.js => removeRoleFromPermission.ts} | 11 +++-- .../permissions/{index.js => index.ts} | 12 ++--- .../server/{permissions.js => permissions.ts} | 4 +- .../server/{permissions.js => permissions.ts} | 3 +- app/models/server/index.js | 2 - app/models/server/models/Permissions.js | 49 ------------------- app/models/server/raw/Permissions.ts | 31 ++++++++++++ app/models/server/raw/index.ts | 9 +--- ee/app/auditing/server/{index.js => index.ts} | 9 ++-- .../server/resetEnterprisePermissions.js | 6 --- .../server/resetEnterprisePermissions.ts | 7 +++ .../server/{permissions.js => permissions.ts} | 2 +- .../livechat-enterprise/server/permissions.js | 23 --------- .../livechat-enterprise/server/permissions.ts | 20 ++++++++ .../startup/migrations/{v174.js => v174.ts} | 6 +-- .../startup/migrations/{v188.js => v188.ts} | 4 +- .../startup/migrations/{v195.js => v195.ts} | 21 ++++---- server/startup/migrations/v214.js | 11 ----- server/startup/migrations/v214.ts | 12 +++++ server/startup/migrations/v217.js | 12 ----- server/startup/migrations/v217.ts | 13 +++++ server/startup/migrations/v223.js | 11 ----- server/startup/migrations/v223.ts | 11 +++++ server/startup/migrations/v224.js | 11 ----- server/startup/migrations/v224.ts | 9 ++++ server/startup/migrations/v228.js | 11 ----- server/startup/migrations/v228.ts | 9 ++++ server/startup/migrations/v230.ts | 10 ++-- 31 files changed, 188 insertions(+), 210 deletions(-) rename app/authorization/server/methods/{addPermissionToRole.js => addPermissionToRole.ts} (72%) rename app/authorization/server/methods/{removeRoleFromPermission.js => removeRoleFromPermission.ts} (70%) rename app/authorization/server/streamer/permissions/{index.js => index.ts} (52%) rename app/autotranslate/server/{permissions.js => permissions.ts} (57%) rename app/discussion/server/{permissions.js => permissions.ts} (87%) delete mode 100644 app/models/server/models/Permissions.js rename ee/app/auditing/server/{index.js => index.ts} (66%) delete mode 100644 ee/app/authorization/server/resetEnterprisePermissions.js create mode 100644 ee/app/authorization/server/resetEnterprisePermissions.ts rename ee/app/canned-responses/server/{permissions.js => permissions.ts} (90%) delete mode 100644 ee/app/livechat-enterprise/server/permissions.js create mode 100644 ee/app/livechat-enterprise/server/permissions.ts rename server/startup/migrations/{v174.js => v174.ts} (53%) rename server/startup/migrations/{v188.js => v188.ts} (52%) rename server/startup/migrations/{v195.js => v195.ts} (74%) delete mode 100644 server/startup/migrations/v214.js create mode 100644 server/startup/migrations/v214.ts delete mode 100644 server/startup/migrations/v217.js create mode 100644 server/startup/migrations/v217.ts delete mode 100644 server/startup/migrations/v223.js create mode 100644 server/startup/migrations/v223.ts delete mode 100644 server/startup/migrations/v224.js create mode 100644 server/startup/migrations/v224.ts delete mode 100644 server/startup/migrations/v228.js create mode 100644 server/startup/migrations/v228.ts diff --git a/app/api/server/v1/permissions.ts b/app/api/server/v1/permissions.ts index 52bfd287c863c..4242f0d08ce76 100644 --- a/app/api/server/v1/permissions.ts +++ b/app/api/server/v1/permissions.ts @@ -2,9 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; import { hasPermission } from '../../../authorization/server'; -import { Permissions } from '../../../models/server'; import { API } from '../api'; -import { Roles } from '../../../models/server/raw'; +import { Permissions, Roles } from '../../../models/server/raw'; API.v1.addRoute('permissions.listAll', { authRequired: true }, { get() { @@ -52,7 +51,7 @@ API.v1.addRoute('permissions.update', { authRequired: true }, { Object.keys(this.bodyParams.permissions).forEach((key) => { const element = this.bodyParams.permissions[key]; - if (!Permissions.findOneById(element._id)) { + if (!Promise.await(Permissions.findOneById(element._id))) { permissionNotFound = true; } diff --git a/app/authorization/server/functions/upsertPermissions.ts b/app/authorization/server/functions/upsertPermissions.ts index 3bb37f0846c34..2490dbae1075b 100644 --- a/app/authorization/server/functions/upsertPermissions.ts +++ b/app/authorization/server/functions/upsertPermissions.ts @@ -1,12 +1,11 @@ /* eslint no-multi-spaces: 0 */ -import Permissions from '../../../models/server/models/Permissions'; import { settings } from '../../../settings/server'; import { getSettingPermissionId, CONSTANTS } from '../../lib'; -import { Roles, Settings } from '../../../models/server/raw'; +import { Permissions, Roles, Settings } from '../../../models/server/raw'; import { IPermission } from '../../../../definition/IPermission'; import { ISetting } from '../../../../definition/ISetting'; -export const upsertPermissions = (): void => { +export const upsertPermissions = async (): Promise => { // Note: // 1.if we need to create a role that can only edit channel message, but not edit group message // then we can define edit--message instead of edit-message @@ -153,8 +152,8 @@ export const upsertPermissions = (): void => { ]; - for (const permission of permissions) { - Permissions.create(permission._id, permission.roles); + for await (const permission of permissions) { + await Permissions.create(permission._id, permission.roles); } const defaultRoles = [ @@ -171,30 +170,27 @@ export const upsertPermissions = (): void => { { name: 'livechat-manager', scope: 'Users', description: 'Livechat Manager' }, ]; - for (const role of defaultRoles) { - Roles.createOrUpdate(role.name, role.scope as 'Users' | 'Subscriptions', role.description, true, false); + for await (const role of defaultRoles) { + await Roles.createOrUpdate(role.name, role.scope as 'Users' | 'Subscriptions', role.description, true, false); } - const getPreviousPermissions = function(settingId?: string): Record { + const getPreviousPermissions = async function(settingId?: string): Promise> { const previousSettingPermissions: { [key: string]: IPermission; } = {}; - const selector = { level: CONSTANTS.SETTINGS_LEVEL, ...settingId && { settingId } }; - if (settingId) { - selector.settingId = settingId; - } + const selector = { level: 'settings' as const, ...settingId && { settingId } }; - Permissions.find(selector).forEach( + await Permissions.find(selector).forEach( function(permission: IPermission) { previousSettingPermissions[permission._id] = permission; }); return previousSettingPermissions; }; - const createSettingPermission = function(setting: ISetting, previousSettingPermissions: { + const createSettingPermission = async function(setting: ISetting, previousSettingPermissions: { [key: string]: IPermission; - }): void { + }): Promise { const permissionId = getSettingPermissionId(setting._id); const permission: Omit = { level: CONSTANTS.SETTINGS_LEVEL as 'settings' | undefined, @@ -216,19 +212,19 @@ export const upsertPermissions = (): void => { permission.sectionPermissionId = getSettingPermissionId(setting.section); } - const existent = Permissions.findOne({ + const existent = await Permissions.findOne({ _id: permissionId, ...permission, }, { fields: { _id: 1 } }); if (!existent) { try { - Permissions.upsert({ _id: permissionId }, { $set: permission }); + await Permissions.update({ _id: permissionId }, { $set: permission }, { upsert: true }); } catch (e) { if (!e.message.includes('E11000')) { // E11000 refers to a MongoDB error that can occur when using unique indexes for upserts // https://docs.mongodb.com/manual/reference/method/db.collection.update/#use-unique-indexes - Permissions.upsert({ _id: permissionId }, { $set: permission }); + await Permissions.update({ _id: permissionId }, { $set: permission }, { upsert: true }); } } } @@ -237,16 +233,16 @@ export const upsertPermissions = (): void => { }; const createPermissionsForExistingSettings = async function(): Promise { - const previousSettingPermissions = getPreviousPermissions(); + const previousSettingPermissions = await getPreviousPermissions(); (await Settings.findNotHidden().toArray()).forEach((setting) => { createSettingPermission(setting, previousSettingPermissions); }); // remove permissions for non-existent settings - for (const obsoletePermission in previousSettingPermissions) { + for await (const obsoletePermission of Object.keys(previousSettingPermissions)) { if (previousSettingPermissions.hasOwnProperty(obsoletePermission)) { - Permissions.remove({ _id: obsoletePermission }); + await Permissions.deleteOne({ _id: obsoletePermission }); } } }; @@ -256,7 +252,7 @@ export const upsertPermissions = (): void => { // register a callback for settings for be create in higher-level-packages settings.on('*', async function([settingId]) { - const previousSettingPermissions = getPreviousPermissions(settingId); + const previousSettingPermissions = await getPreviousPermissions(settingId); const setting = await Settings.findOneById(settingId); if (setting) { if (!setting.hidden) { diff --git a/app/authorization/server/methods/addPermissionToRole.js b/app/authorization/server/methods/addPermissionToRole.ts similarity index 72% rename from app/authorization/server/methods/addPermissionToRole.js rename to app/authorization/server/methods/addPermissionToRole.ts index 5ca74ed3dbc9b..42990b114437c 100644 --- a/app/authorization/server/methods/addPermissionToRole.js +++ b/app/authorization/server/methods/addPermissionToRole.ts @@ -1,11 +1,12 @@ import { Meteor } from 'meteor/meteor'; -import { Permissions } from '../../../models/server'; + import { hasPermission } from '../functions/hasPermission'; import { CONSTANTS, AuthorizationUtils } from '../../lib'; +import { Permissions } from '../../../models/server/raw'; Meteor.methods({ - 'authorization:addPermissionToRole'(permissionId, role) { + async 'authorization:addPermissionToRole'(permissionId, role) { if (AuthorizationUtils.isPermissionRestrictedForRole(permissionId, role)) { throw new Meteor.Error('error-action-not-allowed', 'Permission is restricted', { method: 'authorization:addPermissionToRole', @@ -14,7 +15,14 @@ Meteor.methods({ } const uid = Meteor.userId(); - const permission = Permissions.findOneById(permissionId); + const permission = await Permissions.findOneById(permissionId); + + if (!permission) { + throw new Meteor.Error('error-invalid-permission', 'Permission does not exist', { + method: 'authorization:addPermissionToRole', + action: 'Adding_permission', + }); + } if (!uid || !hasPermission(uid, 'access-permissions') || (permission.level === CONSTANTS.SETTINGS_LEVEL && !hasPermission(uid, 'access-setting-permissions'))) { throw new Meteor.Error('error-action-not-allowed', 'Adding permission is not allowed', { diff --git a/app/authorization/server/methods/removeRoleFromPermission.js b/app/authorization/server/methods/removeRoleFromPermission.ts similarity index 70% rename from app/authorization/server/methods/removeRoleFromPermission.js rename to app/authorization/server/methods/removeRoleFromPermission.ts index e0aa20ed34dbb..c31592a0ceca6 100644 --- a/app/authorization/server/methods/removeRoleFromPermission.js +++ b/app/authorization/server/methods/removeRoleFromPermission.ts @@ -1,13 +1,18 @@ import { Meteor } from 'meteor/meteor'; -import { Permissions } from '../../../models/server'; import { hasPermission } from '../functions/hasPermission'; import { CONSTANTS } from '../../lib'; +import { Permissions } from '../../../models/server/raw'; Meteor.methods({ - 'authorization:removeRoleFromPermission'(permissionId, role) { + async 'authorization:removeRoleFromPermission'(permissionId, role) { const uid = Meteor.userId(); - const permission = Permissions.findOneById(permissionId); + const permission = await Permissions.findOneById(permissionId); + + + if (!permission) { + throw new Meteor.Error('error-permission-not-found', 'Permission not found', { method: 'authorization:removeRoleFromPermission' }); + } if (!uid || !hasPermission(uid, 'access-permissions') || (permission.level === CONSTANTS.SETTINGS_LEVEL && !hasPermission(uid, 'access-setting-permissions'))) { throw new Meteor.Error('error-action-not-allowed', 'Removing permission is not allowed', { diff --git a/app/authorization/server/streamer/permissions/index.js b/app/authorization/server/streamer/permissions/index.ts similarity index 52% rename from app/authorization/server/streamer/permissions/index.js rename to app/authorization/server/streamer/permissions/index.ts index edffbdfe3e734..a42d6f36e60fb 100644 --- a/app/authorization/server/streamer/permissions/index.js +++ b/app/authorization/server/streamer/permissions/index.ts @@ -1,22 +1,22 @@ import { Meteor } from 'meteor/meteor'; -import Permissions from '../../../../models/server/models/Permissions'; +import { Permissions } from '../../../../models/server/raw'; Meteor.methods({ - 'permissions/get'(updatedAt) { + async 'permissions/get'(updatedAt: Date) { // TODO: should we return this for non logged users? // TODO: we could cache this collection - const records = Permissions.find().fetch(); + const records = await Permissions.find({ _updatedAt: { $gt: updatedAt } }).toArray(); if (updatedAt instanceof Date) { return { - update: records.filter((record) => record._updatedAt > updatedAt), - remove: Permissions.trashFindDeletedAfter( + update: records, + remove: await Permissions.trashFindDeletedAfter( updatedAt, {}, { fields: { _id: 1, _deletedAt: 1 } }, - ).fetch(), + ).toArray(), }; } diff --git a/app/autotranslate/server/permissions.js b/app/autotranslate/server/permissions.ts similarity index 57% rename from app/autotranslate/server/permissions.js rename to app/autotranslate/server/permissions.ts index 64ce0028fa872..83f3e5154c9f1 100644 --- a/app/autotranslate/server/permissions.js +++ b/app/autotranslate/server/permissions.ts @@ -1,11 +1,11 @@ import { Meteor } from 'meteor/meteor'; -import { Permissions } from '../../models'; +import { Permissions } from '../../models/server/raw'; Meteor.startup(() => { if (Permissions) { if (!Permissions.findOne({ _id: 'auto-translate' })) { - Permissions.insert({ _id: 'auto-translate', roles: ['admin'] }); + Permissions.create('auto-translate', ['admin']); } } }); diff --git a/app/discussion/server/permissions.js b/app/discussion/server/permissions.ts similarity index 87% rename from app/discussion/server/permissions.js rename to app/discussion/server/permissions.ts index 3d54e4c66b16b..da3ac2ee2290a 100644 --- a/app/discussion/server/permissions.js +++ b/app/discussion/server/permissions.ts @@ -1,6 +1,7 @@ import { Meteor } from 'meteor/meteor'; -import { Permissions } from '../../models'; +import { Permissions } from '../../models/server/raw'; + Meteor.startup(() => { // Add permissions for discussion diff --git a/app/models/server/index.js b/app/models/server/index.js index af13b9e63ad58..5507cf53f0aa9 100644 --- a/app/models/server/index.js +++ b/app/models/server/index.js @@ -5,7 +5,6 @@ import Rooms from './models/Rooms'; import Settings from './models/Settings'; import Subscriptions from './models/Subscriptions'; import Users from './models/Users'; -import Permissions from './models/Permissions'; import Imports from './models/Imports'; import LivechatCustomField from './models/LivechatCustomField'; import LivechatDepartment from './models/LivechatDepartment'; @@ -33,7 +32,6 @@ export { Settings, Subscriptions, Users, - Permissions, Imports, LivechatCustomField, LivechatDepartment, diff --git a/app/models/server/models/Permissions.js b/app/models/server/models/Permissions.js deleted file mode 100644 index 009f29d37f9df..0000000000000 --- a/app/models/server/models/Permissions.js +++ /dev/null @@ -1,49 +0,0 @@ -import { Base } from './_Base'; - -export class Permissions extends Base { - // FIND - findByRole(role, options) { - const query = { - roles: role, - }; - - return this.find(query, options); - } - - findOneById(_id) { - return this.findOne({ _id }); - } - - createOrUpdate(name, roles) { - const exists = this.findOne({ - _id: name, - roles, - }, { fields: { _id: 1 } }); - - if (exists) { - return exists._id; - } - - this.upsert({ _id: name }, { $set: { roles } }); - } - - create(name, roles) { - const exists = this.findOneById(name, { fields: { _id: 1 } }); - - if (exists) { - return exists._id; - } - - this.upsert({ _id: name }, { $set: { roles } }); - } - - addRole(permission, role) { - this.update({ _id: permission, roles: { $ne: role } }, { $addToSet: { roles: role } }); - } - - removeRole(permission, role) { - this.update({ _id: permission, roles: role }, { $pull: { roles: role } }); - } -} - -export default new Permissions('permissions'); diff --git a/app/models/server/raw/Permissions.ts b/app/models/server/raw/Permissions.ts index d5321c82c80b0..0c5ae1f8533e4 100644 --- a/app/models/server/raw/Permissions.ts +++ b/app/models/server/raw/Permissions.ts @@ -2,4 +2,35 @@ import { BaseRaw } from './BaseRaw'; import { IPermission } from '../../../../definition/IPermission'; export class PermissionsRaw extends BaseRaw { + async createOrUpdate(name: string, roles: string[]): Promise { + const exists = await this.findOne>({ + _id: name, + roles, + }, { fields: { _id: 1 } }); + + if (exists) { + return exists._id; + } + + return this.update({ _id: name }, { $set: { roles } }, { upsert: true }).then((result) => result.result._id); + } + + async create(id: string, roles: string[]): Promise { + const exists = await this.findOneById>(id, { fields: { _id: 1 } }); + + if (exists) { + return exists._id; + } + + return this.update({ _id: id }, { $set: { roles } }, { upsert: true }).then((result) => result.result._id); + } + + + async addRole(permission: string, role: string): Promise { + await this.update({ _id: permission, roles: { $ne: role } }, { $addToSet: { roles: role } }); + } + + async removeRole(permission: string, role: string): Promise { + await this.update({ _id: permission, roles: role }, { $pull: { roles: role } }); + } } diff --git a/app/models/server/raw/index.ts b/app/models/server/raw/index.ts index e1522b530fc12..34789c62ce2fe 100644 --- a/app/models/server/raw/index.ts +++ b/app/models/server/raw/index.ts @@ -66,7 +66,6 @@ import LivechatVisitorsModel from '../models/LivechatVisitors'; import LoginServiceConfigurationModel from '../models/LoginServiceConfiguration'; import MessagesModel from '../models/Messages'; import OmnichannelQueueModel from '../models/OmnichannelQueue'; -import PermissionsModel from '../models/Permissions'; import RoomsModel from '../models/Rooms'; import SettingsModel from '../models/Settings'; import SubscriptionsModel from '../models/Subscriptions'; @@ -74,9 +73,8 @@ import UsersModel from '../models/Users'; const trashCollection = trash.rawCollection(); -export const Permissions = new PermissionsRaw(PermissionsModel.model.rawCollection(), trashCollection); export const Users = new UsersRaw(UsersModel.model.rawCollection(), trashCollection); -export const Subscriptions = new SubscriptionsRaw(SubscriptionsModel.model.rawCollection(), { Users },trashCollection); +export const Subscriptions = new SubscriptionsRaw(SubscriptionsModel.model.rawCollection(), { Users }, trashCollection); export const Settings = new SettingsRaw(SettingsModel.model.rawCollection(), trashCollection); export const Rooms = new RoomsRaw(RoomsModel.model.rawCollection(), trashCollection); export const LivechatCustomField = new LivechatCustomFieldRaw(LivechatCustomFieldModel.model.rawCollection(), trashCollection); @@ -116,6 +114,7 @@ export const Invites = new InvitesRaw(db.collection(`${ prefix }invites`), trash export const NotificationQueue = new NotificationQueueRaw(db.collection(`${ prefix }notification_queue`), trashCollection); export const OAuthApps = new OAuthAppsRaw(db.collection(`${ prefix }oauth_apps`), trashCollection); export const OEmbedCache = new OEmbedCacheRaw(db.collection(`${ prefix }oembed_cache`), trashCollection); +export const Permissions = new PermissionsRaw(db.collection(`${ prefix }permissions`), trashCollection); export const ReadReceipts = new ReadReceiptsRaw(db.collection(`${ prefix }read_receipts`), trashCollection); export const Reports = new ReportsRaw(db.collection(`${ prefix }reports`), trashCollection); export const ServerEvents = new ServerEventsRaw(db.collection(`${ prefix }server_events`), trashCollection); @@ -128,15 +127,11 @@ export const UserDataFiles = new UserDataFilesRaw(db.collection(`${ prefix }user export const Uploads = new UploadsRaw(db.collection(`${ prefix }uploads`), trashCollection); export const WebdavAccounts = new WebdavAccountsRaw(db.collection(`${ prefix }webdav_accounts`), trashCollection); -console.log('asddd', Roles, Object.keys(Roles)); - const map = { [Messages.col.collectionName]: MessagesModel, [Users.col.collectionName]: UsersModel, [Subscriptions.col.collectionName]: SubscriptionsModel, [Settings.col.collectionName]: SettingsModel, - // [Roles.col.collectionName]: RolesModel, - [Permissions.col.collectionName]: PermissionsModel, [LivechatInquiry.col.collectionName]: LivechatInquiryModel, [LivechatDepartmentAgents.col.collectionName]: LivechatDepartmentAgentsModel, [Rooms.col.collectionName]: RoomsModel, diff --git a/ee/app/auditing/server/index.js b/ee/app/auditing/server/index.ts similarity index 66% rename from ee/app/auditing/server/index.js rename to ee/app/auditing/server/index.ts index f2dd39f672ec0..57ac621de7dd3 100644 --- a/ee/app/auditing/server/index.js +++ b/ee/app/auditing/server/index.ts @@ -2,8 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { onLicense } from '../../license/server'; -import { Permissions } from '../../../../app/models/server'; -import { Roles } from '../../../../app/models/server/raw'; +import { Permissions, Roles } from '../../../../app/models/server/raw'; onLicense('auditing', () => { require('./methods'); @@ -15,8 +14,8 @@ onLicense('auditing', () => { ]; const defaultRoles = [ - { name: 'auditor', scope: 'Users' }, - { name: 'auditor-log', scope: 'Users' }, + { name: 'auditor', scope: 'Users' as const }, + { name: 'auditor-log', scope: 'Users' as const }, ]; permissions.forEach((permission) => { @@ -24,7 +23,7 @@ onLicense('auditing', () => { }); defaultRoles.forEach((role) => - Roles.createOrUpdate(role.name, role.scope, role.description), + Roles.createOrUpdate(role.name, role.scope), ); }); }); diff --git a/ee/app/authorization/server/resetEnterprisePermissions.js b/ee/app/authorization/server/resetEnterprisePermissions.js deleted file mode 100644 index cebc88ba83be6..0000000000000 --- a/ee/app/authorization/server/resetEnterprisePermissions.js +++ /dev/null @@ -1,6 +0,0 @@ -import { Permissions } from '../../../../app/models/server'; -import { guestPermissions } from '../lib/guestPermissions'; - -export const resetEnterprisePermissions = function() { - Permissions.update({ _id: { $nin: guestPermissions } }, { $pull: { roles: 'guest' } }, { multi: true }); -}; diff --git a/ee/app/authorization/server/resetEnterprisePermissions.ts b/ee/app/authorization/server/resetEnterprisePermissions.ts new file mode 100644 index 0000000000000..2c7cd9def87e1 --- /dev/null +++ b/ee/app/authorization/server/resetEnterprisePermissions.ts @@ -0,0 +1,7 @@ + +import { Permissions } from '../../../../app/models/server/raw'; +import { guestPermissions } from '../lib/guestPermissions'; + +export const resetEnterprisePermissions = async function(): Promise { + await Permissions.update({ _id: { $nin: guestPermissions } }, { $pull: { roles: 'guest' } }, { multi: true }); +}; diff --git a/ee/app/canned-responses/server/permissions.js b/ee/app/canned-responses/server/permissions.ts similarity index 90% rename from ee/app/canned-responses/server/permissions.js rename to ee/app/canned-responses/server/permissions.ts index 26e838540df1b..f32650dd09b9e 100644 --- a/ee/app/canned-responses/server/permissions.js +++ b/ee/app/canned-responses/server/permissions.ts @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import Permissions from '../../../../app/models/server/models/Permissions'; +import { Permissions } from '../../../../app/models/server/raw'; Meteor.startup(() => { Permissions.create('view-canned-responses', ['livechat-agent', 'livechat-monitor', 'livechat-manager', 'admin']); diff --git a/ee/app/livechat-enterprise/server/permissions.js b/ee/app/livechat-enterprise/server/permissions.js deleted file mode 100644 index 6c9d580ec9d03..0000000000000 --- a/ee/app/livechat-enterprise/server/permissions.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Permissions } from '../../../../app/models/server'; -import { Roles } from '../../../../app/models/server/raw'; - -export const createPermissions = async () => { - if (!Permissions) { - return; - } - - const livechatMonitorRole = 'livechat-monitor'; - const livechatManagerRole = 'livechat-manager'; - const adminRole = 'admin'; - - const monitorRole = await Roles.findOneById(livechatMonitorRole, { fields: { _id: 1 } }); - if (!monitorRole) { - await Roles.createOrUpdate(livechatMonitorRole); - } - - Permissions.create('manage-livechat-units', [adminRole, livechatManagerRole]); - Permissions.create('manage-livechat-monitors', [adminRole, livechatManagerRole]); - Permissions.create('manage-livechat-tags', [adminRole, livechatManagerRole]); - Permissions.create('manage-livechat-priorities', [adminRole, livechatManagerRole]); - Permissions.create('manage-livechat-canned-responses', [adminRole, livechatManagerRole, livechatMonitorRole]); -}; diff --git a/ee/app/livechat-enterprise/server/permissions.ts b/ee/app/livechat-enterprise/server/permissions.ts new file mode 100644 index 0000000000000..23403ad587c73 --- /dev/null +++ b/ee/app/livechat-enterprise/server/permissions.ts @@ -0,0 +1,20 @@ + +import { Permissions, Roles } from '../../../../app/models/server/raw'; + +export const createPermissions = async (): Promise => { + const livechatMonitorRole = 'livechat-monitor'; + const livechatManagerRole = 'livechat-manager'; + const adminRole = 'admin'; + + const monitorRole = await Roles.findOneById(livechatMonitorRole, { fields: { _id: 1 } }); + if (!monitorRole) { + await Roles.createOrUpdate(livechatMonitorRole); + } + + await Promise.all([Permissions.create('manage-livechat-units', [adminRole, livechatManagerRole]), + Permissions.create('manage-livechat-monitors', [adminRole, livechatManagerRole]), + Permissions.create('manage-livechat-tags', [adminRole, livechatManagerRole]), + Permissions.create('manage-livechat-priorities', [adminRole, livechatManagerRole]), + Permissions.create('manage-livechat-canned-responses', [adminRole, livechatManagerRole, livechatMonitorRole]) + ]); +}; diff --git a/server/startup/migrations/v174.js b/server/startup/migrations/v174.ts similarity index 53% rename from server/startup/migrations/v174.js rename to server/startup/migrations/v174.ts index a03aeb430a15a..f9b0639035993 100644 --- a/server/startup/migrations/v174.js +++ b/server/startup/migrations/v174.ts @@ -1,5 +1,5 @@ +import { Permissions } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; const appRolePermissions = [ 'api-bypass-rate-limit', @@ -18,9 +18,9 @@ const appRolePermissions = [ addMigration({ version: 174, up() { - Permissions.update({ _id: { $in: appRolePermissions } }, { $addToSet: { roles: 'app' } }, { multi: true }); + return Permissions.update({ _id: { $in: appRolePermissions } }, { $addToSet: { roles: 'app' } }, { multi: true }); }, down() { - Permissions.update({ _id: { $in: appRolePermissions } }, { $pull: { roles: 'app' } }, { multi: true }); + return Permissions.update({ _id: { $in: appRolePermissions } }, { $pull: { roles: 'app' } }, { multi: true }); }, }); diff --git a/server/startup/migrations/v188.js b/server/startup/migrations/v188.ts similarity index 52% rename from server/startup/migrations/v188.js rename to server/startup/migrations/v188.ts index b63ca803a96e6..fe9fa88f9e30e 100644 --- a/server/startup/migrations/v188.js +++ b/server/startup/migrations/v188.ts @@ -1,5 +1,5 @@ import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; + const newRolePermissions = [ 'view-d-room', @@ -11,6 +11,6 @@ const roleName = 'guest'; addMigration({ version: 188, up() { - Permissions.update({ _id: { $in: newRolePermissions } }, { $addToSet: { roles: roleName } }, { multi: true }); + return Permissions.update({ _id: { $in: newRolePermissions } }, { $addToSet: { roles: roleName } }, { multi: true }); }, }); diff --git a/server/startup/migrations/v195.js b/server/startup/migrations/v195.ts similarity index 74% rename from server/startup/migrations/v195.js rename to server/startup/migrations/v195.ts index f40d261083d27..ebff3746c00ab 100644 --- a/server/startup/migrations/v195.js +++ b/server/startup/migrations/v195.ts @@ -3,11 +3,10 @@ import { ObjectId } from 'mongodb'; import { Mongo } from 'meteor/mongo'; import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; -import { LivechatBusinessHours, Settings } from '../../../app/models/server/raw'; -import { LivechatBusinessHourTypes } from '../../../definition/ILivechatBusinessHour'; +import { LivechatBusinessHours, Permissions, Settings } from '../../../app/models/server/raw'; +import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '../../../definition/ILivechatBusinessHour'; -const migrateCollection = () => { +const migrateCollection = async (): Promise => { const LivechatOfficeHour = new Mongo.Collection('rocketchat_livechat_office_hour'); const days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; const officeHours = []; @@ -22,7 +21,7 @@ const migrateCollection = () => { return; } - const businessHour = { + const businessHour: Omit = { name: '', active: true, type: LivechatBusinessHourTypes.DEFAULT, @@ -56,10 +55,10 @@ const migrateCollection = () => { })), timezone: { name: moment.tz.guess(), - utc: moment().utcOffset() / 60, + utc: String(moment().utcOffset() / 60), }, }; - if (LivechatBusinessHours.find({ type: LivechatBusinessHourTypes.DEFAULT }).count() === 0) { + if (await LivechatBusinessHours.find({ type: LivechatBusinessHourTypes.DEFAULT }).count() === 0) { businessHour._id = new ObjectId().toHexString(); LivechatBusinessHours.insertOne(businessHour); } else { @@ -78,12 +77,12 @@ const migrateCollection = () => { addMigration({ version: 195, async up() { - Settings.removeById('Livechat_enable_office_hours'); - Settings.remove('Livechat_allow_online_agents_outside_office_hours'); + await Settings.removeById('Livechat_enable_office_hours'); + await Settings.removeById('Livechat_allow_online_agents_outside_office_hours'); const permission = Permissions.findOneById('view-livechat-officeHours'); if (permission) { - Permissions.upsert({ _id: 'view-livechat-business-hours' }, { $set: { roles: permission.roles } }); - Permissions.remove({ _id: 'view-livechat-officeHours' }); + await Permissions.update({ _id: 'view-livechat-business-hours' }, { $set: { roles: permission.roles } }, { upsert: true }); + await Permissions.deleteOne({ _id: 'view-livechat-officeHours' }); } await migrateCollection(); }, diff --git a/server/startup/migrations/v214.js b/server/startup/migrations/v214.js deleted file mode 100644 index 787b8acbeb74c..0000000000000 --- a/server/startup/migrations/v214.js +++ /dev/null @@ -1,11 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; - -const roleName = 'admin'; - -addMigration({ - version: 214, - up() { - Permissions.update({ _id: 'toggle-room-e2e-encryption' }, { $addToSet: { roles: roleName } }); - }, -}); diff --git a/server/startup/migrations/v214.ts b/server/startup/migrations/v214.ts new file mode 100644 index 0000000000000..ec0b5491e433a --- /dev/null +++ b/server/startup/migrations/v214.ts @@ -0,0 +1,12 @@ +import { Permissions } from '../../../app/models/server/raw'; +import { addMigration } from '../../lib/migrations'; + + +const roleName = 'admin'; + +addMigration({ + version: 214, + up() { + return Permissions.update({ _id: 'toggle-room-e2e-encryption' }, { $addToSet: { roles: roleName } }); + }, +}); diff --git a/server/startup/migrations/v217.js b/server/startup/migrations/v217.js deleted file mode 100644 index 3c82aeb5931c1..0000000000000 --- a/server/startup/migrations/v217.js +++ /dev/null @@ -1,12 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models'; - -addMigration({ - version: 217, - up() { - const oldPermission = Permissions.findOne('view-livechat-queue'); - if (oldPermission) { - Permissions.update({ _id: 'view-livechat-queue' }, { $addToSet: { roles: 'livechat-agent' } }); - } - }, -}); diff --git a/server/startup/migrations/v217.ts b/server/startup/migrations/v217.ts new file mode 100644 index 0000000000000..3ca79fccc2d5b --- /dev/null +++ b/server/startup/migrations/v217.ts @@ -0,0 +1,13 @@ +import { Permissions } from '../../../app/models/server/raw'; +import { addMigration } from '../../lib/migrations'; + + +addMigration({ + version: 217, + async up() { + const oldPermission = await Permissions.findOne('view-livechat-queue'); + if (oldPermission) { + return Permissions.update({ _id: 'view-livechat-queue' }, { $addToSet: { roles: 'livechat-agent' } }); + } + }, +}); diff --git a/server/startup/migrations/v223.js b/server/startup/migrations/v223.js deleted file mode 100644 index 60c60180ea70a..0000000000000 --- a/server/startup/migrations/v223.js +++ /dev/null @@ -1,11 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; - -const roleName = 'user'; - -addMigration({ - version: 223, - up() { - Permissions.update({ _id: 'message-impersonate' }, { $addToSet: { roles: roleName } }); - }, -}); diff --git a/server/startup/migrations/v223.ts b/server/startup/migrations/v223.ts new file mode 100644 index 0000000000000..ef357c554277d --- /dev/null +++ b/server/startup/migrations/v223.ts @@ -0,0 +1,11 @@ +import { Permissions } from '../../../app/models/server/raw'; +import { addMigration } from '../../lib/migrations'; + +const roleName = 'user'; + +addMigration({ + version: 223, + up() { + return Permissions.update({ _id: 'message-impersonate' }, { $addToSet: { roles: roleName } }); + }, +}); diff --git a/server/startup/migrations/v224.js b/server/startup/migrations/v224.js deleted file mode 100644 index 5e69367f56093..0000000000000 --- a/server/startup/migrations/v224.js +++ /dev/null @@ -1,11 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; - -const roleName = 'app'; - -addMigration({ - version: 224, - up() { - Permissions.update({ _id: 'message-impersonate' }, { $addToSet: { roles: roleName } }); - }, -}); diff --git a/server/startup/migrations/v224.ts b/server/startup/migrations/v224.ts new file mode 100644 index 0000000000000..be266c225bd08 --- /dev/null +++ b/server/startup/migrations/v224.ts @@ -0,0 +1,9 @@ +import { Permissions } from '../../../app/models/server/raw'; +import { addMigration } from '../../lib/migrations'; + +addMigration({ + version: 224, + up() { + return Permissions.update({ _id: 'message-impersonate' }, { $addToSet: { roles: 'app' } }); + }, +}); diff --git a/server/startup/migrations/v228.js b/server/startup/migrations/v228.js deleted file mode 100644 index 9ac69ef146cc4..0000000000000 --- a/server/startup/migrations/v228.js +++ /dev/null @@ -1,11 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models'; - -addMigration({ - version: 228, - up() { - if (Permissions) { - Permissions.update({ _id: 'manage-livechat-canned-responses' }, { $addToSet: { roles: 'livechat-monitor' } }); - } - }, -}); diff --git a/server/startup/migrations/v228.ts b/server/startup/migrations/v228.ts new file mode 100644 index 0000000000000..4d49253980f39 --- /dev/null +++ b/server/startup/migrations/v228.ts @@ -0,0 +1,9 @@ +import { Permissions } from '../../../app/models/server/raw'; +import { addMigration } from '../../lib/migrations'; + +addMigration({ + version: 228, + up() { + return Permissions.update({ _id: 'manage-livechat-canned-responses' }, { $addToSet: { roles: 'livechat-monitor' } }); + }, +}); diff --git a/server/startup/migrations/v230.ts b/server/startup/migrations/v230.ts index 22c48c7762ffb..c3103291bd002 100644 --- a/server/startup/migrations/v230.ts +++ b/server/startup/migrations/v230.ts @@ -1,12 +1,12 @@ +import { Permissions } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; -import { Permissions } from '../../../app/models/server'; - -const roleName = 'app'; addMigration({ version: 230, up() { - Permissions.update({ _id: 'start-discussion' }, { $addToSet: { roles: roleName } }); - Permissions.update({ _id: 'start-discussion-other-user' }, { $addToSet: { roles: roleName } }); + return Promise.all([ + Permissions.addRole('start-discussion', 'app'), + Permissions.addRole('start-discussion-other-user', 'app'), + ]); }, }); From ff8909907672fb25b4776144505f6a49fa5ba3f4 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 9 Nov 2021 09:47:57 -0300 Subject: [PATCH 2/6] Lint --- app/api/server/v1/roles.ts | 2 +- ee/app/livechat-enterprise/server/permissions.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/api/server/v1/roles.ts b/app/api/server/v1/roles.ts index 3fc7946fbe8e2..8d4e00bdb1b10 100644 --- a/app/api/server/v1/roles.ts +++ b/app/api/server/v1/roles.ts @@ -60,7 +60,7 @@ API.v1.addRoute('roles.create', { authRequired: true }, { if (['Users', 'Subscriptions'].includes(roleData.scope) === false) { roleData.scope = 'Users'; } - const a = Roles.createWithRandomId(roleData.name, roleData.scope, roleData.description, false, roleData.mandatory2fa) + const a = Roles.createWithRandomId(roleData.name, roleData.scope, roleData.description, false, roleData.mandatory2fa); const roleId = Promise.await(a).insertedId; if (settings.get('UI_DisplayRoles')) { diff --git a/ee/app/livechat-enterprise/server/permissions.ts b/ee/app/livechat-enterprise/server/permissions.ts index 23403ad587c73..1b0ef93e0a688 100644 --- a/ee/app/livechat-enterprise/server/permissions.ts +++ b/ee/app/livechat-enterprise/server/permissions.ts @@ -11,10 +11,11 @@ export const createPermissions = async (): Promise => { await Roles.createOrUpdate(livechatMonitorRole); } - await Promise.all([Permissions.create('manage-livechat-units', [adminRole, livechatManagerRole]), + await Promise.all([ + Permissions.create('manage-livechat-units', [adminRole, livechatManagerRole]), Permissions.create('manage-livechat-monitors', [adminRole, livechatManagerRole]), Permissions.create('manage-livechat-tags', [adminRole, livechatManagerRole]), Permissions.create('manage-livechat-priorities', [adminRole, livechatManagerRole]), - Permissions.create('manage-livechat-canned-responses', [adminRole, livechatManagerRole, livechatMonitorRole]) + Permissions.create('manage-livechat-canned-responses', [adminRole, livechatManagerRole, livechatMonitorRole]), ]); }; From f412985eeaf4ebdb55a92a459779ffcf89fa3a14 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 9 Nov 2021 11:06:39 -0300 Subject: [PATCH 3/6] Lint --- app/autotranslate/server/permissions.ts | 8 +++----- ee/app/engagement-dashboard/server/lib/users.js | 2 +- server/startup/migrations/v188.ts | 1 + server/startup/migrations/v195.ts | 3 +-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/autotranslate/server/permissions.ts b/app/autotranslate/server/permissions.ts index 83f3e5154c9f1..5ce05e8f1ef72 100644 --- a/app/autotranslate/server/permissions.ts +++ b/app/autotranslate/server/permissions.ts @@ -2,10 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Permissions } from '../../models/server/raw'; -Meteor.startup(() => { - if (Permissions) { - if (!Permissions.findOne({ _id: 'auto-translate' })) { - Permissions.create('auto-translate', ['admin']); - } +Meteor.startup(async () => { + if (!await Permissions.findOne({ _id: 'auto-translate' })) { + Permissions.create('auto-translate', ['admin']); } }); diff --git a/ee/app/engagement-dashboard/server/lib/users.js b/ee/app/engagement-dashboard/server/lib/users.js index c2b61a35a2921..b9d8738827c17 100644 --- a/ee/app/engagement-dashboard/server/lib/users.js +++ b/ee/app/engagement-dashboard/server/lib/users.js @@ -26,7 +26,7 @@ export const fillFirstDaysOfUsersIfNeeded = async (date) => { start: startOfPeriod, end: date, }); - users.forEach((user) => Analytics.insert({ + users.forEach((user) => Analytics.insertOne({ ...user, date: parseInt(user.date), })); diff --git a/server/startup/migrations/v188.ts b/server/startup/migrations/v188.ts index fe9fa88f9e30e..50bc75990d033 100644 --- a/server/startup/migrations/v188.ts +++ b/server/startup/migrations/v188.ts @@ -1,3 +1,4 @@ +import { Permissions } from '../../../app/models/server/raw'; import { addMigration } from '../../lib/migrations'; diff --git a/server/startup/migrations/v195.ts b/server/startup/migrations/v195.ts index ebff3746c00ab..9bdcb539c8e31 100644 --- a/server/startup/migrations/v195.ts +++ b/server/startup/migrations/v195.ts @@ -59,7 +59,6 @@ const migrateCollection = async (): Promise => { }, }; if (await LivechatBusinessHours.find({ type: LivechatBusinessHourTypes.DEFAULT }).count() === 0) { - businessHour._id = new ObjectId().toHexString(); LivechatBusinessHours.insertOne(businessHour); } else { LivechatBusinessHours.update({ type: LivechatBusinessHourTypes.DEFAULT }, { $set: { ...businessHour } }); @@ -79,7 +78,7 @@ addMigration({ async up() { await Settings.removeById('Livechat_enable_office_hours'); await Settings.removeById('Livechat_allow_online_agents_outside_office_hours'); - const permission = Permissions.findOneById('view-livechat-officeHours'); + const permission = await Permissions.findOneById('view-livechat-officeHours'); if (permission) { await Permissions.update({ _id: 'view-livechat-business-hours' }, { $set: { roles: permission.roles } }, { upsert: true }); await Permissions.deleteOne({ _id: 'view-livechat-officeHours' }); From bca05f5cb699f426db758263dd5bf20343400773 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 9 Nov 2021 11:20:21 -0300 Subject: [PATCH 4/6] remove unused declaration --- server/startup/migrations/v195.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/server/startup/migrations/v195.ts b/server/startup/migrations/v195.ts index 9bdcb539c8e31..0bd6b65ee78f2 100644 --- a/server/startup/migrations/v195.ts +++ b/server/startup/migrations/v195.ts @@ -1,5 +1,4 @@ import moment from 'moment-timezone'; -import { ObjectId } from 'mongodb'; import { Mongo } from 'meteor/mongo'; import { addMigration } from '../../lib/migrations'; From b939a9e96913acf03aadadb961e06086cb6373fc Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 9 Nov 2021 11:42:50 -0300 Subject: [PATCH 5/6] O.o --- definition/ILivechatBusinessHour.ts | 1 + server/startup/migrations/v195.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/definition/ILivechatBusinessHour.ts b/definition/ILivechatBusinessHour.ts index cdb18c9fd4beb..ab2ec4f70315a 100644 --- a/definition/ILivechatBusinessHour.ts +++ b/definition/ILivechatBusinessHour.ts @@ -21,6 +21,7 @@ export interface IBusinessHourWorkHour { start: IBusinessHourTime; finish: IBusinessHourTime; open: boolean; + code: unknown; } export interface IBusinessHourTimezone { diff --git a/server/startup/migrations/v195.ts b/server/startup/migrations/v195.ts index 0bd6b65ee78f2..89221f519bb48 100644 --- a/server/startup/migrations/v195.ts +++ b/server/startup/migrations/v195.ts @@ -3,12 +3,12 @@ import { Mongo } from 'meteor/mongo'; import { addMigration } from '../../lib/migrations'; import { LivechatBusinessHours, Permissions, Settings } from '../../../app/models/server/raw'; -import { ILivechatBusinessHour, LivechatBusinessHourTypes } from '../../../definition/ILivechatBusinessHour'; +import { ILivechatBusinessHour, IBusinessHourWorkHour, LivechatBusinessHourTypes } from '../../../definition/ILivechatBusinessHour'; const migrateCollection = async (): Promise => { - const LivechatOfficeHour = new Mongo.Collection('rocketchat_livechat_office_hour'); + const LivechatOfficeHour = new Mongo.Collection('rocketchat_livechat_office_hour'); const days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; - const officeHours = []; + const officeHours: IBusinessHourWorkHour[] = []; days.forEach((day) => { const officeHour = LivechatOfficeHour.findOne({ day }); if (officeHour) { @@ -25,10 +25,10 @@ const migrateCollection = async (): Promise => { active: true, type: LivechatBusinessHourTypes.DEFAULT, ts: new Date(), - workHours: officeHours.map((officeHour) => ({ + workHours: officeHours.map((officeHour): IBusinessHourWorkHour => ({ day: officeHour.day, start: { - time: officeHour.start, + time: officeHour.start as any, utc: { dayOfWeek: moment(`${ officeHour.day }:${ officeHour.start }`, 'dddd:HH:mm').utc().format('dddd'), time: moment(`${ officeHour.day }:${ officeHour.start }`, 'dddd:HH:mm').utc().format('HH:mm'), @@ -39,7 +39,7 @@ const migrateCollection = async (): Promise => { }, }, finish: { - time: officeHour.finish, + time: officeHour.finish as any, utc: { dayOfWeek: moment(`${ officeHour.day }:${ officeHour.finish }`, 'dddd:HH:mm').utc().format('dddd'), time: moment(`${ officeHour.day }:${ officeHour.finish }`, 'dddd:HH:mm').utc().format('HH:mm'), From b58e5328a270c886e99f5452405e60f2eb85c8fb Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 9 Nov 2021 14:42:52 -0300 Subject: [PATCH 6/6] fix E2E --- app/api/server/v1/permissions.ts | 11 +++++------ .../server/streamer/permissions/index.ts | 5 ++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/api/server/v1/permissions.ts b/app/api/server/v1/permissions.ts index 4242f0d08ce76..c2aab9afda543 100644 --- a/app/api/server/v1/permissions.ts +++ b/app/api/server/v1/permissions.ts @@ -9,7 +9,7 @@ API.v1.addRoute('permissions.listAll', { authRequired: true }, { get() { const { updatedSince } = this.queryParams; - let updatedSinceDate: Date; + let updatedSinceDate: Date | undefined; if (updatedSince) { if (isNaN(Date.parse(updatedSince))) { throw new Meteor.Error('error-roomId-param-invalid', 'The "updatedSince" query parameter must be a valid date.'); @@ -17,14 +17,13 @@ API.v1.addRoute('permissions.listAll', { authRequired: true }, { updatedSinceDate = new Date(updatedSince); } - let result; - Meteor.runAsUser(this.userId, () => { result = Meteor.call('permissions/get', updatedSinceDate); }); + const result = Promise.await(Meteor.call('permissions/get', updatedSinceDate)); if (Array.isArray(result)) { - result = { + return API.v1.success({ update: result, remove: [], - }; + }); } return API.v1.success(result); @@ -76,7 +75,7 @@ API.v1.addRoute('permissions.update', { authRequired: true }, { Permissions.createOrUpdate(element._id, element.roles); }); - const result = Meteor.runAsUser(this.userId, () => Meteor.call('permissions/get')); + const result = Promise.await(Meteor.call('permissions/get')); return API.v1.success({ permissions: result, diff --git a/app/authorization/server/streamer/permissions/index.ts b/app/authorization/server/streamer/permissions/index.ts index a42d6f36e60fb..5494f8f1f78ec 100644 --- a/app/authorization/server/streamer/permissions/index.ts +++ b/app/authorization/server/streamer/permissions/index.ts @@ -1,13 +1,16 @@ import { Meteor } from 'meteor/meteor'; +import { check, Match } from 'meteor/check'; import { Permissions } from '../../../../models/server/raw'; Meteor.methods({ async 'permissions/get'(updatedAt: Date) { + check(updatedAt, Match.Maybe(Date)); + // TODO: should we return this for non logged users? // TODO: we could cache this collection - const records = await Permissions.find({ _updatedAt: { $gt: updatedAt } }).toArray(); + const records = await Permissions.find(updatedAt && { _updatedAt: { $gt: updatedAt } }).toArray(); if (updatedAt instanceof Date) { return {