Merged PR 166: Fix apollo callback

Fix apollo callback
This commit is contained in:
2025-06-12 14:58:28 +00:00
2 changed files with 62 additions and 31 deletions

View File

@@ -96,6 +96,7 @@
<!-- Modal for New Group --> <!-- Modal for New Group -->
<Dialog v-model:visible="showNewGroupModal" header="New Video Group" :modal="true" :style="{ width: '40vw' }"> <Dialog v-model:visible="showNewGroupModal" header="New Video Group" :modal="true" :style="{ width: '40vw' }">
<div class="flex flex-col gap-6"> <div class="flex flex-col gap-6">
<h2 class="text-lg font-bold mb-4">Hint: use Functional Video if you want to use the Functional Q&A scenario on Workflow</h2>
<div> <div>
<label for="groupName" class="block font-bold mb-2">Group Name</label> <label for="groupName" class="block font-bold mb-2">Group Name</label>
<InputText id="groupName" v-model="newGroup.name" placeholder="Enter group name" <InputText id="groupName" v-model="newGroup.name" placeholder="Enter group name"

View File

@@ -12,12 +12,13 @@ const visible = ref(false);
onMounted(async () => { onMounted(async () => {
console.log('[Callback] Mounted on callback'); console.log('[Callback] Mounted on callback');
try { try {
await msalInstance.initialize(); await msalInstance.initialize();
console.log('[Callback] After initialize on callback'); console.log('[Callback] After initialize on callback');
} catch (e) { } catch (e) {
console.error('[Callback] Errore durante initialize MSAL:', e); console.error('[Callback] Error during MSAL initialization:', e);
message.value = "Errore durante l'inizializzazione di MSAL."; message.value = "Error during MSAL initialization.";
visible.value = true; visible.value = true;
return; return;
} }
@@ -27,20 +28,30 @@ onMounted(async () => {
response = await msalInstance.handleRedirectPromise(); response = await msalInstance.handleRedirectPromise();
console.log('[Callback] handleRedirectPromise response:', response); console.log('[Callback] handleRedirectPromise response:', response);
} catch (e) { } catch (e) {
console.error('[Callback] Errore in handleRedirectPromise:', e); console.error('[Callback] Error in handleRedirectPromise:', e);
message.value = 'Errore durante la gestione del redirect.'; message.value = 'Error handling the redirect.';
visible.value = true; visible.value = true;
return; return;
} }
if (response && response.accessToken) { if (response && response.accessToken) {
message.value = 'Logging in to the application...'; console.log('[Callback] Access token present:', response.accessToken);
console.log('[Callback] AccessToken presente:', response.accessToken);
if (!response.account) {
console.warn('[Callback] No account present in the response. Possible MSAL anomaly.');
} else {
console.log('[Callback] Account info:', response.account); console.log('[Callback] Account info:', response.account);
localStorage.setItem('msalUser', JSON.stringify(response.account)); localStorage.setItem('msalUser', JSON.stringify(response.account));
}
// Wait 1 second to avoid race condition
await new Promise(resolve => setTimeout(resolve, 1000));
message.value = 'Logging in to the application...';
// Token exchange function with retry
const tryTokenExchange = async (retry = false) => {
try { try {
console.log('[Callback] Chiamata a /msauth/exchange con accessToken...'); console.log(`[Callback] Call to /msauth/exchange (retry=${retry})...`);
const res = await axios.post( const res = await axios.post(
'/msauth/exchange', '/msauth/exchange',
{}, {},
@@ -48,45 +59,64 @@ onMounted(async () => {
headers: { Authorization: `Bearer ${response.accessToken}` } headers: { Authorization: `Bearer ${response.accessToken}` }
} }
); );
console.log('[Callback] Risposta da /msauth/exchange:', res); return res;
} catch (err) {
if (!retry) {
console.warn('[Callback] First attempt failed, waiting 1500ms and retrying...');
await new Promise(resolve => setTimeout(resolve, 1500));
return tryTokenExchange(true);
} else {
throw err;
}
}
};
if (res.data.token) { let exchangeResponse;
console.log('[Callback] Token backend ricevuto:', res.data.token);
auth.token(null, res.data.token, false);
try { try {
console.log('[Callback] Chiamata a auth.fetch()...'); exchangeResponse = await tryTokenExchange();
const userResponse = await auth.fetch(); console.log('[Callback] Response from /msauth/exchange:', exchangeResponse);
console.log('[Callback] Risposta user fetch:', userResponse);
console.log('[Callback] userResponse.data:', userResponse.data);
console.log('[Callback] userResponse.data.data:', userResponse.data.data);
if (!userResponse.data.data.selectedProject) { if (exchangeResponse.data.token) {
console.log('[Callback] Nessun progetto selezionato, redirect a projects-list'); console.log('[Callback] Backend token received:', exchangeResponse.data.token);
auth.token(null, exchangeResponse.data.token, false);
try {
console.log('[Callback] Calling auth.fetch()...');
const userResponse = await auth.fetch();
console.log('[Callback] User fetch response:', userResponse);
const userData = userResponse.data?.data;
console.log('[Callback] userResponse.data.data:', userData);
if (!userData || !userData.selectedProject) {
console.log('[Callback] No project selected, redirecting to projects-list');
router.push({ name: 'projects-list' }); router.push({ name: 'projects-list' });
} else { } else {
console.log('[Callback] Progetto selezionato, redirect a ks-document'); console.log('[Callback] Project selected, redirecting to scenario-list');
router.push({ name: 'ks-document' }); router.push({ name: 'scenario-list' });
} }
} catch (fetchErr) { } catch (fetchErr) {
console.error('[Callback] Errore su fetch user dopo token exchange:', fetchErr); console.error('[Callback] Error fetching user after token exchange:', fetchErr);
message.value = 'User not configured for this application. Contact the administrator for details.'; message.value = 'User not configured for this application. Contact the administrator for details.';
visible.value = true; visible.value = true;
} }
} else { } else {
console.error('[Callback] No token received from backend:', exchangeResponse.data);
message.value = 'User not configured for this application. Contact the administrator for details.'; message.value = 'User not configured for this application. Contact the administrator for details.';
console.error('[Callback] Nessun token ricevuto dal backend:', res.data); visible.value = true;
} }
} catch (error) { } catch (error) {
console.error('[Callback] Error on token exchange:', error.response ? error.response.data : error); console.error('[Callback] Error on token exchange (after retry):', error.response ? error.response.data : error);
message.value = 'An error occurred during the token exchange. Please try again.'; message.value = 'An error occurred during the token exchange. Please try again.';
visible.value = true; visible.value = true;
} }
} else { } else {
console.error('[Callback] Invalid response o access token mancante:', response); console.error('[Callback] Invalid response or missing access token:', response);
message.value = 'Authentication failed. Please log in again.'; message.value = 'Authentication failed. Please log in again.';
visible.value = true; visible.value = true;
} }
}); });
</script> </script>
<template> <template>