From ab597195da0bfd0a1a57b3195005081984b9f8c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20H=C3=BCttemann?= Date: Wed, 14 Jun 2023 15:02:10 +0200 Subject: [PATCH] Add membership handling --- src/app.ts | 4 ++-- src/handlers/rooms.ts | 46 +++++++++++++++++++++++++++++++++++++++--- src/helpers/storage.ts | 13 ++++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/app.ts b/src/app.ts index 2146061..f50a1c3 100644 --- a/src/app.ts +++ b/src/app.ts @@ -51,7 +51,7 @@ async function loadRcExport(entity: Entities) { switch (entity) { case Entities.Users: const rcUser: RcUser = item - log.debug(`Parsing user: ${rcUser.name}: ${rcUser._id}`) + log.info(`Parsing user: ${rcUser.name}: ${rcUser._id}`) // Check for exclusion if ( @@ -89,7 +89,7 @@ async function loadRcExport(entity: Entities) { case Entities.Rooms: const rcRoom: RcRoom = item - log.debug(`Room: ${rcRoom.name}`, rcRoom) + log.info(`Parsing room ${rcRoom.name || 'with ID: ' + rcRoom._id}`) let roomMapping = await getMapping( rcRoom._id, diff --git a/src/handlers/rooms.ts b/src/handlers/rooms.ts index d9b6648..1f1d214 100644 --- a/src/handlers/rooms.ts +++ b/src/handlers/rooms.ts @@ -1,5 +1,10 @@ +import { IdMapping } from '../entity/IdMapping' import log from '../helpers/logger' -import { createMembership } from '../helpers/storage' +import { + createMembership, + getMapping, + getMemberships, +} from '../helpers/storage' import { axios, getUserSessionOptions } from '../helpers/synapse' import { RcUser } from './users' @@ -102,11 +107,13 @@ export async function parseMemberships(rcRoom: RcRoom) { export async function createRoom(rcRoom: RcRoom): Promise { const room: MatrixRoom = mapRoom(rcRoom) + const creatorId = room._creatorId || '' + delete room._creatorId await parseMemberships(rcRoom) let sessionOptions = {} if (room._creatorId) { try { - sessionOptions = await getUserSessionOptions(room._creatorId) + sessionOptions = await getUserSessionOptions(creatorId) log.debug('Room user session generated:', sessionOptions) } catch (error) { log.warn(error) @@ -114,13 +121,46 @@ export async function createRoom(rcRoom: RcRoom): Promise { } } log.debug('Creating room:', room) - delete room._creatorId room.room_id = ( await axios.post('/_matrix/client/v3/createRoom', room, sessionOptions) ).data.room_id // TODO: Invite members and let them join + const members = await getMemberships(rcRoom._id) + log.info(`Inviting members to room ${rcRoom._id}:`, members) + + const memberMappings = ( + await Promise.all( + members + .filter((rcMemberId) => rcMemberId != creatorId) + .map(async (rcMemberId) => await getMapping(rcMemberId, 0)) + ) + ) + .filter((mapping): mapping is IdMapping => mapping != null) + .map(async (mapping) => { + log.http(`Invite member ${mapping.rcId} aka. ${mapping.matrixId}`) + await axios.post( + `/_matrix/client/v3/rooms/${room.room_id}/invite`, + { user_id: mapping.matrixId }, + sessionOptions + ) + + log.http( + `Accepting invitation for member ${mapping.rcId} aka. ${mapping.matrixId}` + ) + await axios.post( + `/_matrix/client/v3/join/${room.room_id}`, + {}, + { + headers: { + Authorization: `Bearer ${mapping.accessToken}`, + }, + } + ) + }) + + await Promise.all(memberMappings) return room } diff --git a/src/helpers/storage.ts b/src/helpers/storage.ts index 3ac80d4..3b8c8d3 100644 --- a/src/helpers/storage.ts +++ b/src/helpers/storage.ts @@ -36,3 +36,16 @@ export async function createMembership(rcRoomId: string, rcUserId: string) { await save(membership) } + +export async function getMemberships(rcRoomId: string) { + return ( + await AppDataSource.manager.find(Membership, { + select: { + rcUserId: true, + }, + where: { + rcRoomId: rcRoomId, + }, + }) + ).map((entity) => entity.rcUserId) +}