Add Feedback domain module: public submission flow, admin CRUD, reporting (#7)
Jenkins Production Deployment

Co-authored-by: Patrick Müller <mail@pmueller.me>
Reviewed-on: #7
Co-authored-by: Patrick Mueller <patrick@mueller-patrick.tech>
Co-committed-by: Patrick Mueller <patrick@mueller-patrick.tech>
This commit was merged in pull request #7.
This commit is contained in:
2026-08-23 09:39:02 +00:00
committed by Patrick Müller
parent e7621b8290
commit b05f6b9da0
38 changed files with 4115 additions and 2 deletions
@@ -0,0 +1,76 @@
import {QuestionType} from '../feedback.interface';
export interface SongPickResult {
songId: number;
title: string;
votes: number;
}
export interface SongPickReport {
questionId: number | null;
label: string;
totalVotes: number;
results: SongPickResult[];
}
export interface SongRatingResult {
songId: number;
title: string;
average: number;
count: number;
}
export interface SongRatingReport {
questionId: number | null;
label: string;
results: SongRatingResult[];
}
export interface FreeTextResponse {
submissionId: number;
submittedAt: string;
text: string;
}
export interface FreeTextReport {
questionId: number | null;
label: string;
responses: FreeTextResponse[];
hasMore: boolean;
}
export interface EventReport {
event: {
eventId: number;
name: string;
eventDate: string;
feedbackDeadline: string;
};
totalSubmissions: number;
firstSubmissionAt: string | null;
lastSubmissionAt: string | null;
songPicks: SongPickReport[];
songRatings: SongRatingReport[];
freeText: FreeTextReport[];
guestBookCount: number;
newsletter: {
total: number;
sent: number;
pending: number;
failed: number;
skipped: number;
};
}
/** Raw answer row as read from submission_answers, joined with submissions.submitted_at. */
export interface AnswerRow {
submissionId: number;
submittedAt: string;
questionId: number | null;
questionLabel: string;
questionType: QuestionType;
songId: number | null;
songTitle: string | null;
rating: number | null;
textAnswer: string | null;
}