From 122965f083ff6613c9b36d6379dde3e9f9953451 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 15 Dec 2025 13:25:39 -0500 Subject: [PATCH] Saving changes as we keep cleaning up the Novi specific code. --- .../(idaa)/video_conferences/+page.svelte | 278 +++++++++++------- 1 file changed, 164 insertions(+), 114 deletions(-) diff --git a/src/routes/idaa/(idaa)/video_conferences/+page.svelte b/src/routes/idaa/(idaa)/video_conferences/+page.svelte index d159abfc..0e1244b1 100644 --- a/src/routes/idaa/(idaa)/video_conferences/+page.svelte +++ b/src/routes/idaa/(idaa)/video_conferences/+page.svelte @@ -84,17 +84,17 @@ user_id = url_params.uuid; // Novi Customer GUID display_name = url_params.full_name ?? 'Guest'; // May be overridden after fetching from Novi API email = (url_params.email ?? 'guest@example.com').replace(/\s+/g, '+'); // May be overridden after fetching from Novi API - // is_moderator = false; // May be overridden after fetching from Novi API room_name = url_params.room ?? 'Default-Room'; domain = url_params.domain ?? 'jitsi.dgrzone.com'; - console.log(`Jitsi: From URL params for: user_id: ${user_id}, display_name: ${display_name}, email: ${email}, room_name: ${room_name}, domain: ${domain}`); + console.log( + `Jitsi: From URL params for: user_id: ${user_id}, display_name: ${display_name}, email: ${email}, room_name: ${room_name}, domain: ${domain}` + ); if (!user_id) { const container = document.getElementById(jitsi_container_id); if (container) { - container.innerHTML = - '

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

'; + container.innerHTML = '

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

