From 5f41d9ed8d189b32043a69de39bf080c429efcd9 Mon Sep 17 00:00:00 2001 From: Alma Date: Sun, 13 Apr 2025 01:01:06 +0200 Subject: [PATCH] widget parole 17 --- app/api/rocket-chat/messages/route.ts | 80 ++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 14 deletions(-) diff --git a/app/api/rocket-chat/messages/route.ts b/app/api/rocket-chat/messages/route.ts index d6c19b3e..e1df29f8 100644 --- a/app/api/rocket-chat/messages/route.ts +++ b/app/api/rocket-chat/messages/route.ts @@ -98,24 +98,29 @@ export async function GET(request: Request) { id: currentUser._id }); - // Step 3: Create a user token for the current user using admin token - const createTokenResponse = await fetch(`${baseUrl}/api/v1/users.createToken`, { + // Step 3: Login as the user to get their token + const loginResponse = await fetch(`${baseUrl}/api/v1/login`, { method: 'POST', - headers: adminHeaders, + headers: { + 'Content-Type': 'application/json' + }, body: JSON.stringify({ - userId: currentUser._id + user: currentUser.username, + password: process.env.ROCKET_CHAT_USER_PASSWORD // This should be the user's password or a shared password }) }); - if (!createTokenResponse.ok) { - console.error('Failed to create user token:', createTokenResponse.status); + if (!loginResponse.ok) { + console.error('Failed to login as user:', loginResponse.status); + const errorText = await loginResponse.text(); + console.error('Login error details:', errorText); return NextResponse.json({ messages: [] }, { status: 200 }); } - const tokenData = await createTokenResponse.json(); + const loginData = await loginResponse.json(); const userHeaders = { - 'X-Auth-Token': tokenData.data.authToken, - 'X-User-Id': currentUser._id, + 'X-Auth-Token': loginData.data.authToken, + 'X-User-Id': loginData.data.userId, 'Content-Type': 'application/json' }; @@ -199,14 +204,36 @@ export async function GET(request: Request) { }); if (messageData.success && messageData.messages?.length > 0) { + const message = messageData.messages[0]; messages.push({ - ...messageData.messages[0], + id: message._id, + text: message.msg, + timestamp: message.ts, roomName: subscription.fname || subscription.name || 'Direct Message', roomType: subscription.t, unread: subscription.unread || 0, userMentions: subscription.userMentions || 0, alert: subscription.alert || false, - lastSeen: subscription.ls + lastSeen: subscription.ls, + sender: { + username: message.u.username, + name: message.u.name || message.u.username, + initials: (message.u.name || message.u.username || '') + .split(' ') + .map((n: string) => n[0]) + .slice(0, 2) + .join('') + .toUpperCase(), + color: message.u.username === currentUser.username ? '#E3E3E3' : getAvatarColor(message.u.username) + }, + isOwnMessage: message.u.username === currentUser.username, + room: { + id: subscription.rid, + type: subscription.t, + name: subscription.fname || subscription.name, + isChannel: subscription.t === 'c', + isDirect: subscription.t === 'd' + } }); } } catch (error) { @@ -216,12 +243,37 @@ export async function GET(request: Request) { } // Sort messages by timestamp (newest first) and limit to 7 - messages.sort((a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime()); + messages.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); const limitedMessages = messages.slice(0, 7); - return NextResponse.json({ messages: limitedMessages }, { status: 200 }); + return NextResponse.json({ + messages: limitedMessages, + total: messages.length, + hasMore: messages.length > 7 + }, { status: 200 }); } catch (error) { console.error('Error in messages endpoint:', error); - return NextResponse.json({ messages: [] }, { status: 200 }); + return NextResponse.json({ messages: [], total: 0, hasMore: false }, { status: 200 }); } +} + +// Helper function to generate consistent avatar colors +function getAvatarColor(username: string): string { + const colors = [ + '#FF7452', // Coral + '#4CAF50', // Green + '#2196F3', // Blue + '#9C27B0', // Purple + '#FF9800', // Orange + '#00BCD4', // Cyan + '#795548', // Brown + '#607D8B' // Blue Grey + ]; + + // Generate a consistent index based on username + const index = username + .split('') + .reduce((acc, char) => acc + char.charCodeAt(0), 0) % colors.length; + + return colors[index]; } \ No newline at end of file