Add membership handling

This commit is contained in:
Henrik Hüttemann 2023-06-14 15:02:10 +02:00
parent 8b8b7b290d
commit ab597195da
No known key found for this signature in database
GPG Key ID: 9F7BD10E0A8A111E
3 changed files with 58 additions and 5 deletions

View File

@ -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,

View File

@ -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<MatrixRoom> {
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<MatrixRoom> {
}
}
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
}

View File

@ -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)
}