fix(admin): Melder-Nachricht grammatisch korrekt (zum Beitrag/Profil)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-04 13:16:48 +02:00
1 parent c678c4cf27
commit 81e617ece5
3 files changed
+8 -8

No files matched your search

+1 -1
View File
@@ -181,4 +181,4 @@ Neu 7:
- Feature: Storie-Edit Modus, mittels Overlays eigene Storys hübsch machen, durch Texteingaben in das Bild oder Effekte oder Gifs. (Analog zu Instagram) ->Branch
- [x] Admin-Dashboard -> Zurückgewiesene Reports, als Meldung an den Melder mit einer Begründung warum abgewiesen wurde. Sowie Meldung bei bestätigter Report löschung, z.b mit Danksagung für die Meldung.
→ **Umgesetzt und live (04.10.), als Team-Nachricht.** Admin → Reports: „Report ignorieren“ hat jetzt ein Feld „Begründung für den Melder“; der Melder bekommt vom PawFeed-Team „Danke für deine Meldung zu den Beitrag/das Profil von X … kein Verstoß … Begründung: …“ (Begründung steht zusätzlich im Moderations-Log). „Post löschen“ dankt jedem Melder des Beitrags einmal („… Inhalt entfernt. Danke, dass du hilfst …“); die interne Lösch-Begründung geht bewusst nicht an den Melder. Beides per Schalter im Dialog abschaltbar, Versand erst nach erfolgreicher Moderation und ohne sie bei einem Fehler zu kippen. **Nebenbei behoben:** Beim Löschen eines gemeldeten Beitrags blieben dessen Reports verwaist in der Liste (`targetPostId` ist keine Relation) — werden jetzt mitgelöscht. 7 neue Tests (`admin-report-feedback.test.ts`), alle 336 Tests grün. Commit `f51b158`, Rolling-Deploy auf dem NAS. Kein App-Update nötig. Im Live-Admin noch nicht mit einem echten Report ausprobiert.
→ **Umgesetzt und live (04.10.), als Team-Nachricht.** Admin → Reports: „Report ignorieren“ hat jetzt ein Feld „Begründung für den Melder“; der Melder bekommt vom PawFeed-Team „Danke für deine Meldung zum Beitrag/Profil von X … kein Verstoß … Begründung: …“ (Begründung steht zusätzlich im Moderations-Log). „Post löschen“ dankt jedem Melder des Beitrags einmal („… Inhalt entfernt. Danke, dass du hilfst …“); die interne Lösch-Begründung geht bewusst nicht an den Melder. Beides per Schalter im Dialog abschaltbar, Versand erst nach erfolgreicher Moderation und ohne sie bei einem Fehler zu kippen. **Nebenbei behoben:** Beim Löschen eines gemeldeten Beitrags blieben dessen Reports verwaist in der Liste (`targetPostId` ist keine Relation) — werden jetzt mitgelöscht. 7 neue Tests (`admin-report-feedback.test.ts`), alle 336 Tests grün. Commit `f51b158`, Rolling-Deploy auf dem NAS. Kein App-Update nötig. Im Live-Admin noch nicht mit einem echten Report ausprobiert.
+3 -3
View File
@@ -62,7 +62,7 @@ describe("admin.dismissReport reporter feedback", () => {
expect(mockSendTeamMessage).toHaveBeenCalledTimes(1);
const [, petId, body] = mockSendTeamMessage.mock.calls[0];
expect(petId).toBe("reporter-1");
expect(body).toContain("den Beitrag von Bubi");
expect(body).toContain("Meldung zum Beitrag von Bubi");
expect(body).toContain("keinen Verstoß");
expect(body).toContain("Begründung: Das ist ein normales Spielvideo.");
expect(mockPrisma.moderationLog.create).toHaveBeenCalledWith(
@@ -80,7 +80,7 @@ describe("admin.dismissReport reporter feedback", () => {
await caller.admin.dismissReport({ reportId: "r2" });
const body = mockSendTeamMessage.mock.calls[0][2] as string;
expect(body).toContain("das Profil von Luna");
expect(body).toContain("Meldung zum Profil von Luna");
expect(body).not.toContain("Begründung");
});
@@ -122,7 +122,7 @@ describe("admin.deleteReportedPost reporter feedback", () => {
expect(mockPrisma.report.deleteMany).toHaveBeenCalledWith({ where: { targetPostId: "post-1" } });
expect(mockSendTeamMessage.mock.calls.map((c) => c[1])).toEqual(["reporter-1", "reporter-2"]);
const body = mockSendTeamMessage.mock.calls[0][2] as string;
expect(body).toContain("den Beitrag von Bubi");
expect(body).toContain("Meldung zum Beitrag von Bubi");
expect(body).toContain("Inhalt entfernt");
// Die interne Lösch-Begründung geht nicht an den Melder.
expect(body).not.toContain("Gewaltdarstellung");
+4 -4
View File
@@ -10,9 +10,9 @@
const SIGNATURE = "Bei Fragen antworte einfach auf diese Nachricht. Dein PawFeed-Team";
/** „den Beitrag von Bubi“ / „das Profil von Bubi“ — Fallback ohne Namen, falls das Ziel nicht mehr existiert. */
/** „zum Beitrag von Bubi“ / „zum Profil von Bubi“ — Fallback ohne Namen, falls das Ziel nicht mehr existiert. */
export function describeReportTarget(kind: "post" | "pet", targetPetName: string | null): string {
const noun = kind === "post" ? "den Beitrag" : "das Profil";
const noun = kind === "post" ? "zum Beitrag" : "zum Profil";
return targetPetName ? `${noun} von ${targetPetName}` : noun;
}
@@ -20,7 +20,7 @@ export function reportDismissedMessage(target: string, reason: string): string {
const trimmedReason = reason.trim();
const reasonPart = trimmedReason ? `\n\nBegründung: ${trimmedReason}` : "";
return (
`Hallo, danke für deine Meldung zu ${target}. Wir haben sie geprüft und ` +
`Hallo, danke für deine Meldung ${target}. Wir haben sie geprüft und ` +
`keinen Verstoß gegen unsere Community-Richtlinien festgestellt, deshalb bleibt der Inhalt online.` +
`${reasonPart}\n\n${SIGNATURE}`
);
@@ -28,7 +28,7 @@ export function reportDismissedMessage(target: string, reason: string): string {
export function reportUpheldMessage(target: string): string {
return (
`Hallo, danke für deine Meldung zu ${target}. Wir haben sie geprüft und den Inhalt entfernt. ` +
`Hallo, danke für deine Meldung ${target}. Wir haben sie geprüft und den Inhalt entfernt. ` +
`Danke, dass du hilfst, PawFeed sicher und freundlich zu halten!\n\n${SIGNATURE}`
);
}