widget chat 20
This commit is contained in:
parent
0b85779b55
commit
5efb920d9e
@ -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;
|
||||
}
|
||||
|
||||
@ -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}`);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user