widget chat 20

This commit is contained in:
Alma 2025-04-11 12:17:59 +02:00
parent 0b85779b55
commit 5efb920d9e
2 changed files with 64 additions and 82 deletions

View File

@ -84,95 +84,89 @@ export const authOptions: NextAuthOptions = {
console.log('JWT callback called with:', { token, account, profile });
if (account && profile) {
// First, get the user's Rocket.Chat ID
// Get user info from Rocket.Chat
const userInfoResponse = await fetch(`${process.env.ROCKET_CHAT_URL}/api/v1/users.info?username=${token.username}`, {
headers: {
'X-Auth-Token': process.env.ROCKET_CHAT_TOKEN!,
'X-User-Id': process.env.ROCKET_CHAT_USER_ID!,
'X-Auth-Token': process.env.ROCKET_CHAT_ADMIN_TOKEN as string,
'X-User-Id': process.env.ROCKET_CHAT_ADMIN_USER_ID as string,
},
});
if (!userInfoResponse.ok) {
console.error('Failed to get user info from Rocket.Chat');
console.error('Failed to get user info:', {
status: userInfoResponse.status,
statusText: userInfoResponse.statusText,
username: token.username
});
return token;
}
const userInfo = await userInfoResponse.json();
console.log('User info from Rocket.Chat:', userInfo);
console.log('User info response:', userInfo);
if (!userInfo.user || !userInfo.user._id) {
console.error('No user ID found in Rocket.Chat response');
console.error('Invalid user info response:', userInfo);
return token;
}
const rocketChatUserId = userInfo.user._id;
console.log('Found user ID:', rocketChatUserId);
// Set the user's Rocket.Chat ID
token.rocketChatUserId = userInfo.user._id;
console.log('Set Rocket.Chat user ID:', token.rocketChatUserId);
// Get user's personal access tokens
// Get personal access tokens for the user
const tokensResponse = await fetch(`${process.env.ROCKET_CHAT_URL}/api/v1/users.getPersonalAccessTokens`, {
method: 'GET',
headers: {
'X-Auth-Token': process.env.ROCKET_CHAT_TOKEN!,
'X-User-Id': process.env.ROCKET_CHAT_USER_ID!,
'Content-Type': 'application/json',
'X-Auth-Token': process.env.ROCKET_CHAT_ADMIN_TOKEN as string,
'X-User-Id': process.env.ROCKET_CHAT_ADMIN_USER_ID as string,
},
});
if (!tokensResponse.ok) {
console.error('Failed to get personal access tokens');
console.error('Failed to get personal access tokens:', {
status: tokensResponse.status,
statusText: tokensResponse.statusText,
username: token.username
});
return token;
}
const tokensData = await tokensResponse.json();
console.log('Parsed tokens data:', tokensData);
console.log('Personal access tokens response:', tokensData);
let personalToken = null;
const tokenName = `keycloak-${token.username}`;
if (tokensData.tokens && tokensData.tokens.length > 0) {
const existingToken = tokensData.tokens.find((t: any) => t.name === tokenName);
if (existingToken) {
console.log('Found existing token:', existingToken);
personalToken = existingToken.lastTokenPart;
}
}
if (!personalToken) {
console.log('Creating new personal access token');
// Find existing token or create a new one
let personalAccessToken = tokensData.tokens?.find((t: any) => t.name === 'NextAuth');
if (!personalAccessToken) {
console.log('No existing token found, creating new one');
const createTokenResponse = await fetch(`${process.env.ROCKET_CHAT_URL}/api/v1/users.generatePersonalAccessToken`, {
method: 'POST',
headers: {
'X-Auth-Token': process.env.ROCKET_CHAT_TOKEN!,
'X-User-Id': process.env.ROCKET_CHAT_USER_ID!,
'Content-Type': 'application/json',
'X-Auth-Token': process.env.ROCKET_CHAT_ADMIN_TOKEN as string,
'X-User-Id': process.env.ROCKET_CHAT_ADMIN_USER_ID as string,
},
body: JSON.stringify({
tokenName,
tokenName: 'NextAuth',
bypassTwoFactor: true,
}),
});
if (createTokenResponse.ok) {
const createTokenData = await createTokenResponse.json();
console.log('Created token data:', createTokenData);
personalToken = createTokenData.token;
} else {
console.error('Failed to create personal access token');
if (!createTokenResponse.ok) {
console.error('Failed to create personal access token:', {
status: createTokenResponse.status,
statusText: createTokenResponse.statusText,
username: token.username
});
return token;
}
const createTokenData = await createTokenResponse.json();
console.log('Create token response:', createTokenData);
personalAccessToken = createTokenData.token;
}
if (personalToken && rocketChatUserId) {
console.log('Setting Rocket.Chat credentials in token:', {
token: personalToken,
userId: rocketChatUserId
});
return {
...token,
rocketChatToken: personalToken,
rocketChatUserId: rocketChatUserId,
};
}
// Set the personal access token
token.rocketChatToken = personalAccessToken.token;
console.log('Set Rocket.Chat token:', token.rocketChatToken);
return token;
}

View File

@ -67,9 +67,21 @@ export async function GET(request: Request) {
const subscriptionsData = await subscriptionsResponse.json();
console.log('Subscriptions response:', subscriptionsData);
// Filter subscriptions to only include rooms where the user is a participant
const userSubscriptions = subscriptionsData.update.filter((subscription: any) => {
// For direct messages, check if the room ID contains the user's ID
if (subscription.t === 'd') {
return subscription.rid.includes(session.rocketChatUserId);
}
// For channels and groups, include all subscriptions
return true;
});
console.log('Filtered subscriptions for user:', userSubscriptions.length);
const messages: any[] = [];
for (const subscription of subscriptionsData.update) {
for (const subscription of userSubscriptions) {
// Skip if we already have 6 messages
if (messages.length >= 6) break;
@ -103,39 +115,15 @@ export async function GET(request: Request) {
if (messagesData.messages && messagesData.messages.length > 0) {
const lastMessage = messagesData.messages[0];
// For direct messages, check if the room ID contains the user's ID
if (subscription.t === 'd') {
// Extract the other user's ID from the room ID
const roomIdParts = subscription.rid.split(session.rocketChatUserId);
const otherUserId = roomIdParts[0] || roomIdParts[1];
// Only include messages where the user is either the sender or the recipient
if (lastMessage.u._id === session.rocketChatUserId || lastMessage.u._id === otherUserId) {
messages.push({
...lastMessage,
roomName: subscription.fname || subscription.name || 'Direct Message',
roomType: subscription.t,
unread: subscription.unread || 0,
userMentions: subscription.userMentions || 0,
groupMentions: subscription.groupMentions || 0,
alert: subscription.alert || false
});
}
} else {
// For channels and groups, only include messages where the user is the sender
if (lastMessage.u._id === session.rocketChatUserId) {
messages.push({
...lastMessage,
roomName: subscription.fname || subscription.name || 'Direct Message',
roomType: subscription.t,
unread: subscription.unread || 0,
userMentions: subscription.userMentions || 0,
groupMentions: subscription.groupMentions || 0,
alert: subscription.alert || false
});
}
}
messages.push({
...lastMessage,
roomName: subscription.fname || subscription.name || 'Direct Message',
roomType: subscription.t,
unread: subscription.unread || 0,
userMentions: subscription.userMentions || 0,
groupMentions: subscription.groupMentions || 0,
alert: subscription.alert || false
});
} else {
console.log(`No messages found for room: ${roomId}`);
}