feat(sprint7): Phase 3 — Forum MVP

- Flyway V15: forum_topics, forum_replies, forum_reactions, forum_reports tables
- Enums: ForumTargetType, ReactionType, ReportStatus
- Extended AuditEventType with FORUM_REPLY_CREATED, FORUM_REPORT_REVIEWED
- Entities: ForumTopic, ForumReply, ForumReaction, ForumReport
- Repositories: ForumTopicRepository, ForumReplyRepository, ForumReactionRepository, ForumReportRepository
- ForumService: full CRUD, moderation (lock/pin/delete), 60-min edit window,
  toggle reactions, content reporting, notifications on new topics/replies
- ForumController: admin + portal endpoints (topics, replies, reactions, reports, moderation)
- Frontend: forum.ts service with React Query hooks (admin + portal)
- Frontend: Admin forum page with topic list, moderation actions (lock/pin/delete)
- Frontend: Portal forum page with topic list, reply thread, reactions, report
- Navigation: added Forum with MessageSquare icon
- i18n: forum.* keys in de.json and en.json
This commit is contained in:
Patrick Plate
2026-06-13 20:31:17 +02:00
parent 05fd679c4d
commit a539ed9eb2
21 changed files with 2059 additions and 14 deletions
+28
View File
@@ -808,5 +808,33 @@
"WORKSHOP": "Workshop",
"OTHER": "Sonstiges"
}
},
"forum": {
"title": "Forum",
"description": "Vereinsinternes Diskussionsforum",
"newTopic": "Neues Thema",
"topicTitlePlaceholder": "Titel des Themas...",
"topicContentPlaceholder": "Beschreibe dein Thema...",
"creating": "Wird erstellt...",
"create": "Erstellen",
"cancel": "Abbrechen",
"loading": "Wird geladen...",
"noTopics": "Noch keine Themen vorhanden. Erstelle das erste!",
"replies": "Antworten",
"lastReply": "Letzte Antwort",
"openReports": "offene Meldungen",
"pin": "Anheften",
"unpin": "Lösen",
"lock": "Sperren",
"unlock": "Entsperren",
"delete": "Löschen",
"deleteReason": "Grund für die Löschung (optional):",
"replyPlaceholder": "Schreibe eine Antwort...",
"sending": "Wird gesendet...",
"reply": "Antworten",
"edited": "bearbeitet",
"topicLocked": "Dieses Thema ist gesperrt. Neue Antworten sind nicht möglich.",
"reportReason": "Grund der Meldung:",
"backToTopics": "Zurück zur Übersicht"
}
}
+96 -13
View File
@@ -610,21 +610,76 @@
"onboarding": "Personal onboarding"
},
"comparison": {
"compMembers": { "label": "Members", "starter": "Up to 30", "pro": "Up to 100", "enterprise": "Unlimited" },
"compDistributions": { "label": "Distribution tracking", "starter": "✓", "pro": "✓", "enterprise": "✓" },
"compReports": { "label": "Reports (PDF/CSV)", "starter": "Standard", "pro": "Advanced", "enterprise": "Custom" },
"compGrow": { "label": "Grow calendar", "starter": "—", "pro": "✓", "enterprise": "✓" },
"compStaff": { "label": "Staff management", "starter": "—", "pro": "✓", "enterprise": "✓" },
"compApi": { "label": "API access", "starter": "—", "pro": "✓", "enterprise": "✓" },
"compMultiClub": { "label": "Multi-club", "starter": "—", "pro": "—", "enterprise": "✓" },
"compSupport": { "label": "Support", "starter": "Email", "pro": "Priority", "enterprise": "Dedicated" }
"compMembers": {
"label": "Members",
"starter": "Up to 30",
"pro": "Up to 100",
"enterprise": "Unlimited"
},
"compDistributions": {
"label": "Distribution tracking",
"starter": "✓",
"pro": "✓",
"enterprise": "✓"
},
"compReports": {
"label": "Reports (PDF/CSV)",
"starter": "Standard",
"pro": "Advanced",
"enterprise": "Custom"
},
"compGrow": {
"label": "Grow calendar",
"starter": "—",
"pro": "✓",
"enterprise": "✓"
},
"compStaff": {
"label": "Staff management",
"starter": "—",
"pro": "✓",
"enterprise": "✓"
},
"compApi": {
"label": "API access",
"starter": "—",
"pro": "✓",
"enterprise": "✓"
},
"compMultiClub": {
"label": "Multi-club",
"starter": "—",
"pro": "—",
"enterprise": "✓"
},
"compSupport": {
"label": "Support",
"starter": "Email",
"pro": "Priority",
"enterprise": "Dedicated"
}
},
"faq": {
"trial": { "question": "How does the free trial work?", "answer": "You can test CannaManage free for 3 months with no commitment. All features of your chosen plan are available immediately. After the trial, you decide whether to continue." },
"payment": { "question": "Which payment methods are accepted?", "answer": "We accept SEPA direct debit, credit card (Visa, Mastercard) and PayPal. Billing is monthly through our payment partner Stripe." },
"cancel": { "question": "Can I cancel anytime?", "answer": "Yes, you can cancel your subscription at any time at the end of the current billing period. There is no minimum contract period." },
"data": { "question": "What happens to my data after cancellation?", "answer": "After cancellation, you have 30 days to export your data. After that, all personal data is deleted in accordance with GDPR. Data subject to retention requirements remains stored in compliance with the law." },
"migration": { "question": "Can I switch plans later?", "answer": "Yes, you can switch between Starter and Pro at any time. Upgrades take effect immediately, downgrades at the next billing period." }
"trial": {
"question": "How does the free trial work?",
"answer": "You can test CannaManage free for 3 months with no commitment. All features of your chosen plan are available immediately. After the trial, you decide whether to continue."
},
"payment": {
"question": "Which payment methods are accepted?",
"answer": "We accept SEPA direct debit, credit card (Visa, Mastercard) and PayPal. Billing is monthly through our payment partner Stripe."
},
"cancel": {
"question": "Can I cancel anytime?",
"answer": "Yes, you can cancel your subscription at any time at the end of the current billing period. There is no minimum contract period."
},
"data": {
"question": "What happens to my data after cancellation?",
"answer": "After cancellation, you have 30 days to export your data. After that, all personal data is deleted in accordance with GDPR. Data subject to retention requirements remains stored in compliance with the law."
},
"migration": {
"question": "Can I switch plans later?",
"answer": "Yes, you can switch between Starter and Pro at any time. Upgrades take effect immediately, downgrades at the next billing period."
}
}
},
"impressum": {
@@ -753,5 +808,33 @@
"WORKSHOP": "Workshop",
"OTHER": "Other"
}
},
"forum": {
"title": "Forum",
"description": "Club-internal discussion forum",
"newTopic": "New Topic",
"topicTitlePlaceholder": "Topic title...",
"topicContentPlaceholder": "Describe your topic...",
"creating": "Creating...",
"create": "Create",
"cancel": "Cancel",
"loading": "Loading...",
"noTopics": "No topics yet. Create the first one!",
"replies": "Replies",
"lastReply": "Last reply",
"openReports": "open reports",
"pin": "Pin",
"unpin": "Unpin",
"lock": "Lock",
"unlock": "Unlock",
"delete": "Delete",
"deleteReason": "Reason for deletion (optional):",
"replyPlaceholder": "Write a reply...",
"sending": "Sending...",
"reply": "Reply",
"edited": "edited",
"topicLocked": "This topic is locked. New replies are not possible.",
"reportReason": "Reason for report:",
"backToTopics": "Back to overview"
}
}