- 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>
34 lines
1.2 KiB
TypeScript
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 };
|
|
});
|