chahinebrini 69f01c5a0c feat(chat): DM-Reaktionen + Soft-Delete Backend + comment_likes realtime
- db/chat: getDmHistory liefert reactions + deletedAt; toggleDmReaction
  (WA-Toggle) + softDeleteDmMessage (nur eigene)
- Endpoints: /api/chat/reaction (Emoji-Toggle, 7er-Allowlist) +
  /api/chat/delete-message (Soft-Delete für alle)
- dm/[userId].get: aggregierte reactions + deleted im Response, Inhalt bei
  Tombstone geblankt
- Migration: comment_likes zur supabase_realtime-Publication (fixt
  Post-Kommentar-Like-Realtime, eskaliert von rebreak-native-ui)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 11:18:32 +02:00

34 lines
1.2 KiB
TypeScript

import { toggleDmReaction } from "../../db/chat";
// Erlaubte Reaktions-Emojis (= die WhatsApp-Standardleiste). Begrenzt Müll in
// der DB; eine "+"-Custom-Auswahl ist ein späteres Feature.
const ALLOWED_EMOJIS = ["👍", "❤️", "😂", "😮", "😢", "🙏", "👏"];
/**
* POST /api/chat/reaction
* Toggle einer Emoji-Reaktion auf eine DM (WhatsApp-Verhalten: gleiches Emoji
* entfernt, anderes ersetzt). Body: { messageId, emoji }.
* Group-Chat-Reaktionen sind in diesem Release nicht aktiv (nur DM).
*/
export default defineEventHandler(async (event) => {
const user = await requireUser(event);
const body = await readBody(event);
const messageId = body?.messageId as string | undefined;
const emoji = body?.emoji as string | undefined;
if (!messageId || !emoji) {
throw createError({
statusCode: 400,
message: "messageId und emoji erforderlich",
});
}
if (!ALLOWED_EMOJIS.includes(emoji)) {
throw createError({ statusCode: 400, message: "Emoji nicht erlaubt" });
}
const result = await toggleDmReaction(user.id, messageId, emoji);
// emoji = null wenn die Reaktion entfernt wurde
return { emoji: result.emoji };
});