Skip to content

Commit 61839db

Browse files
committed
fix: room creation with new federated user
1 parent 5753401 commit 61839db

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

apps/meteor/app/lib/server/functions/createRoom.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AppEvents, Apps } from '@rocket.chat/apps';
22
import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions';
3-
import { Message, Team } from '@rocket.chat/core-services';
3+
import { FederationMatrix, Message, Team } from '@rocket.chat/core-services';
44
import type { ICreateRoomParams, ISubscriptionExtraData } from '@rocket.chat/core-services';
55
import type { ICreatedRoom, IUser, IRoom, RoomType } from '@rocket.chat/core-typings';
66
import { isRoomNativeFederated } from '@rocket.chat/core-typings';
@@ -63,10 +63,13 @@ async function createUsersSubscriptions({
6363
// Invite federated members to the room SYNCRONOUSLY,
6464
// since we do not use to invite lots of users at once, this is acceptable.
6565
const membersToInvite = members.filter((m) => m !== owner.username);
66+
67+
await FederationMatrix.ensureFederatedUsersExistLocally(membersToInvite);
68+
6669
for await (const memberUsername of membersToInvite) {
6770
const member = await Users.findOneByUsername(memberUsername);
6871
if (!member) {
69-
continue;
72+
throw new Error('Federated user not found locally');
7073
}
7174

7275
await performAddUserToRoom(room._id, member, owner, {

apps/meteor/ee/server/hooks/federation/index.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { FederationMatrix, Authorization, MeteorError } from '@rocket.chat/core-services';
2-
import { isEditedMessage, isUserNativeFederated, type IMessage, type IRoom, type IUser } from '@rocket.chat/core-typings';
2+
import {
3+
isEditedMessage,
4+
isRoomNativeFederated,
5+
isUserNativeFederated,
6+
type IMessage,
7+
type IRoom,
8+
type IUser,
9+
} from '@rocket.chat/core-typings';
310
import { Rooms } from '@rocket.chat/models';
411

512
import { callbacks } from '../../../../lib/callbacks';
@@ -15,21 +22,36 @@ import { FederationActions } from '../../../../server/services/room/hooks/Before
1522

1623
// Called BEFORE subscriptions are created - creates Matrix room so invites can be sent.
1724
// The invites are sent by beforeAddUserToRoom callback.
18-
callbacks.add('federation.afterCreateFederatedRoom', async (room, { owner }) => {
19-
if (FederationActions.shouldPerformFederationAction(room)) {
20-
const federatedRoomId = room?.federation?.mrid;
21-
if (!federatedRoomId) {
22-
await FederationMatrix.createRoom(room, owner);
23-
} else {
24-
// matrix room was already created and passed
25-
const fromServer = federatedRoomId.split(':')[1];
25+
callbacks.add('federation.afterCreateFederatedRoom', async (room, { owner, originalMemberList: members }) => {
26+
if (!FederationActions.shouldPerformFederationAction(room)) {
27+
return;
28+
}
2629

27-
await Rooms.setAsFederated(room._id, {
28-
mrid: federatedRoomId,
29-
origin: fromServer,
30-
});
31-
}
30+
const federatedRoomId = room?.federation?.mrid;
31+
if (!federatedRoomId) {
32+
await FederationMatrix.createRoom(room, owner);
33+
} else {
34+
// TODO unify how to get server
35+
// matrix room was already created and passed
36+
const fromServer = federatedRoomId.split(':')[1];
37+
38+
await Rooms.setAsFederated(room._id, {
39+
mrid: federatedRoomId,
40+
origin: fromServer,
41+
});
42+
}
43+
44+
const federationRoom = await Rooms.findOneById(room._id);
45+
if (!federationRoom || !isRoomNativeFederated(federationRoom)) {
46+
throw new MeteorError('error-invalid-room', 'Invalid room');
3247
}
48+
49+
// TODO this won't be neeeded once we receive all state events at ee/packages/federation-matrix/src/events/member.ts
50+
await FederationMatrix.inviteUsersToRoom(
51+
federationRoom,
52+
members.filter((member) => member !== owner.username),
53+
owner,
54+
);
3355
});
3456

3557
callbacks.add(

0 commit comments

Comments
 (0)