47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import { listRooms, seedDefaultRooms } from "../../../db/chat-rooms";
|
||
import { getUsersMeta } from "../../../utils/getUsersMeta";
|
||
|
||
/** GET /api/chat/rooms – Alle Rooms (public + eigene) */
|
||
export default defineEventHandler(async (event) => {
|
||
const user = await requireUser(event);
|
||
|
||
// Auto-seed default groups on first request
|
||
await seedDefaultRooms().catch(() => {});
|
||
|
||
const rooms = await listRooms(user.id);
|
||
|
||
// Resolve user meta for last message senders
|
||
const senderIds = rooms
|
||
.map((r) => r.messages[0]?.userId)
|
||
.filter(Boolean) as string[];
|
||
const meta = senderIds.length > 0 ? await getUsersMeta(senderIds) : {};
|
||
|
||
return rooms.map((r) => {
|
||
const lastMsg = r.messages[0];
|
||
const isMember = r.members.some((m) => m.userId === user.id);
|
||
const myRole = r.members.find((m) => m.userId === user.id)?.role ?? null;
|
||
return {
|
||
id: r.id,
|
||
name: r.name,
|
||
description: r.description,
|
||
isPublic: r.isPublic,
|
||
isDefault: r.isDefault,
|
||
joinMode: r.joinMode,
|
||
avatarUrl: r.avatarUrl ?? null,
|
||
inviteCode:
|
||
myRole === "owner" || myRole === "admin" ? r.inviteCode : null,
|
||
memberCount: r.memberCount,
|
||
isMember,
|
||
myRole,
|
||
createdBy: r.createdBy,
|
||
lastMessage: lastMsg
|
||
? {
|
||
content: lastMsg.content.slice(0, 80),
|
||
createdAt: lastMsg.createdAt,
|
||
senderName: meta[lastMsg.userId]?.nickname ?? "Anonym",
|
||
}
|
||
: null,
|
||
};
|
||
});
|
||
});
|