From 568a6ba156800930a1bc927476512788d73d96eb Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 15:33:04 -0300 Subject: [PATCH 1/8] Migrating... --- .../{getPermissions.js => getPermissions.ts} | 88 ++++++++++--------- 1 file changed, 48 insertions(+), 40 deletions(-) rename app/lib/methods/{getPermissions.js => getPermissions.ts} (63%) diff --git a/app/lib/methods/getPermissions.js b/app/lib/methods/getPermissions.ts similarity index 63% rename from app/lib/methods/getPermissions.js rename to app/lib/methods/getPermissions.ts index cba8a7652c3..347a95ed807 100644 --- a/app/lib/methods/getPermissions.js +++ b/app/lib/methods/getPermissions.ts @@ -1,6 +1,7 @@ import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import { Q } from '@nozbe/watermelondb'; import orderBy from 'lodash/orderBy'; +import { IPermissions } from 'reducers/permissions'; import { compareServerVersion } from '../utils'; import database from '../database'; @@ -9,6 +10,7 @@ import { store as reduxStore } from '../auxStore'; import RocketChat from '../rocketchat'; import { setPermissions as setPermissionsAction } from '../../actions/permissions'; import protectedFunction from './helpers/protectedFunction'; +import { IRocketChat, TPermissionModel } from '../../definitions'; const PERMISSIONS = [ 'add-user-to-any-c-room', @@ -59,7 +61,7 @@ const PERMISSIONS = [ 'mobile-upload-file' ]; -export async function setPermissions() { +export async function setPermissions(): Promise { const db = database.active; const permissionsCollection = db.get('permissions'); const allPermissions = await permissionsCollection.query(Q.where('id', Q.oneOf(PERMISSIONS))).fetch(); @@ -68,7 +70,7 @@ export async function setPermissions() { reduxStore.dispatch(setPermissionsAction(parsed)); } -const getUpdatedSince = allRecords => { +const getUpdatedSince = (allRecords: TPermissionModel[]) => { try { if (!allRecords.length) { return null; @@ -85,50 +87,56 @@ const getUpdatedSince = allRecords => { return null; }; -const updatePermissions = async ({ update = [], remove = [], allRecords }) => { +const updatePermissions = async ({ + update = [], + remove = [], + allRecords +}: { + update?: IPermissions[]; + remove?: IPermissions[]; + allRecords: TPermissionModel[]; +}) => { if (!((update && update.length) || (remove && remove.length))) { return; } const db = database.active; const permissionsCollection = db.get('permissions'); - // filter permissions - let permissionsToCreate = []; - let permissionsToUpdate = []; - let permissionsToDelete = []; + const batch: TPermissionModel[] = []; + + // Delete + if (remove?.length) { + const filteredPermissionsToDelete = allRecords.filter(i1 => remove.find(i2 => i1.id === i2._id)); + const permissionsToDelete = filteredPermissionsToDelete.map(permission => permission.prepareDestroyPermanently()); + batch.push(...permissionsToDelete); + } // Create or update - if (update && update.length) { - permissionsToCreate = update.filter(i1 => !allRecords.find(i2 => i1._id === i2.id)); - permissionsToUpdate = allRecords.filter(i1 => update.find(i2 => i1.id === i2._id)); - permissionsToCreate = permissionsToCreate.map(permission => + if (update?.length) { + const filteredPermissionsToCreate = update.filter(i1 => !allRecords.find(i2 => i1._id === i2.id)); + const filteredPermissionsToUpdate = allRecords.filter(i1 => update.find(i2 => i1.id === i2._id)); + const permissionsToCreate = filteredPermissionsToCreate.map(permission => permissionsCollection.prepareCreate( - protectedFunction(p => { + protectedFunction((p: TPermissionModel) => { p._raw = sanitizedRaw({ id: permission._id }, permissionsCollection.schema); Object.assign(p, permission); }) ) ); - permissionsToUpdate = permissionsToUpdate.map(permission => { + const permissionsToUpdate = filteredPermissionsToUpdate.map(permission => { const newPermission = update.find(p => p._id === permission.id); return permission.prepareUpdate( - protectedFunction(p => { + protectedFunction((p: TPermissionModel) => { Object.assign(p, newPermission); }) ); }); - } - // Delete - if (remove && remove.length) { - permissionsToDelete = allRecords.filter(i1 => remove.find(i2 => i1.id === i2._id)); - permissionsToDelete = permissionsToDelete.map(permission => permission.prepareDestroyPermanently()); + batch.push(...permissionsToCreate, ...permissionsToUpdate); } - const batch = [...permissionsToCreate, ...permissionsToUpdate, ...permissionsToDelete]; - try { - await db.action(async () => { + await db.write(async () => { await db.batch(...batch); }); return true; @@ -137,16 +145,16 @@ const updatePermissions = async ({ update = [], remove = [], allRecords }) => { } }; -export function getPermissions() { +export function getPermissions(this: IRocketChat): Promise { return new Promise(async resolve => { try { - const serverVersion = reduxStore.getState().server.version; + const serverVersion: string | null = reduxStore.getState().server.version; const db = database.active; const permissionsCollection = db.get('permissions'); const allRecords = await permissionsCollection.query().fetch(); RocketChat.subscribe('stream-notify-logged', 'permissions-changed'); // if server version is lower than 0.73.0, fetches from old api - if (compareServerVersion(serverVersion, 'lowerThan', '0.73.0')) { + if (serverVersion && compareServerVersion(serverVersion, 'lowerThan', '0.73.0')) { // RC 0.66.0 const result = await this.sdk.get('permissions.list'); if (!result.success) { @@ -157,25 +165,25 @@ export function getPermissions() { setPermissions(); } return resolve(); - } else { - const params = {}; - const updatedSince = getUpdatedSince(allRecords); - if (updatedSince) { - params.updatedSince = updatedSince; - } - // RC 0.73.0 - const result = await this.sdk.get('permissions.listAll', params); + } - if (!result.success) { - return resolve(); - } + const params: { updatedSince?: string } = {}; + const updatedSince = getUpdatedSince(allRecords); + if (updatedSince) { + params.updatedSince = updatedSince; + } + // RC 0.73.0 + const result = await this.sdk.get('permissions.listAll', params); - const changePermissions = await updatePermissions({ update: result.update, remove: result.delete, allRecords }); - if (changePermissions) { - setPermissions(); - } + if (!result.success) { return resolve(); } + + const changePermissions = await updatePermissions({ update: result.update, remove: result.delete, allRecords }); + if (changePermissions) { + setPermissions(); + } + return resolve(); } catch (e) { log(e); return resolve(); From 84bcdbfbc2635ef10402dd40e4642ccacb7e8157 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 15:34:26 -0300 Subject: [PATCH 2/8] Fix IPermission --- app/definitions/IPermission.ts | 2 ++ app/lib/methods/getPermissions.ts | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/definitions/IPermission.ts b/app/definitions/IPermission.ts index 0ccc134652f..91597828d88 100644 --- a/app/definitions/IPermission.ts +++ b/app/definitions/IPermission.ts @@ -2,6 +2,8 @@ import Model from '@nozbe/watermelondb/Model'; export interface IPermission { id: string; + // TODO: waiting for rest api defs + _id?: string; roles: string[]; _updatedAt: Date; } diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 347a95ed807..690bb87327d 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -1,7 +1,6 @@ import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import { Q } from '@nozbe/watermelondb'; import orderBy from 'lodash/orderBy'; -import { IPermissions } from 'reducers/permissions'; import { compareServerVersion } from '../utils'; import database from '../database'; @@ -10,7 +9,7 @@ import { store as reduxStore } from '../auxStore'; import RocketChat from '../rocketchat'; import { setPermissions as setPermissionsAction } from '../../actions/permissions'; import protectedFunction from './helpers/protectedFunction'; -import { IRocketChat, TPermissionModel } from '../../definitions'; +import { IRocketChat, TPermissionModel, IPermission } from '../../definitions'; const PERMISSIONS = [ 'add-user-to-any-c-room', @@ -92,8 +91,8 @@ const updatePermissions = async ({ remove = [], allRecords }: { - update?: IPermissions[]; - remove?: IPermissions[]; + update?: IPermission[]; + remove?: IPermission[]; allRecords: TPermissionModel[]; }) => { if (!((update && update.length) || (remove && remove.length))) { From 6c289117520cbbf5b33e823d34e6a9f962a75179 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 16:06:41 -0300 Subject: [PATCH 3/8] Playing with types --- app/actions/permissions.ts | 4 ++-- app/definitions/redux/index.ts | 4 +++- app/lib/methods/getPermissions.ts | 6 +++--- app/reducers/permissions.test.ts | 8 ++++---- app/reducers/permissions.ts | 7 ++++++- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/app/actions/permissions.ts b/app/actions/permissions.ts index d47118fce88..c1d935254a6 100644 --- a/app/actions/permissions.ts +++ b/app/actions/permissions.ts @@ -1,6 +1,6 @@ import { Action } from 'redux'; -import { IPermissions } from '../reducers/permissions'; +import { IPermissions, TSupportedPermissions } from '../reducers/permissions'; import { PERMISSIONS } from './actionsTypes'; interface ISetPermissions extends Action { @@ -20,7 +20,7 @@ export function setPermissions(permissions: IPermissions): ISetPermissions { }; } -export function updatePermission(id: string, roles: string): IUpdatePermissions { +export function updatePermission(id: TSupportedPermissions, roles: string): IUpdatePermissions { return { type: PERMISSIONS.UPDATE, payload: { id, roles } diff --git a/app/definitions/redux/index.ts b/app/definitions/redux/index.ts index 558882b46d9..d5762f2f61e 100644 --- a/app/definitions/redux/index.ts +++ b/app/definitions/redux/index.ts @@ -1,4 +1,6 @@ // ACTIONS +import { IPermissions } from 'reducers/permissions'; + import { TActionActiveUsers } from '../../actions/activeUsers'; import { TActionApp } from '../../actions/app'; import { TActionCreateChannel } from '../../actions/createChannel'; @@ -47,7 +49,7 @@ export interface IApplicationState { inquiry: any; enterpriseModules: any; encryption: IEncryption; - permissions: any; + permissions: IPermissions; roles: IRoles; } diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 690bb87327d..00c72f1e498 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -11,7 +11,7 @@ import { setPermissions as setPermissionsAction } from '../../actions/permission import protectedFunction from './helpers/protectedFunction'; import { IRocketChat, TPermissionModel, IPermission } from '../../definitions'; -const PERMISSIONS = [ +export const SUPPORTED_PERMISSIONS = [ 'add-user-to-any-c-room', 'add-user-to-any-p-room', 'add-user-to-joined-room', @@ -58,12 +58,12 @@ const PERMISSIONS = [ 'edit-livechat-room-customfields', 'view-canned-responses', 'mobile-upload-file' -]; +] as const; export async function setPermissions(): Promise { const db = database.active; const permissionsCollection = db.get('permissions'); - const allPermissions = await permissionsCollection.query(Q.where('id', Q.oneOf(PERMISSIONS))).fetch(); + const allPermissions = await permissionsCollection.query(Q.where('id', Q.oneOf(SUPPORTED_PERMISSIONS))).fetch(); const parsed = allPermissions.reduce((acc, item) => ({ ...acc, [item.id]: item.roles }), {}); reduxStore.dispatch(setPermissionsAction(parsed)); diff --git a/app/reducers/permissions.test.ts b/app/reducers/permissions.test.ts index 8980a44282f..433c7f40515 100644 --- a/app/reducers/permissions.test.ts +++ b/app/reducers/permissions.test.ts @@ -1,6 +1,6 @@ import { setPermissions, updatePermission } from '../actions/permissions'; import { mockedStore } from './mockedStore'; -import { initialState } from './permissions'; +import { initialState, IPermissions } from './permissions'; describe('test permissions reducer', () => { it('should return initial state', () => { @@ -9,15 +9,15 @@ describe('test permissions reducer', () => { }); it('should return modified store after setPermissions', () => { - const permissions = { hasEditPermission: 'enabled', hasForceDeletePermission: 'enabled' }; + const permissions: IPermissions = { 'add-user-to-any-c-room': ['admin'], 'add-team-channel': ['user'] }; mockedStore.dispatch(setPermissions(permissions)); const state = mockedStore.getState().permissions; expect(state).toEqual(permissions); }); it('should return empty store after remove user', () => { - mockedStore.dispatch(updatePermission('hasEditPermission', 'disabled')); + mockedStore.dispatch(updatePermission('add-team-channel', 'owner')); const state = mockedStore.getState().permissions; - expect(state.hasEditPermission).toEqual('disabled'); + expect(state['add-team-channel']).toEqual('owner'); }); }); diff --git a/app/reducers/permissions.ts b/app/reducers/permissions.ts index a80a4e87ef3..0ded43f896b 100644 --- a/app/reducers/permissions.ts +++ b/app/reducers/permissions.ts @@ -1,7 +1,12 @@ import { PERMISSIONS } from '../actions/actionsTypes'; import { TActionPermissions } from '../actions/permissions'; +import { SUPPORTED_PERMISSIONS } from '../lib/methods/getPermissions'; -export type IPermissions = Record; +export type TSupportedPermissions = typeof SUPPORTED_PERMISSIONS[number]; + +export type IPermissions = { + [K in TSupportedPermissions]?: string[]; +}; export const initialState: IPermissions = {}; From ded52a3b2d70ada9309e7aac0c76896bc3b6b62e Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 16:46:24 -0300 Subject: [PATCH 4/8] Remove `as const` --- app/actions/permissions.ts | 10 +++++----- app/lib/methods/getPermissions.ts | 2 +- app/reducers/permissions.test.ts | 6 +++--- app/reducers/permissions.ts | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/actions/permissions.ts b/app/actions/permissions.ts index c1d935254a6..0c79b2e8508 100644 --- a/app/actions/permissions.ts +++ b/app/actions/permissions.ts @@ -1,26 +1,26 @@ import { Action } from 'redux'; -import { IPermissions, TSupportedPermissions } from '../reducers/permissions'; +import { IPermissionsState, TSupportedPermissions } from '../reducers/permissions'; import { PERMISSIONS } from './actionsTypes'; interface ISetPermissions extends Action { - permissions: IPermissions; + permissions: IPermissionsState; } interface IUpdatePermissions extends Action { - payload: { id: string; roles: string }; + payload: { id: TSupportedPermissions; roles: string[] }; } export type TActionPermissions = ISetPermissions & IUpdatePermissions; -export function setPermissions(permissions: IPermissions): ISetPermissions { +export function setPermissions(permissions: IPermissionsState): ISetPermissions { return { type: PERMISSIONS.SET, permissions }; } -export function updatePermission(id: TSupportedPermissions, roles: string): IUpdatePermissions { +export function updatePermission(id: TSupportedPermissions, roles: string[]): IUpdatePermissions { return { type: PERMISSIONS.UPDATE, payload: { id, roles } diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 00c72f1e498..84c393138e7 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -58,7 +58,7 @@ export const SUPPORTED_PERMISSIONS = [ 'edit-livechat-room-customfields', 'view-canned-responses', 'mobile-upload-file' -] as const; +]; export async function setPermissions(): Promise { const db = database.active; diff --git a/app/reducers/permissions.test.ts b/app/reducers/permissions.test.ts index 433c7f40515..412433764c7 100644 --- a/app/reducers/permissions.test.ts +++ b/app/reducers/permissions.test.ts @@ -1,6 +1,6 @@ import { setPermissions, updatePermission } from '../actions/permissions'; import { mockedStore } from './mockedStore'; -import { initialState, IPermissions } from './permissions'; +import { initialState, IPermissionsState } from './permissions'; describe('test permissions reducer', () => { it('should return initial state', () => { @@ -9,14 +9,14 @@ describe('test permissions reducer', () => { }); it('should return modified store after setPermissions', () => { - const permissions: IPermissions = { 'add-user-to-any-c-room': ['admin'], 'add-team-channel': ['user'] }; + const permissions: IPermissionsState = { 'add-user-to-any-c-room': ['admin'], 'add-team-channel': ['user'] }; mockedStore.dispatch(setPermissions(permissions)); const state = mockedStore.getState().permissions; expect(state).toEqual(permissions); }); it('should return empty store after remove user', () => { - mockedStore.dispatch(updatePermission('add-team-channel', 'owner')); + mockedStore.dispatch(updatePermission('add-team-channel', ['owner'])); const state = mockedStore.getState().permissions; expect(state['add-team-channel']).toEqual('owner'); }); diff --git a/app/reducers/permissions.ts b/app/reducers/permissions.ts index 0ded43f896b..d2887a55507 100644 --- a/app/reducers/permissions.ts +++ b/app/reducers/permissions.ts @@ -4,13 +4,13 @@ import { SUPPORTED_PERMISSIONS } from '../lib/methods/getPermissions'; export type TSupportedPermissions = typeof SUPPORTED_PERMISSIONS[number]; -export type IPermissions = { +export type IPermissionsState = { [K in TSupportedPermissions]?: string[]; }; -export const initialState: IPermissions = {}; +export const initialState: IPermissionsState = {}; -export default function permissions(state = initialState, action: TActionPermissions): IPermissions { +export default function permissions(state = initialState, action: TActionPermissions): IPermissionsState { switch (action.type) { case PERMISSIONS.SET: return action.permissions; From b8af3b5058b6f5ef79c09daa3687b86cb51924db Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 16:57:44 -0300 Subject: [PATCH 5/8] Fix lint --- app/definitions/redux/index.ts | 5 ++--- app/views/CreateChannelView.tsx | 4 ++-- app/views/LivechatEditView.tsx | 4 ++-- app/views/NewMessageView.tsx | 10 +++++----- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/definitions/redux/index.ts b/app/definitions/redux/index.ts index d5762f2f61e..542991ace48 100644 --- a/app/definitions/redux/index.ts +++ b/app/definitions/redux/index.ts @@ -1,6 +1,4 @@ // ACTIONS -import { IPermissions } from 'reducers/permissions'; - import { TActionActiveUsers } from '../../actions/activeUsers'; import { TActionApp } from '../../actions/app'; import { TActionCreateChannel } from '../../actions/createChannel'; @@ -28,6 +26,7 @@ import { ISelectedUsers } from '../../reducers/selectedUsers'; import { IServer } from '../../reducers/server'; import { ISettings } from '../../reducers/settings'; import { IShare } from '../../reducers/share'; +import { IPermissionsState } from '../../reducers/permissions'; export interface IApplicationState { settings: ISettings; @@ -49,7 +48,7 @@ export interface IApplicationState { inquiry: any; enterpriseModules: any; encryption: IEncryption; - permissions: IPermissions; + permissions: IPermissionsState; roles: IRoles; } diff --git a/app/views/CreateChannelView.tsx b/app/views/CreateChannelView.tsx index 6a11639ba82..43df75fbf90 100644 --- a/app/views/CreateChannelView.tsx +++ b/app/views/CreateChannelView.tsx @@ -96,8 +96,8 @@ interface ICreateChannelViewProps extends IBaseScreen; route: RouteProp; theme: string; - editOmnichannelContact: string[]; - editLivechatRoomCustomfields: string[]; + editOmnichannelContact: string[] | undefined; + editLivechatRoomCustomfields: string[] | undefined; } const Title = ({ title, theme }: ITitle) => diff --git a/app/views/NewMessageView.tsx b/app/views/NewMessageView.tsx index 729f42b0de8..1cc84a21e7e 100644 --- a/app/views/NewMessageView.tsx +++ b/app/views/NewMessageView.tsx @@ -77,11 +77,11 @@ interface INewMessageViewProps extends IBaseScreen { maxUsers: number; isMasterDetail: boolean; serverVersion: string; - createTeamPermission: string[]; - createDirectMessagePermission: string[]; - createPublicChannelPermission: string[]; - createPrivateChannelPermission: string[]; - createDiscussionPermission: string[]; + createTeamPermission: string[] | undefined; + createDirectMessagePermission: string[] | undefined; + createPublicChannelPermission: string[] | undefined; + createPrivateChannelPermission: string[] | undefined; + createDiscussionPermission: string[] | undefined; } class NewMessageView extends React.Component { From 8b784738e8f98cc7a0dd1cdf992b1f8a994d4a16 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Feb 2022 17:30:00 -0300 Subject: [PATCH 6/8] Fix test --- app/reducers/permissions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/reducers/permissions.test.ts b/app/reducers/permissions.test.ts index 412433764c7..0d6d8b28775 100644 --- a/app/reducers/permissions.test.ts +++ b/app/reducers/permissions.test.ts @@ -18,6 +18,6 @@ describe('test permissions reducer', () => { it('should return empty store after remove user', () => { mockedStore.dispatch(updatePermission('add-team-channel', ['owner'])); const state = mockedStore.getState().permissions; - expect(state['add-team-channel']).toEqual('owner'); + expect(state['add-team-channel']).toEqual(['owner']); }); }); From 32c97e66dff1114667da1816729d603729a52006 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Mon, 14 Feb 2022 15:13:59 -0300 Subject: [PATCH 7/8] Apply sdk --- app/definitions/IPermission.ts | 6 ++---- app/lib/methods/getPermissions.ts | 18 ++++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app/definitions/IPermission.ts b/app/definitions/IPermission.ts index 91597828d88..5583f3edd58 100644 --- a/app/definitions/IPermission.ts +++ b/app/definitions/IPermission.ts @@ -1,11 +1,9 @@ import Model from '@nozbe/watermelondb/Model'; export interface IPermission { - id: string; - // TODO: waiting for rest api defs - _id?: string; + _id: string; roles: string[]; - _updatedAt: Date; + _updatedAt: Date | string; } export type TPermissionModel = IPermission & Model; diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 84c393138e7..59b4282d894 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -7,9 +7,10 @@ import database from '../database'; import log from '../../utils/log'; import { store as reduxStore } from '../auxStore'; import RocketChat from '../rocketchat'; +import sdk from '../rocketchat/services/sdk'; import { setPermissions as setPermissionsAction } from '../../actions/permissions'; import protectedFunction from './helpers/protectedFunction'; -import { IRocketChat, TPermissionModel, IPermission } from '../../definitions'; +import { TPermissionModel, IPermission } from '../../definitions'; export const SUPPORTED_PERMISSIONS = [ 'add-user-to-any-c-room', @@ -79,7 +80,7 @@ const getUpdatedSince = (allRecords: TPermissionModel[]) => { ['_updatedAt'], ['desc'] ); - return ordered && ordered[0]._updatedAt.toISOString(); + return new Date(ordered[0]._updatedAt).toISOString(); } catch (e) { log(e); } @@ -144,7 +145,7 @@ const updatePermissions = async ({ } }; -export function getPermissions(this: IRocketChat): Promise { +export function getPermissions(): Promise { return new Promise(async resolve => { try { const serverVersion: string | null = reduxStore.getState().server.version; @@ -155,7 +156,8 @@ export function getPermissions(this: IRocketChat): Promise { // if server version is lower than 0.73.0, fetches from old api if (serverVersion && compareServerVersion(serverVersion, 'lowerThan', '0.73.0')) { // RC 0.66.0 - const result = await this.sdk.get('permissions.list'); + // @ts-ignore + const result: any = await sdk.get('permissions.list'); if (!result.success) { return resolve(); } @@ -172,13 +174,9 @@ export function getPermissions(this: IRocketChat): Promise { params.updatedSince = updatedSince; } // RC 0.73.0 - const result = await this.sdk.get('permissions.listAll', params); + const result = await sdk.get('permissions.listAll', params); - if (!result.success) { - return resolve(); - } - - const changePermissions = await updatePermissions({ update: result.update, remove: result.delete, allRecords }); + const changePermissions = await updatePermissions({ update: result.update, remove: result.remove, allRecords }); if (changePermissions) { setPermissions(); } From 7a9d9d2398a17ecff074912543a53fedd2f7c714 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 17 Feb 2022 09:58:43 -0300 Subject: [PATCH 8/8] Fix lint and autocomplete --- app/definitions/redux/index.ts | 2 ++ app/lib/methods/getPermissions.ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/definitions/redux/index.ts b/app/definitions/redux/index.ts index ff93a9d1c8a..e23f5e321c7 100644 --- a/app/definitions/redux/index.ts +++ b/app/definitions/redux/index.ts @@ -13,6 +13,7 @@ import { IActionSettings } from '../../actions/settings'; import { TActionsShare } from '../../actions/share'; import { TActionSortPreferences } from '../../actions/sortPreferences'; import { TActionUserTyping } from '../../actions/usersTyping'; +import { TActionPermissions } from '../../actions/permissions'; import { TActionEnterpriseModules } from '../../actions/enterpriseModules'; // REDUCERS import { IActiveUsers } from '../../reducers/activeUsers'; @@ -68,4 +69,5 @@ export type TApplicationActions = TActionActiveUsers & TActionsShare & TActionServer & TActionApp & + TActionPermissions & TActionEnterpriseModules; diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 59b4282d894..fa807d7fa5c 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -59,12 +59,14 @@ export const SUPPORTED_PERMISSIONS = [ 'edit-livechat-room-customfields', 'view-canned-responses', 'mobile-upload-file' -]; +] as const; export async function setPermissions(): Promise { const db = database.active; const permissionsCollection = db.get('permissions'); - const allPermissions = await permissionsCollection.query(Q.where('id', Q.oneOf(SUPPORTED_PERMISSIONS))).fetch(); + const allPermissions = await permissionsCollection + .query(Q.where('id', Q.oneOf(SUPPORTED_PERMISSIONS as unknown as string[]))) + .fetch(); const parsed = allPermissions.reduce((acc, item) => ({ ...acc, [item.id]: item.roles }), {}); reduxStore.dispatch(setPermissionsAction(parsed)); @@ -176,6 +178,10 @@ export function getPermissions(): Promise { // RC 0.73.0 const result = await sdk.get('permissions.listAll', params); + if (!result.success) { + return resolve(); + } + const changePermissions = await updatePermissions({ update: result.update, remove: result.remove, allRecords }); if (changePermissions) { setPermissions();