Fondation
This commit is contained in:
parent
32e757b3e7
commit
672333a6db
@ -98,11 +98,20 @@ export async function GET(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get all users to find the current user
|
// Get all users to find the current user
|
||||||
const usersData = await fetchJsonWithTimeout(`${baseUrl}/api/v1/users.list`, {
|
let usersData;
|
||||||
|
try {
|
||||||
|
usersData = await fetchJsonWithTimeout(`${baseUrl}/api/v1/users.list`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
timeout: 10000, // 10 seconds
|
timeout: 10000, // 10 seconds
|
||||||
headers: adminHeaders
|
headers: adminHeaders
|
||||||
});
|
});
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('[ROCKET_CHAT] Error fetching users list', {
|
||||||
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
// Return empty messages instead of failing completely
|
||||||
|
return NextResponse.json({ messages: [] }, { status: 200 });
|
||||||
|
}
|
||||||
|
|
||||||
if (!usersData.success) {
|
if (!usersData.success) {
|
||||||
logger.error('[ROCKET_CHAT] Failed to get users list', {
|
logger.error('[ROCKET_CHAT] Failed to get users list', {
|
||||||
@ -248,10 +257,14 @@ export async function GET(request: Request) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
||||||
logger.error('[ROCKET_CHAT] Failed to get messages for room', {
|
logger.error('[ROCKET_CHAT] Failed to get messages for room', {
|
||||||
roomName: subscription.name,
|
roomName: subscription.name,
|
||||||
error: error instanceof Error ? error.message : String(error),
|
roomId: subscription.rid,
|
||||||
|
endpoint,
|
||||||
|
error: errorMessage,
|
||||||
});
|
});
|
||||||
|
// Continue to next room instead of failing completely
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
logger.debug('[ROCKET_CHAT] Messages for room', {
|
logger.debug('[ROCKET_CHAT] Messages for room', {
|
||||||
|
|||||||
@ -45,20 +45,60 @@ export async function GET(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get all users to find the current user
|
// Get all users to find the current user
|
||||||
const usersResponse = await fetch(`${baseUrl}/api/v1/users.list`, {
|
let usersResponse;
|
||||||
|
try {
|
||||||
|
usersResponse = await fetch(`${baseUrl}/api/v1/users.list`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: adminHeaders
|
headers: adminHeaders
|
||||||
});
|
});
|
||||||
|
} catch (error) {
|
||||||
if (!usersResponse.ok) {
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Error fetching users list', {
|
||||||
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to get users list');
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ error: 'Failed to get user' },
|
{ error: 'Failed to connect to RocketChat' },
|
||||||
{ status: 500 }
|
{ status: 500 }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const usersData = await usersResponse.json();
|
if (!usersResponse.ok) {
|
||||||
|
const errorText = await usersResponse.text().catch(() => 'Unknown error');
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to get users list', {
|
||||||
|
status: usersResponse.status,
|
||||||
|
statusText: usersResponse.statusText,
|
||||||
|
errorPreview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Failed to get user list from RocketChat' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = usersResponse.headers.get('content-type') || '';
|
||||||
|
if (!contentType.includes('application/json')) {
|
||||||
|
const errorText = await usersResponse.text().catch(() => 'Unknown error');
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Expected JSON, got HTML', {
|
||||||
|
contentType,
|
||||||
|
errorPreview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'RocketChat returned invalid response format' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let usersData;
|
||||||
|
try {
|
||||||
|
usersData = await usersResponse.json();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to parse users list JSON', {
|
||||||
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Failed to parse RocketChat response' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
const currentUser = usersData.users?.find((u: any) =>
|
const currentUser = usersData.users?.find((u: any) =>
|
||||||
u.username?.toLowerCase() === username.toLowerCase() ||
|
u.username?.toLowerCase() === username.toLowerCase() ||
|
||||||
u.emails?.some((e: any) => e.address?.toLowerCase() === session.user.email?.toLowerCase())
|
u.emails?.some((e: any) => e.address?.toLowerCase() === session.user.email?.toLowerCase())
|
||||||
@ -82,7 +122,9 @@ export async function GET(request: Request) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const createTokenResponse = await fetch(`${baseUrl}/api/v1/users.createToken`, {
|
let createTokenResponse;
|
||||||
|
try {
|
||||||
|
createTokenResponse = await fetch(`${baseUrl}/api/v1/users.createToken`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: adminHeaders,
|
headers: adminHeaders,
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
@ -90,16 +132,54 @@ export async function GET(request: Request) {
|
|||||||
secret: secret
|
secret: secret
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Error creating token', {
|
||||||
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Failed to connect to RocketChat' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (!createTokenResponse.ok) {
|
if (!createTokenResponse.ok) {
|
||||||
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to create user token');
|
const errorText = await createTokenResponse.text().catch(() => 'Unknown error');
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to create user token', {
|
||||||
|
status: createTokenResponse.status,
|
||||||
|
statusText: createTokenResponse.statusText,
|
||||||
|
errorPreview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ error: 'Failed to create token' },
|
{ error: 'Failed to create token' },
|
||||||
{ status: 500 }
|
{ status: 500 }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const tokenData = await createTokenResponse.json();
|
const contentType = createTokenResponse.headers.get('content-type') || '';
|
||||||
|
if (!contentType.includes('application/json')) {
|
||||||
|
const errorText = await createTokenResponse.text().catch(() => 'Unknown error');
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Expected JSON, got HTML', {
|
||||||
|
contentType,
|
||||||
|
errorPreview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'RocketChat returned invalid response format' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tokenData;
|
||||||
|
try {
|
||||||
|
tokenData = await createTokenResponse.json();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('[ROCKET_CHAT_USER_TOKEN] Failed to parse token JSON', {
|
||||||
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
});
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: 'Failed to parse RocketChat response' },
|
||||||
|
{ status: 500 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
logger.debug('[ROCKET_CHAT_USER_TOKEN] Token created', {
|
logger.debug('[ROCKET_CHAT_USER_TOKEN] Token created', {
|
||||||
emailHash: Buffer.from(session.user.email.toLowerCase()).toString('base64').slice(0, 12),
|
emailHash: Buffer.from(session.user.email.toLowerCase()).toString('base64').slice(0, 12),
|
||||||
|
|||||||
@ -67,8 +67,32 @@ export function Parole() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
|
// Check if response is JSON before trying to parse
|
||||||
|
const contentType = response.headers.get('content-type') || '';
|
||||||
|
if (contentType.includes('application/json')) {
|
||||||
const errorData = await response.json();
|
const errorData = await response.json();
|
||||||
throw new Error(errorData.error || 'Failed to fetch messages');
|
throw new Error(errorData.error || 'Failed to fetch messages');
|
||||||
|
} else {
|
||||||
|
// Response is HTML (probably an error page)
|
||||||
|
const errorText = await response.text();
|
||||||
|
console.error('[Parole Widget] Received HTML instead of JSON', {
|
||||||
|
status: response.status,
|
||||||
|
statusText: response.statusText,
|
||||||
|
preview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
|
throw new Error(`Server returned error page (${response.status})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if response is JSON before parsing
|
||||||
|
const contentType = response.headers.get('content-type') || '';
|
||||||
|
if (!contentType.includes('application/json')) {
|
||||||
|
const errorText = await response.text();
|
||||||
|
console.error('[Parole Widget] Expected JSON, got HTML', {
|
||||||
|
contentType,
|
||||||
|
preview: errorText.substring(0, 200),
|
||||||
|
});
|
||||||
|
throw new Error('Server returned invalid response format');
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
@ -153,6 +177,11 @@ export function Parole() {
|
|||||||
}
|
}
|
||||||
setError(null);
|
setError(null);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||||
|
console.error('[Parole Widget] Error fetching messages', {
|
||||||
|
error: errorMessage,
|
||||||
|
forceRefresh,
|
||||||
|
});
|
||||||
console.error('Error fetching messages:', err);
|
console.error('Error fetching messages:', err);
|
||||||
const errorMessage = err instanceof Error ? err.message : 'Failed to fetch messages';
|
const errorMessage = err instanceof Error ? err.message : 'Failed to fetch messages';
|
||||||
setError(errorMessage);
|
setError(errorMessage);
|
||||||
|
|||||||
@ -85,10 +85,30 @@ export async function fetchJsonWithTimeout<T = any>(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const contentType = response.headers.get('content-type');
|
const contentType = response.headers.get('content-type') || '';
|
||||||
if (!contentType || !contentType.includes('application/json')) {
|
|
||||||
throw new Error(`Expected JSON response, got ${contentType}`);
|
// Check if response is JSON
|
||||||
|
if (!contentType.includes('application/json')) {
|
||||||
|
// Try to read the response text to see what we got
|
||||||
|
const responseText = await response.text().catch(() => 'Unable to read response');
|
||||||
|
const preview = responseText.substring(0, 200);
|
||||||
|
|
||||||
|
// If it looks like HTML, provide a more helpful error
|
||||||
|
if (responseText.trim().startsWith('<!DOCTYPE') || responseText.trim().startsWith('<html')) {
|
||||||
|
throw new Error(`Expected JSON response, got text/html. Server may be returning an error page. Preview: ${preview}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.json();
|
throw new Error(`Expected JSON response, got ${contentType || 'unknown'}. Preview: ${preview}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clone the response before reading it, in case we need to read it again
|
||||||
|
const clonedResponse = response.clone();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return await response.json();
|
||||||
|
} catch (jsonError) {
|
||||||
|
// If JSON parsing fails, try to read the text to see what we got
|
||||||
|
const responseText = await clonedResponse.text().catch(() => 'Unable to read response');
|
||||||
|
throw new Error(`Failed to parse JSON response. Content: ${responseText.substring(0, 200)}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user