From c9c08c552752299eac09894984f3cbf9437c1bf5 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Wed, 20 Jul 2022 20:34:47 +0530 Subject: [PATCH 1/3] Ability for apps-engine to archive or unarchive rooms --- apps/meteor/app/apps/server/bridges/rooms.ts | 12 +++++++++++- apps/meteor/app/apps/server/converters/rooms.js | 6 ++++++ apps/meteor/app/lib/server/functions/archiveRoom.ts | 6 ++++-- .../meteor/app/lib/server/functions/unarchiveRoom.ts | 6 ++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/apps/meteor/app/apps/server/bridges/rooms.ts b/apps/meteor/app/apps/server/bridges/rooms.ts index e2f4db549c07a..be472ed53de76 100644 --- a/apps/meteor/app/apps/server/bridges/rooms.ts +++ b/apps/meteor/app/apps/server/bridges/rooms.ts @@ -8,6 +8,7 @@ import type { ISubscription } from '@rocket.chat/core-typings'; import { AppServerOrchestrator } from '../orchestrator'; import { Rooms, Subscriptions, Users } from '../../../models/server'; import { addUserToRoom } from '../../../lib/server/functions/addUserToRoom'; +import { archiveRoom, unarchiveRoom } from '../../../lib/server'; export class AppRoomBridge extends RoomBridge { // eslint-disable-next-line no-empty-function @@ -113,7 +114,8 @@ export class AppRoomBridge extends RoomBridge { protected async update(room: IRoom, members: Array = [], appId: string): Promise { this.orch.debugLog(`The App ${appId} is updating a room.`); - if (!room.id || !Rooms.findOneById(room.id)) { + const roomBeforeUpdate = Rooms.findOneById(room.id); + if (!room.id || !roomBeforeUpdate) { throw new Error('A room must exist to update.'); } @@ -121,6 +123,14 @@ export class AppRoomBridge extends RoomBridge { Rooms.update(rm._id, rm); + if (rm.archived !== roomBeforeUpdate.archived) { + if (rm.archived) { + archiveRoom(rm._id, true); + } else { + unarchiveRoom(rm._id, true); + } + } + for (const username of members) { const member = Users.findOneByUsername(username, {}); diff --git a/apps/meteor/app/apps/server/converters/rooms.js b/apps/meteor/app/apps/server/converters/rooms.js index 4a9f6225af15a..93e07b035f174 100644 --- a/apps/meteor/app/apps/server/converters/rooms.js +++ b/apps/meteor/app/apps/server/converters/rooms.js @@ -101,6 +101,7 @@ export class AppRoomsConverter { ...room.source, }, }), + ...(room.isArchived && { archived: room.isArchived }), }; return Object.assign(newRoom, room._unmappedProperties_); @@ -129,6 +130,11 @@ export class AppRoomsConverter { _USERNAMES: '_USERNAMES', description: 'description', source: 'source', + isArchived: (room) => { + const stat = Boolean(room.archived); + delete room.archived; + return stat; + }, isDefault: (room) => { const result = !!room.default; delete room.default; diff --git a/apps/meteor/app/lib/server/functions/archiveRoom.ts b/apps/meteor/app/lib/server/functions/archiveRoom.ts index 335a73b85aac8..2946b49530d37 100644 --- a/apps/meteor/app/lib/server/functions/archiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/archiveRoom.ts @@ -3,8 +3,10 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; -export const archiveRoom = function (rid: string): void { - Rooms.archiveById(rid); +export const archiveRoom = function (rid: string, roomCollectionUpdated: boolean = false): void { + if (!roomCollectionUpdated) { + Rooms.archiveById(rid); + } Subscriptions.archiveByRoomId(rid); Messages.createRoomArchivedByRoomIdAndUser(rid, Meteor.user()); diff --git a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts index 5f1ab1415f77c..06b6b2dca89ae 100644 --- a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts @@ -2,8 +2,10 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; -export const unarchiveRoom = function (rid: string): void { - Rooms.unarchiveById(rid); +export const unarchiveRoom = function (rid: string, roomCollectionUpdated: boolean = false): void { + if (!roomCollectionUpdated) { + Rooms.unarchiveById(rid); + } Subscriptions.unarchiveByRoomId(rid); Messages.createRoomUnarchivedByRoomIdAndUser(rid, Meteor.user()); }; From c3d78f198deecc9622190e96fe3ff0b00cd7fd55 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Wed, 20 Jul 2022 21:03:38 +0530 Subject: [PATCH 2/3] Silly lint issue --- apps/meteor/app/lib/server/functions/archiveRoom.ts | 2 +- apps/meteor/app/lib/server/functions/unarchiveRoom.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/meteor/app/lib/server/functions/archiveRoom.ts b/apps/meteor/app/lib/server/functions/archiveRoom.ts index 2946b49530d37..e8f481cee8d85 100644 --- a/apps/meteor/app/lib/server/functions/archiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/archiveRoom.ts @@ -3,7 +3,7 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; -export const archiveRoom = function (rid: string, roomCollectionUpdated: boolean = false): void { +export const archiveRoom = function (rid: string, roomCollectionUpdated = false): void { if (!roomCollectionUpdated) { Rooms.archiveById(rid); } diff --git a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts index 06b6b2dca89ae..3b79a766f2d90 100644 --- a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; -export const unarchiveRoom = function (rid: string, roomCollectionUpdated: boolean = false): void { +export const unarchiveRoom = function (rid: string, roomCollectionUpdated = false): void { if (!roomCollectionUpdated) { Rooms.unarchiveById(rid); } From a9d64bb4c983b293eecd87f88e2fd502a03d0cae Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Wed, 24 Aug 2022 02:18:08 +0530 Subject: [PATCH 3/3] Add separate archive unarchive methods --- .gitignore | 1 + apps/meteor/app/apps/server/bridges/rooms.ts | 30 ++++++++++++++----- .../app/lib/server/functions/archiveRoom.ts | 6 ++-- .../app/lib/server/functions/unarchiveRoom.ts | 6 ++-- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 310be7ef939d6..c46cc21b1a414 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ yarn-error.log* .nvmrc .idea/ +.envrc diff --git a/apps/meteor/app/apps/server/bridges/rooms.ts b/apps/meteor/app/apps/server/bridges/rooms.ts index a32e172a67814..4f3d83814d90d 100644 --- a/apps/meteor/app/apps/server/bridges/rooms.ts +++ b/apps/meteor/app/apps/server/bridges/rooms.ts @@ -119,14 +119,6 @@ export class AppRoomBridge extends RoomBridge { Rooms.update(rm._id, rm); - if (rm.archived !== roomBeforeUpdate.archived) { - if (rm.archived) { - archiveRoom(rm._id, true); - } else { - unarchiveRoom(rm._id, true); - } - } - for (const username of members) { const member = Users.findOneByUsername(username, {}); @@ -179,4 +171,26 @@ export class AppRoomBridge extends RoomBridge { return rid; } + + protected async archiveRoom(room: IRoom, appId: string): Promise { + this.orch.debugLog(`The App ${appId} is archiving a room`); + try { + archiveRoom(room.id); + } catch (error) { + this.orch.getRocketChatLogger().error(error); + return false; + } + return true; + } + + protected async unarchiveRoom(room: IRoom, appId: string): Promise { + this.orch.debugLog(`The App ${appId} is unarchiving a room`); + try { + unarchiveRoom(room.id); + } catch (error) { + this.orch.getRocketChatLogger().error(error); + return false; + } + return true; + } } diff --git a/apps/meteor/app/lib/server/functions/archiveRoom.ts b/apps/meteor/app/lib/server/functions/archiveRoom.ts index e8f481cee8d85..335a73b85aac8 100644 --- a/apps/meteor/app/lib/server/functions/archiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/archiveRoom.ts @@ -3,10 +3,8 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; import { callbacks } from '../../../../lib/callbacks'; -export const archiveRoom = function (rid: string, roomCollectionUpdated = false): void { - if (!roomCollectionUpdated) { - Rooms.archiveById(rid); - } +export const archiveRoom = function (rid: string): void { + Rooms.archiveById(rid); Subscriptions.archiveByRoomId(rid); Messages.createRoomArchivedByRoomIdAndUser(rid, Meteor.user()); diff --git a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts index 3b79a766f2d90..5f1ab1415f77c 100644 --- a/apps/meteor/app/lib/server/functions/unarchiveRoom.ts +++ b/apps/meteor/app/lib/server/functions/unarchiveRoom.ts @@ -2,10 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Rooms, Messages, Subscriptions } from '../../../models/server'; -export const unarchiveRoom = function (rid: string, roomCollectionUpdated = false): void { - if (!roomCollectionUpdated) { - Rooms.unarchiveById(rid); - } +export const unarchiveRoom = function (rid: string): void { + Rooms.unarchiveById(rid); Subscriptions.unarchiveByRoomId(rid); Messages.createRoomUnarchivedByRoomIdAndUser(rid, Meteor.user()); };