mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 00:41:09 +02:00
Schließt den Loop zwischen Submit und Ship. User kriegt jetzt:
- Toast beim nächsten App-Start, wenn ein eigener oder unterstützter
Wisch ›planned/in_progress/completed/declined‹ wurde
- /profile/my-wishes als persönliche Roadmap mit drei Tabs:
Eigene · Unterstützt · Inbox
Server (mana-analytics):
- Neue Tabelle feedback_notifications mit ON DELETE CASCADE auf
user_feedback. Migration 0004 lokal + prod eingespielt.
- adminUpdate enqueued bei jeder Status-Transition Author-
Notifications. AdminResponse-Edits feuern eine eigene
'admin_response'-Notify. tryGrantShipBonus hängt zusätzlich
Reactioner-Notifications dran (›Dein Like ist gelandet, +25 Mana‹).
- Endpoints:
GET /api/v1/feedback/me/notifications?unread_only=true&limit=N
POST /api/v1/feedback/me/notifications/:id/read
POST /api/v1/feedback/me/notifications/read-all
GET /api/v1/feedback/me/reacted (für die My-Wishes-Page)
Package (@mana/feedback):
- FeedbackNotification + NotificationKind types exportiert
- service.getNotifications/markNotificationRead/markAllNotificationsRead
- service.getMyReactedItems
Web:
- lib/notifications/feedback-toaster.svelte.ts: Boot-Pull + 60s-Poll,
rendert unread-notifications via toast-store, markiert sofort read.
In (app)/+layout.svelte's authReady-Hook gestartet/gestoppt.
- /profile/my-wishes: Tab-View über getMyFeedback + getMyReactedItems
+ getNotifications. Tabs zeigen Counter-Badges, unread-Badge in der
Inbox-Sektion. ›Alle als gelesen markieren‹-Action vorhanden.
Pre-launch saubere Lösung — kein Polling-Spam (60s), Mark-Read direkt
nach Toast-Display, fail-soft an mehreren Stellen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 lines
1,021 B
PL/PgSQL
32 lines
1,021 B
PL/PgSQL
-- 0004_feedback_notifications.sql
|
|
--
|
|
-- Phase 3.B.1 von docs/plans/feedback-rewards-and-identity.md.
|
|
--
|
|
-- Per-User-Inbox-Tabelle für Status-Change-Notifications. Server
|
|
-- enqueued bei jedem adminUpdate, Web-App pollt beim Boot und rendert
|
|
-- Unread-Items als Toast.
|
|
--
|
|
-- ON DELETE CASCADE: wenn ein feedback-Item gelöscht wird, sind
|
|
-- baumelnde Notifications irrelevant.
|
|
|
|
BEGIN;
|
|
|
|
CREATE TABLE IF NOT EXISTS feedback.feedback_notifications (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id text NOT NULL,
|
|
feedback_id uuid NOT NULL REFERENCES feedback.user_feedback(id) ON DELETE CASCADE,
|
|
kind text NOT NULL,
|
|
title text NOT NULL,
|
|
body text,
|
|
credits_awarded integer NOT NULL DEFAULT 0,
|
|
read_at timestamptz,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS feedback_notifications_unread_idx
|
|
ON feedback.feedback_notifications (user_id, created_at);
|
|
|
|
CREATE INDEX IF NOT EXISTS feedback_notifications_feedback_idx
|
|
ON feedback.feedback_notifications (feedback_id);
|
|
|
|
COMMIT;
|