From e5f07b9134809a6366b5a2a6773ca3740d43cf40 Mon Sep 17 00:00:00 2001 From: Kristina Date: Thu, 7 Nov 2024 18:31:48 +0400 Subject: [PATCH] Fix love metadata update (#7124) Signed-off-by: Kristina Fefelova --- plugins/love-resources/src/utils.ts | 10 +++++----- plugins/love/src/index.ts | 6 ++++++ services/love/src/main.ts | 31 ++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/plugins/love-resources/src/utils.ts b/plugins/love-resources/src/utils.ts index 44cf31ff74..29d4bb1abe 100644 --- a/plugins/love-resources/src/utils.ts +++ b/plugins/love-resources/src/utils.ts @@ -26,7 +26,8 @@ import { type Room, RoomAccess, RoomType, - TranscriptionStatus + TranscriptionStatus, + type RoomMetadata } from '@hcengineering/love' import { getEmbeddedLabel, getMetadata, getResource, type IntlString } from '@hcengineering/platform' import presentation, { @@ -351,7 +352,7 @@ lk.on(RoomEvent.RecordingStatusChanged, (evt) => { }) lk.on(RoomEvent.RoomMetadataChanged, (metadata) => { try { - const data = JSON.parse(metadata) + const data = JSON.parse(metadata) as RoomMetadata if (data.recording !== undefined) { isRecording.set(data.recording) } @@ -379,10 +380,9 @@ lk.on(RoomEvent.Disconnected, () => { }) function initRoomMetadata (metadata: string | undefined): void { - if (metadata === undefined) return - let data: { transcription?: TranscriptionStatus } = {} + let data: RoomMetadata try { - data = metadata === '' ? {} : JSON.parse(metadata) + data = metadata == null || metadata === '' ? {} : JSON.parse(metadata) } catch (err: any) { data = {} Analytics.handleError(err) diff --git a/plugins/love/src/index.ts b/plugins/love/src/index.ts index 25dc7524a0..34113039b3 100644 --- a/plugins/love/src/index.ts +++ b/plugins/love/src/index.ts @@ -85,6 +85,12 @@ export type RoomLanguage = | 'uk' | 'vi' +export interface RoomMetadata { + recording?: boolean + transcription?: TranscriptionStatus + language?: RoomLanguage +} + export interface Room extends Doc { name: string type: RoomType diff --git a/services/love/src/main.ts b/services/love/src/main.ts index 16b955d532..b57b0af9ce 100644 --- a/services/love/src/main.ts +++ b/services/love/src/main.ts @@ -19,7 +19,7 @@ import serverClient from '@hcengineering/server-client' import { initStatisticsContext, StorageConfig, StorageConfiguration } from '@hcengineering/server-core' import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage' import serverToken, { decodeToken } from '@hcengineering/server-token' -import { TranscriptionStatus } from '@hcengineering/love' +import { RoomMetadata, TranscriptionStatus } from '@hcengineering/love' import cors from 'cors' import express from 'express' import { IncomingHttpHeaders } from 'http' @@ -152,7 +152,7 @@ export const main = async (): Promise => { } // just check token decodeToken(token) - await roomClient.updateRoomMetadata(req.body.roomName, JSON.stringify({ recording: false })) + await updateMetadata(roomClient, req.body.roomName, { recording: false }) void stopEgress(egressClient, req.body.roomName) res.send() }) @@ -179,7 +179,7 @@ export const main = async (): Promise => { const metadata = language != null ? { transcription, language } : { transcription } try { - await roomClient.updateRoomMetadata(roomName, JSON.stringify(metadata)) + await updateMetadata(roomClient, roomName, metadata) res.send() } catch (e) { console.error(e) @@ -205,7 +205,7 @@ export const main = async (): Promise => { return } try { - await roomClient.updateRoomMetadata(roomName, JSON.stringify({ language })) + await updateMetadata(roomClient, roomName, { language }) res.send() } catch (e) { console.error(e) @@ -309,7 +309,28 @@ const startRecord = async ( }) } }) - await roomClient.updateRoomMetadata(roomName, JSON.stringify({ recording: true })) + await updateMetadata(roomClient, roomName, { recording: true }) await egressClient.startRoomCompositeEgress(roomName, { file: output }, { layout: 'grid' }) return filepath } + +function parseMetadata (metadata?: string | null): RoomMetadata { + if (metadata === '' || metadata == null) return {} + + try { + return JSON.parse(metadata) as RoomMetadata + } catch (e) { + return {} + } +} + +async function updateMetadata ( + roomClient: RoomServiceClient, + roomName: string, + metadata: Partial +): Promise { + const room = (await roomClient.listRooms([roomName]))[0] + const currentMetadata = parseMetadata(room?.metadata) + + await roomClient.updateRoomMetadata(roomName, JSON.stringify({ ...currentMetadata, ...metadata })) +}