Add Feedback domain module: public submission flow, admin CRUD, reporting (#7)
Jenkins Production Deployment
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:
@@ -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[];
|
||||
}
|
||||
Reference in New Issue
Block a user