From b3bad26d8fbbc1af6c728f8d337b0744ac1c50fa Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 5 Dec 2025 12:56:08 -0500 Subject: [PATCH] Things seems to be working. It pulls the example moderator group list from Novi using their API. The moderator check is working. It still needs to handle more than one Novi Group. --- .../(idaa)/video_conferences/+page.svelte | 89 ++++++++++++++++--- src/routes/idaa/+layout.svelte | 12 +-- 2 files changed, 81 insertions(+), 20 deletions(-) diff --git a/src/routes/idaa/(idaa)/video_conferences/+page.svelte b/src/routes/idaa/(idaa)/video_conferences/+page.svelte index d0c77228..119464f1 100644 --- a/src/routes/idaa/(idaa)/video_conferences/+page.svelte +++ b/src/routes/idaa/(idaa)/video_conferences/+page.svelte @@ -9,15 +9,6 @@ let jitsi_api: any = null; const jitsi_container_id = 'jitsi_meet_external_api_container'; - // Hardcoded moderator list, as in the original HTML file. - const novi_jitsi_mod_li = [ - '2b078deb-b4e7-4203-99da-9f7cd62159a5', - 'c9ea07b5-06b0-4a43-a2d0-8d06558c8a82', - '58db22ee-4b0a-49a7-9f34-53d2ba85a84b', - '5724aad7-6d89-47e7-8943-966fd22911bd', - '182d1db3-caa9-41bc-b04a-2facc6859aeb' - ]; - async function getJitsiJwt( display_name: string, email: string, @@ -25,7 +16,7 @@ room_name: string, user_id: string ) { - const tokenEndpoint = 'https://dev-api.oneskyit.com/api/jitsi_token'; + const token_endpoint = 'https://dev-api.oneskyit.com/api/jitsi_token'; const payload = { name: display_name, @@ -55,7 +46,7 @@ }; try { - const response = await fetch(tokenEndpoint, { + const response = await fetch(token_endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) @@ -74,13 +65,83 @@ onMount(async () => { const url_params = data.params; - const user_id = url_params.uuid; - const display_name = url_params.full_name ?? 'Guest'; + // --- Start with fallback data from URL --- + let user_id = url_params.uuid; + let display_name = url_params.full_name ?? 'Guest'; let email = (url_params.email ?? 'guest@example.com').replace(/\s+/g, '+'); + let is_moderator = false; const room_name = url_params.room ?? 'Default-Room'; const domain = url_params.domain ?? 'jitsi.dgrzone.com'; - const is_moderator = novi_jitsi_mod_li.includes(user_id); + if (!user_id) { + const container = document.getElementById(jitsi_container_id); + if (container) { + container.innerHTML = + '

User ID (uuid) is missing. Cannot start meeting.

'; + } + return; + } + + // --- Fetch dynamic data from Novi API --- + const novi_api_key = 'CmNdWgdPmgluBWjiTd8xsUCk5mio8F1O9DYAh0pVDcg='; + const novi_api_headers = new Headers(); + novi_api_headers.append('Authorization', `Basic ${novi_api_key}`); + const requestOptions = { + method: 'GET', + headers: novi_api_headers + }; + + try { + // Fetch the list of moderators from the Novi group + const mod_group_guid = 'd76d2c00-962d-40f6-a2e8-ed9c85594d96'; + const mod_list_url = `https://www.idaa.org/api/groups/${mod_group_guid}/members?pageSize=200`; + console.log(`Fetching moderator list from Novi API: ${mod_list_url}`); + const mods_response = await fetch(mod_list_url, requestOptions); + + if (mods_response.ok) { + const moderatorsRaw = await mods_response.json(); + console.log('Fetched moderators raw:', moderatorsRaw); + + // Normalise the payload: support both Array and { Results: Array } shapes + let modList: any[] = []; + if (Array.isArray(moderatorsRaw)) { + modList = moderatorsRaw; + } else if (Array.isArray(moderatorsRaw.Results)) { + modList = moderatorsRaw.Results; + } else if (Array.isArray(moderatorsRaw.Members)) { + modList = moderatorsRaw.Members; + } else { + console.warn('Moderator list format is unexpected. Falling back to empty list.', moderatorsRaw); + modList = []; + } + + // Build a set of normalized IDs from a few possible fields + const modIdSet = new Set( + modList + .map((m: any) => (m?.UniqueID ?? m?.UniqueId ?? m?.DuesPayerUniqueID ?? m?.id ?? '')) + .filter(Boolean) + .map((id: string) => id.toLowerCase().trim()) + ); + + const normalizedUserId = String(user_id ?? '').toLowerCase().trim(); + + console.log(`Moderator IDs (${modIdSet.size}) sample:`, Array.from(modIdSet).slice(0, 10)); + if (normalizedUserId && modIdSet.has(normalizedUserId)) { + is_moderator = true; + console.log(`User ${user_id} is a moderator (matched by UniqueID).`); + } else { + // Also check by matching name/email if needed (optional) + console.log(`User ${user_id} is not a moderator.`); + } + } else { + console.warn('Could not fetch moderator list from Novi API.'); + } + } catch (error) { + console.error('Error fetching data from Novi API:', error); + // Fallback to data from URL params is the default behavior + } + + // --- Initialize Jitsi --- let jwtToken = null; if (is_moderator) { jwtToken = await getJitsiJwt(display_name, email, is_moderator, room_name, user_id); diff --git a/src/routes/idaa/+layout.svelte b/src/routes/idaa/+layout.svelte index 9ae30fd5..9b2f164c 100644 --- a/src/routes/idaa/+layout.svelte +++ b/src/routes/idaa/+layout.svelte @@ -41,12 +41,12 @@ let { data, children }: Props = $props(); - if (browser) { - add_activity_log({ - action: 'idaa_root_layout', - action_with: 'browser' - }); - } + // if (browser) { + // add_activity_log({ + // action: 'idaa_root_layout', + // action_with: 'browser' + // }); + // } function add_activity_log({ action = 'idaa_root_layout',