'; } console.error('Jitsi: User ID (uuid) is missing. Cannot start meeting.'); return; @@ -102,107 +102,44 @@ // --- Fetch dynamic data from Novi API --- const novi_api_root_url = $ae_loc.site_cfg_json?.novi_api_root_url; - const novi_api_key = $ae_loc.site_cfg_json?.novi_idaa_api_key; // For IDAA's Novi site - const novi_api_headers = new Headers(); - novi_api_headers.append('Authorization', `Basic ${novi_api_key}`); - const requestOptions = { - method: 'GET', - headers: novi_api_headers - }; + const novi_api_key = $ae_loc.site_cfg_json?.novi_idaa_api_key; - console.log('Jitsi: Attempting to fetch IDAA member (Novi customer) details based on Novi customer GUID using Novi API...'); - - const full_novi_url_customers_guid = `${novi_api_root_url}/customers/${user_id}`; - - await fetch(full_novi_url_customers_guid, requestOptions) - .then((response) => response.json()) - .then((result) => { - let novi_current_user_obj = result; - console.log(`Jitsi: Novi's Current User Obj:`, novi_current_user_obj); - - let full_name = novi_current_user_obj?.Name; - let first_name = novi_current_user_obj?.FirstName; - let last_initial = novi_current_user_obj?.LastName - ? novi_current_user_obj.LastName.charAt(0).toUpperCase() + '.' - : ''; - if (last_initial) { - full_name = `${first_name} ${last_initial}`; + if (novi_api_root_url && novi_api_key) { + // Update user details from Novi + const member_details = await get_novi_member_details(user_id, novi_api_root_url, novi_api_key); + if (member_details.display_name) { + display_name = member_details.display_name; + console.log(`Jitsi: Updated display_name based on Novi: ${display_name}`); } - - let novi_email = novi_current_user_obj?.Email; - if (novi_email) { - email = novi_email.replace(/\s+/g, '+'); + if (member_details.email) { + email = member_details.email; console.log(`Jitsi: Updated email based on Novi: ${email}`); } - display_name = full_name; - console.log(`Jitsi: Updated display_name and email based on Novi: ${full_name} / ${email}`); - }) - .catch((error) => console.log('error', error)); - - console.log('Jitsi: Attempting to fetch moderator (Novi group members) list based on Novi group GUID using Novi API... There may be multiple groups to check.'); - - try { - // Fetch the list of moderators from the Novi group + // Check for moderator status const novi_idaa_group_guid_li = $ae_loc.site_cfg_json?.novi_idaa_group_guid_li ?? []; - let allModeratorsRaw: any[] = []; - - if (novi_idaa_group_guid_li.length === 0) { - console.warn('Jitsi: novi_idaa_group_guid_li is empty. No moderator groups to check.'); - } - - for (const group_guid of novi_idaa_group_guid_li) { - // const novi_url_groups_members = `/groups/members/${group_guid}/members`; - const full_novi_url_groups_members = `${novi_api_root_url}/groups/${group_guid}/members?pageSize=200`; - console.log(`Jitsi: Fetching moderator list from Novi API for group: ${group_guid} from URL: ${full_novi_url_groups_members}`); - - const mods_response = await fetch(full_novi_url_groups_members, requestOptions); - - if (mods_response.ok) { - const groupModeratorsRaw = await mods_response.json(); - // Normalize the payload and combine - let groupModList: any[] = []; - if (Array.isArray(groupModeratorsRaw)) { - groupModList = groupModeratorsRaw; - } else if (Array.isArray(groupModeratorsRaw.Results)) { - groupModList = groupModeratorsRaw.Results; - } else if (Array.isArray(groupModeratorsRaw.Members)) { - groupModList = groupModeratorsRaw.Members; - } else { - console.warn(`Jitsi: Moderator list format is unexpected for group ${group_guid}. Falling back to empty list for this group.`, groupModeratorsRaw); - } - allModeratorsRaw = allModeratorsRaw.concat(groupModList); - console.log(`Jitsi: Fetched ${groupModList.length} moderators from group ${group_guid}. Total: ${allModeratorsRaw.length}`); - } else { - console.warn(`Jitsi: Could not fetch moderator list from Novi API for group: ${group_guid}. Status: ${mods_response.status}`); - } - } - - if (allModeratorsRaw.length === 0) { - console.warn('Jitsi: No moderators fetched across all specified Novi groups. Falling back to empty list.'); - } - console.log('Jitsi: Fetched all moderators raw (combined):', allModeratorsRaw); - - // Build a set of normalized IDs from a few possible fields using allModeratorsRaw - const modIdSet = new Set( - allModeratorsRaw - .map((m: any) => (m?.UniqueID ?? m?.UniqueId ?? m?.DuesPayerUniqueID ?? m?.id ?? '')) - .filter(Boolean) - .map((id: string) => id.toLowerCase().trim()) + const moderatorIdSet = await get_novi_group_moderators( + novi_idaa_group_guid_li, + novi_api_root_url, + novi_api_key ); const normalizedUserId = String(user_id ?? '').toLowerCase().trim(); + console.log( + `Jitsi: Moderator IDs (${moderatorIdSet.size}) sample:`, + Array.from(moderatorIdSet).slice(0, 10) + ); - console.log(`Jitsi: Moderator IDs (${modIdSet.size}) sample:`, Array.from(modIdSet).slice(0, 10)); - if (normalizedUserId && modIdSet.has(normalizedUserId)) { + if (normalizedUserId && moderatorIdSet.has(normalizedUserId)) { is_moderator = true; - console.log(`Jitsi: User ${user_id} is a moderator (matched by UniqueID).`); + console.log(`Jitsi: User ${user_id} is a moderator.`); } else { console.log(`Jitsi: User ${user_id} is not a moderator.`); } - } catch (error) { - console.error('Jitsi: Error fetching data from Novi API:', error); - // Fallback to data from URL params is the default behavior + } else { + console.warn( + 'Jitsi: Novi API URL or Key is not configured. Skipping user details fetch and moderator check.' + ); } // --- Initialize Jitsi --- @@ -267,44 +204,157 @@ } }); + /** + * Fetches member details from the Novi API. + * @param user_id - The Novi Customer GUID. + * @param api_root_url - The root URL of the Novi API. + * @param api_key - The API key for authorization. + * @returns An object with the user's display name and email, or null if not found. + */ + async function get_novi_member_details( + user_id: string, + api_root_url: string, + api_key: string + ): Promise<{ display_name: string | null; email: string | null }> { + if (!user_id || !api_root_url || !api_key) { + console.error('get_novi_member_details: Missing required arguments.'); + return { display_name: null, email: null }; + } - // Get Novi member details - // args: novi_customer_uid - // returns: novi member object - function get_novi_member_details() { - // Placeholder function if needed in the future + const headers = new Headers(); + headers.append('Authorization', `Basic ${api_key}`); + const requestOptions = { method: 'GET', headers: headers }; + const url = `${api_root_url}/customers/${user_id}`; + + console.log('Jitsi: Fetching Novi member details from:', url); + + try { + const response = await fetch(url, requestOptions); + if (!response.ok) { + throw new Error(`Novi API request failed with status ${response.status}`); + } + const result = await response.json(); + console.log(`Jitsi: Novi's Current User Obj:`, result); + + let full_name = result?.Name; + const first_name = result?.FirstName; + const last_initial = result?.LastName ? `${result.LastName.charAt(0).toUpperCase()}.` : ''; + + if (first_name && last_initial) { + full_name = `${first_name} ${last_initial}`; + } + + const novi_email = result?.Email ? result.Email.replace(/\s+/g, '+') : null; + + return { display_name: full_name, email: novi_email }; + } catch (error) { + console.error('Error fetching Novi member details:', error); + return { display_name: null, email: null }; + } } - // Get Novi group moderators - // args: novi_group_guid - // returns: array of novi member objects - function get_novi_group_moderators() { - // Placeholder function if needed in the future + /** + * Fetches a set of moderator IDs from Novi group(s). + * @param group_guid_li - A list of Novi group GUIDs to check for moderators. + * @param api_root_url - The root URL of the Novi API. + * @param api_key - The API key for authorization. + * @returns A Set of normalized (lowercase, trimmed) moderator UniqueIDs. + */ + async function get_novi_group_moderators( + group_guid_li: string[], + api_root_url: string, + api_key: string + ): Promise> { + if (!group_guid_li || group_guid_li.length === 0 || !api_root_url || !api_key) { + console.warn('get_novi_group_moderators: Missing required arguments or empty group list.'); + return new Set(); + } + + const headers = new Headers(); + headers.append('Authorization', `Basic ${api_key}`); + const requestOptions = { method: 'GET', headers: headers }; + let allModeratorsRaw: any[] = []; + + console.log('Jitsi: Fetching Novi group moderators...'); + + for (const group_guid of group_guid_li) { + const url = `${api_root_url}/groups/${group_guid}/members?pageSize=200`; + console.log(`Jitsi: Fetching moderator list for group ${group_guid} from: ${url}`); + + try { + const response = await fetch(url, requestOptions); + if (response.ok) { + const result = await response.json(); + let groupModList: any[] = []; + + if (Array.isArray(result)) groupModList = result; + else if (Array.isArray(result.Results)) groupModList = result.Results; + else if (Array.isArray(result.Members)) groupModList = result.Members; + else console.warn(`Jitsi: Moderator list format unexpected for group ${group_guid}.`, result); + + allModeratorsRaw = allModeratorsRaw.concat(groupModList); + console.log( + `Jitsi: Fetched ${groupModList.length} moderators from group ${group_guid}. Total: ${allModeratorsRaw.length}` + ); + } else { + console.warn( + `Jitsi: Failed to fetch moderators for group ${group_guid}. Status: ${response.status}` + ); + } + } catch (error) { + console.error(`Jitsi: Error fetching moderators for group ${group_guid}:`, error); + } + } + + if (allModeratorsRaw.length === 0) { + console.warn('Jitsi: No moderators found across all specified Novi groups.'); + } + console.log('Jitsi: Fetched all raw moderators (combined):', allModeratorsRaw); + + const modIdSet = new Set( + allModeratorsRaw + .map((m: any) => m?.UniqueID ?? m?.UniqueId ?? m?.DuesPayerUniqueID ?? m?.id ?? '') + .filter(Boolean) + .map((id: string) => String(id).toLowerCase().trim()) + ); + return modIdSet; } + // Move the code from onMount to here so that it can be called multiple times. There will be a reset/restart button later. The users should also be able to change a few setting that may require a re-init. + function init_jitsi() { + // Placeholder for code from onMount + } + - {#if show_jitsi_container} -
+
{/if} {#if show_jitsi_tools} -
-

Jitsi Tools

- {#if display_name && email} -

{display_name} ({email})

- {/if} -

Room: {room_name}

-

Domain: {domain}

-

User ID: {user_id}

-

Moderator: {is_moderator ? 'Yes' : 'No'}

-
+
+

Jitsi Tools

+ {#if display_name && email} +

{display_name} ({email})

+ {/if} +

Room: {room_name}

+

Domain: {domain}

+

User ID: {user_id}

+

Moderator: {is_moderator ? 'Yes' : 'No'}

+ +
{/if} + \ No newline at end of file