Edit mapping types to use constants

This commit is contained in:
Henrik Hüttemann 2023-06-23 15:43:31 +02:00
parent 6b723db5a1
commit 8ba2ce4cab
No known key found for this signature in database
GPG Key ID: 9F7BD10E0A8A111E
8 changed files with 66 additions and 48 deletions

27
src/Entities.ts Normal file
View File

@ -0,0 +1,27 @@
export const enum Entity {
Users = 'users',
Rooms = 'rooms',
Messages = 'messages',
}
type EntityConfig = {
filename: string
mappingType: number
}
export const entities: {
[key in Entity]: EntityConfig
} = {
users: {
filename: 'users.json',
mappingType: 0,
},
rooms: {
filename: 'rocketchat_room.json',
mappingType: 1,
},
messages: {
filename: 'rocketchat_message.json',
mappingType: 2,
},
} as const

View File

@ -7,51 +7,26 @@ import { handle as handleUser } from './handlers/users'
import log from './helpers/logger' import log from './helpers/logger'
import { initStorage } from './helpers/storage' import { initStorage } from './helpers/storage'
import { whoami } from './helpers/synapse' import { whoami } from './helpers/synapse'
import { Entity, entities } from './Entities'
log.info('rocketchat2matrix starts.') log.info('rocketchat2matrix starts.')
const enum Entities { async function loadRcExport(entity: Entity) {
Users = 'users',
Rooms = 'rooms',
Messages = 'messages',
}
type EntityConfig = {
filename: string
mappingType: number
}
const entities: { [key in Entities]: EntityConfig } = {
users: {
filename: 'users.json',
mappingType: 0,
},
rooms: {
filename: 'rocketchat_room.json',
mappingType: 1,
},
messages: {
filename: 'rocketchat_message.json',
mappingType: 2,
},
}
async function loadRcExport(entity: Entities) {
const rl = new lineByLine(`./inputs/${entities[entity].filename}`) const rl = new lineByLine(`./inputs/${entities[entity].filename}`)
let line: false | Buffer let line: false | Buffer
while ((line = rl.next())) { while ((line = rl.next())) {
const item = JSON.parse(line.toString()) const item = JSON.parse(line.toString())
switch (entity) { switch (entity) {
case Entities.Users: case Entity.Users:
await handleUser(item) await handleUser(item)
break break
case Entities.Rooms: case Entity.Rooms:
await handleRoom(item) await handleRoom(item)
break break
case Entities.Messages: case Entity.Messages:
log.debug(`Message: ${item.name}`) log.debug(`Message: ${item.name}`)
break break
@ -66,9 +41,9 @@ async function main() {
await whoami() await whoami()
await initStorage() await initStorage()
log.info('Parsing users') log.info('Parsing users')
await loadRcExport(Entities.Users) await loadRcExport(Entity.Users)
log.info('Parsing rooms') log.info('Parsing rooms')
await loadRcExport(Entities.Rooms) await loadRcExport(Entity.Rooms)
log.info('Done.') log.info('Done.')
} catch (error) { } catch (error) {
log.error(`Encountered an error while booting up: ${error}`, error) log.error(`Encountered an error while booting up: ${error}`, error)

View File

@ -17,6 +17,7 @@ import {
createDirectChatMemberships, createDirectChatMemberships,
registerRoom, registerRoom,
} from './rooms' } from './rooms'
import { Entity, entities } from '../Entities'
jest.mock('axios') jest.mock('axios')
const mockedAxios = axios as jest.Mocked<typeof axios> const mockedAxios = axios as jest.Mocked<typeof axios>
@ -177,7 +178,7 @@ test('accepting invitation by joining the room', async () => {
rcId: 'whatever', rcId: 'whatever',
matrixId: 'Neo', matrixId: 'Neo',
accessToken: 'secretAuthToken', accessToken: 'secretAuthToken',
type: 0, type: entities[Entity.Users].mappingType,
}, },
room_id room_id
) )
@ -202,7 +203,7 @@ test('filtering members', async () => {
return { return {
rcId, rcId,
matrixId: `@${rcId}:matrix`, matrixId: `@${rcId}:matrix`,
type: type || 0, type: type || entities[Entity.Users].mappingType,
accessToken: 'accessToken', accessToken: 'accessToken',
} }
} }
@ -215,9 +216,18 @@ test('filtering members', async () => {
mockMapping('existingUser'), mockMapping('existingUser'),
mockMapping('otherExistingUser'), mockMapping('otherExistingUser'),
]) ])
expect(mockedStorage.getMapping).toBeCalledWith('existingUser', 0) expect(mockedStorage.getMapping).toBeCalledWith(
expect(mockedStorage.getMapping).toBeCalledWith('otherExistingUser', 0) 'existingUser',
expect(mockedStorage.getMapping).toBeCalledWith('excludedUser', 0) entities[Entity.Users].mappingType
)
expect(mockedStorage.getMapping).toBeCalledWith(
'otherExistingUser',
entities[Entity.Users].mappingType
)
expect(mockedStorage.getMapping).toBeCalledWith(
'excludedUser',
entities[Entity.Users].mappingType
)
}) })
test('creating mapping', async () => { test('creating mapping', async () => {
@ -227,7 +237,7 @@ test('creating mapping', async () => {
expect(mockedStorage.save).toHaveBeenCalledWith({ expect(mockedStorage.save).toHaveBeenCalledWith({
rcId: rcPublicRoom._id, rcId: rcPublicRoom._id,
matrixId: room_id, matrixId: room_id,
type: 1, type: entities[Entity.Rooms].mappingType,
accessToken: undefined, accessToken: undefined,
} as IdMapping) } as IdMapping)
}) })

View File

@ -1,3 +1,4 @@
import { Entity, entities } from '../Entities'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import log from '../helpers/logger' import log from '../helpers/logger'
import { import {
@ -193,7 +194,7 @@ export async function createMapping(
const roomMapping = new IdMapping() const roomMapping = new IdMapping()
roomMapping.rcId = rcId roomMapping.rcId = rcId
roomMapping.matrixId = matrixRoom.room_id roomMapping.matrixId = matrixRoom.room_id
roomMapping.type = 1 roomMapping.type = entities[Entity.Rooms].mappingType
await save(roomMapping) await save(roomMapping)
log.debug('Mapping added:', roomMapping) log.debug('Mapping added:', roomMapping)

View File

@ -13,6 +13,7 @@ import {
userIsExcluded, userIsExcluded,
} from '../handlers/users' } from '../handlers/users'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import { Entity, entities } from '../Entities'
jest.mock('axios') jest.mock('axios')
const mockedAxios = axios as jest.Mocked<typeof axios> const mockedAxios = axios as jest.Mocked<typeof axios>
@ -104,7 +105,7 @@ test('creating mapping', async () => {
expect(mockedStorage.save).toHaveBeenCalledWith({ expect(mockedStorage.save).toHaveBeenCalledWith({
rcId: rcUser._id, rcId: rcUser._id,
matrixId: matrixUser.user_id, matrixId: matrixUser.user_id,
type: 0, type: entities[Entity.Users].mappingType,
accessToken: matrixUser.access_token, accessToken: matrixUser.access_token,
} as IdMapping) } as IdMapping)
}) })

View File

@ -3,6 +3,7 @@ import log from '../helpers/logger'
import { axios } from '../helpers/synapse' import { axios } from '../helpers/synapse'
import { createMembership, getUserId, save } from '../helpers/storage' import { createMembership, getUserId, save } from '../helpers/storage'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import { Entity, entities } from '../Entities'
export type RcUser = { export type RcUser = {
_id: string _id: string
@ -99,7 +100,7 @@ export async function createMapping(
const mapping = new IdMapping() const mapping = new IdMapping()
mapping.rcId = rcId mapping.rcId = rcId
mapping.matrixId = matrixUser.user_id mapping.matrixId = matrixUser.user_id
mapping.type = 0 mapping.type = entities[Entity.Users].mappingType
mapping.accessToken = matrixUser.access_token mapping.accessToken = matrixUser.access_token
await save(mapping) await save(mapping)

View File

@ -13,11 +13,12 @@ import {
} from './storage' } from './storage'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import { Membership } from '../entity/Membership' import { Membership } from '../entity/Membership'
import { Entity, entities } from '../Entities'
const mapping = new IdMapping() const mapping = new IdMapping()
mapping.rcId = 'rcId' mapping.rcId = 'rcId'
mapping.matrixId = 'matrixId' mapping.matrixId = 'matrixId'
mapping.type = 0 mapping.type = entities[Entity.Users].mappingType
mapping.accessToken = 'accessToken' mapping.accessToken = 'accessToken'
const membership = new Membership() const membership = new Membership()
@ -73,7 +74,7 @@ test('get room by id', async () => {
const room = new IdMapping() const room = new IdMapping()
room.rcId = 'rcRoom' room.rcId = 'rcRoom'
room.matrixId = 'matrixRoom' room.matrixId = 'matrixRoom'
room.type = 1 room.type = entities[Entity.Rooms].mappingType
await save(room) await save(room)
await expect(getRoomId(room.rcId)).resolves.toBe(room.matrixId) await expect(getRoomId(room.rcId)).resolves.toBe(room.matrixId)
@ -84,7 +85,7 @@ test('get message by id', async () => {
const message = new IdMapping() const message = new IdMapping()
message.rcId = 'rcMessage' message.rcId = 'rcMessage'
message.matrixId = 'matrixMessage' message.matrixId = 'matrixMessage'
message.type = 2 message.type = entities[Entity.Messages].mappingType
await save(message) await save(message)
await expect(getMessageId(message.rcId)).resolves.toBe(message.matrixId) await expect(getMessageId(message.rcId)).resolves.toBe(message.matrixId)

View File

@ -1,6 +1,7 @@
import { DataSource } from 'typeorm' import { DataSource } from 'typeorm'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import { Membership } from '../entity/Membership' import { Membership } from '../entity/Membership'
import { Entity, entities } from '../Entities'
const AppDataSource = new DataSource({ const AppDataSource = new DataSource({
type: 'sqlite', type: 'sqlite',
@ -29,7 +30,7 @@ export async function save(entity: IdMapping | Membership): Promise<void> {
} }
export async function getAccessToken(id: string): Promise<string | undefined> { export async function getAccessToken(id: string): Promise<string | undefined> {
return (await getMapping(id, 0))?.accessToken return (await getMapping(id, entities[Entity.Users].mappingType))?.accessToken
} }
export async function createMembership( export async function createMembership(
@ -57,13 +58,14 @@ export async function getMemberships(rcRoomId: string): Promise<string[]> {
} }
export async function getUserId(rcId: string): Promise<string | undefined> { export async function getUserId(rcId: string): Promise<string | undefined> {
return (await getMapping(rcId, 0))?.matrixId return (await getMapping(rcId, entities[Entity.Users].mappingType))?.matrixId
} }
export async function getRoomId(rcId: string): Promise<string | undefined> { export async function getRoomId(rcId: string): Promise<string | undefined> {
return (await getMapping(rcId, 1))?.matrixId return (await getMapping(rcId, entities[Entity.Rooms].mappingType))?.matrixId
} }
export async function getMessageId(rcId: string): Promise<string | undefined> { export async function getMessageId(rcId: string): Promise<string | undefined> {
return (await getMapping(rcId, 2))?.matrixId return (await getMapping(rcId, entities[Entity.Messages].mappingType))
?.matrixId
} }