diff --git a/server/lib/prosody/config/affiliations.ts b/server/lib/prosody/config/affiliations.ts new file mode 100644 index 00000000..a7451ec2 --- /dev/null +++ b/server/lib/prosody/config/affiliations.ts @@ -0,0 +1,34 @@ +interface Affiliations { [jid: string]: 'outcast' | 'none' | 'member' | 'admin' | 'owner' } + +async function getVideoAffiliations (options: RegisterServerOptions, _video: MVideoThumbnail): Promise { + const peertubeHelpers = options.peertubeHelpers + // Get all admins and moderators + const [results] = await peertubeHelpers.database.query( + 'SELECT "username" FROM "user"' + + ' WHERE "user"."role" IN (0, 1)' + ) + if (!Array.isArray(results)) { + throw new Error('getVideoAffiliations: query result is not an array.') + } + const r: Affiliations = {} + for (let i = 0; i < results.length; i++) { + const result = results[i] + if (typeof result !== 'object') { + throw new Error('getVideoAffiliations: query result is not an object') + } + if (!('username' in result)) { + throw new Error('getVideoAffiliations: no username field in result') + } + const jid = (result.username as string) + '@localhost' + r[jid] = 'owner' + } + + // TODO: add a 'admin' affiliation for video owner + + return r +} + +export { + Affiliations, + getVideoAffiliations +} diff --git a/server/lib/routers/api.ts b/server/lib/routers/api.ts index 686f24bf..7826575e 100644 --- a/server/lib/routers/api.ts +++ b/server/lib/routers/api.ts @@ -3,6 +3,7 @@ import { videoHasWebchat } from '../../../shared/lib/video' import { asyncMiddleware } from '../middlewares/async' import { prosodyCheckUserPassword, prosodyRegisterUser, prosodyUserRegistered } from '../prosody/auth' import { getAuthUser, getUserNickname } from '../helpers' +import { Affiliations, getVideoAffiliations } from '../prosody/config/affiliations' // See here for description: https://modules.prosody.im/mod_muc_http_defaults.html interface RoomDefaults { @@ -21,11 +22,7 @@ interface RoomDefaults { moderated?: boolean archiving?: boolean } - affiliations?: Array<{ - jid: string - affiliation: 'outcast' | 'none' | 'member' | 'admin' | 'owner' - nick?: string - }> + affiliations?: Affiliations } async function initApiRouter (options: RegisterServerOptions): Promise { @@ -68,6 +65,15 @@ async function initApiRouter (options: RegisterServerOptions): Promise { return } + let affiliations: Affiliations + try { + affiliations = await getVideoAffiliations(options, video) + } catch (error) { + logger.error(`Failed to get video affiliations for ${video.uuid}:`, error) + // affiliations: should at least be {}, so that the first user will not be moderator/admin + affiliations = {} + } + const roomDefaults: RoomDefaults = { config: { name: video.name, @@ -75,7 +81,7 @@ async function initApiRouter (options: RegisterServerOptions): Promise { language: video.language, subject: video.name }, - affiliations: [] // so that the first user will not be moderator/admin + affiliations: affiliations } res.json(roomDefaults) }