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
+130
View File
@@ -0,0 +1,130 @@
/**
* @swagger
* components:
* schemas:
* QuestionType:
* type: string
* enum: [SONG_PICK, SONG_RATING, FREE_TEXT]
* Song:
* type: object
* required: [songId, title, position]
* properties:
* songId:
* type: integer
* example: 44
* title:
* type: string
* example: "Abendlied"
* composer:
* type: string
* nullable: true
* example: "Josef Rheinberger"
* position:
* type: integer
* example: 0
* Question:
* type: object
* required: [eventQuestionId, questionId, type, label, position]
* properties:
* eventQuestionId:
* type: integer
* example: 12
* questionId:
* type: integer
* example: 5
* type:
* $ref: '#/components/schemas/QuestionType'
* label:
* type: string
* example: "Welches Stück hat Sie am meisten berührt?"
* helpText:
* type: string
* nullable: true
* position:
* type: integer
* example: 0
* EventSummary:
* type: object
* required: [slug, name, eventDate, feedbackDeadline]
* properties:
* slug:
* type: string
* example: "sommerkonzert-2026"
* name:
* type: string
* example: "Sommerkonzert 2026"
* subtitle:
* type: string
* nullable: true
* eventDate:
* type: string
* format: date
* feedbackDeadline:
* type: string
* format: date-time
* posterImageUrl:
* type: string
* nullable: true
* example: "https://www.nachklang.art/img/nk/image-20260727-214855-851.jpeg"
* EventConfig:
* allOf:
* - $ref: '#/components/schemas/EventSummary'
* - type: object
* properties:
* introText:
* type: string
* nullable: true
* songs:
* type: array
* items:
* $ref: '#/components/schemas/Song'
* questions:
* type: array
* items:
* $ref: '#/components/schemas/Question'
* ProcessingError:
* type: object
* properties:
* status:
* type: string
* example: PROCESSING_ERROR
* message:
* type: string
* example: Internal Server Error. Try again later.
* reference:
* type: string
* example: 6ec1361c-4175-4e81-b2ef-a0792a9a1dc3
*/
export type QuestionType = 'SONG_PICK' | 'SONG_RATING' | 'FREE_TEXT';
export interface Song {
songId: number;
title: string;
composer: string | null;
position: number;
}
export interface Question {
eventQuestionId: number;
questionId: number;
type: QuestionType;
label: string;
helpText: string | null;
position: number;
}
export interface EventSummary {
slug: string;
name: string;
subtitle: string | null;
eventDate: string;
feedbackDeadline: string;
posterImageUrl: string | null;
}
export interface EventConfig extends EventSummary {
introText: string | null;
songs: Song[];
questions: Question[];
}