Skip to content

Commit 5b36629

Browse files
authored
Merge pull request #176 from openscript-ch/46-start-a-questionnaire-and-validate-selected-child-id
46 start a questionnaire and validate selected child
2 parents 37f64b0 + 3bf2621 commit 5b36629

39 files changed

+1993
-1703
lines changed

apps/backend/db/seeds/DatabaseSeeder.ts

Lines changed: 117 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { LanguageCreationDto } from "../../src/defaults/languages/language.dto";
99
import { CarerCreationDto } from "../../src/defaults/carers/carer.dto";
1010
import { ParticipantCreationDto } from "../../src/research/participants/participant.dto";
1111
import { UserCreationDto } from "../../src/system/users/user.dto";
12+
import { StudyCreationDto } from "../../src/research/studies/study.dto";
13+
import { Study } from "../../src/research/studies/study.entity";
1214

1315
export class DatabaseSeeder extends Seeder {
1416
async run(em: EntityManager) {
@@ -40,6 +42,21 @@ export class DatabaseSeeder extends Seeder {
4042
},
4143
];
4244

45+
const studies: StudyCreationDto[] = [
46+
{
47+
id: 700,
48+
title: "Frühjahr 2025",
49+
},
50+
{
51+
id: 800,
52+
title: "Herbst 2025",
53+
},
54+
{
55+
id: 900,
56+
title: "Herbst 2025",
57+
},
58+
];
59+
4360
const carers: CarerCreationDto[] = [
4461
{ name: "Mutter, Mother" },
4562
{ name: "Vater, Father" },
@@ -49,64 +66,120 @@ export class DatabaseSeeder extends Seeder {
4966
{ name: "Bruder, Brother" },
5067
{ name: "Tante, Aunt" },
5168
{ name: "Onkel, Uncle" },
52-
{ name: "Onkel, Uncle" },
5369
{ name: "KiTa, Day care centre" },
5470
{ name: "Spielgruppe, Playgroup" },
5571
{ name: "Turnen, Gymnastics" },
5672
{ name: "Kindergarten, Kindergarten" },
5773
{ name: "Hort, After-school care" },
58-
{ name: "Nanny / Babysitter" },
74+
{ name: "Kinderbetreuung, Nanny / Babysitter" },
5975
{ name: "Nachbar, Neighbour" },
6076
];
6177

6278
const languages: LanguageCreationDto[] = [
63-
{ name: "Deutsch", ietfBcp47: "de" },
64-
{ name: "English", ietfBcp47: "en" },
65-
{ name: "Français", ietfBcp47: "fr" },
66-
{ name: "Italiano", ietfBcp47: "it" },
67-
{ name: "Español", ietfBcp47: "es" },
68-
{ name: "Português", ietfBcp47: "pt" },
69-
{ name: "Nederlands", ietfBcp47: "nl" },
70-
{ name: "Dansk", ietfBcp47: "da" },
71-
{ name: "Svenska", ietfBcp47: "sv" },
72-
{ name: "Norsk", ietfBcp47: "no" },
73-
{ name: "Suomi", ietfBcp47: "fi" },
74-
{ name: "Polski", ietfBcp47: "pl" },
75-
{ name: "Čeština", ietfBcp47: "cs" },
76-
{ name: "Slovenčina", ietfBcp47: "sk" },
77-
{ name: "Magyar", ietfBcp47: "hu" },
78-
{ name: "Română", ietfBcp47: "ro" },
79-
{ name: "Български", ietfBcp47: "bg" },
80-
{ name: "Русский", ietfBcp47: "ru" },
81-
{ name: "Українська", ietfBcp47: "uk" },
82-
{ name: "العربية", ietfBcp47: "ar" },
83-
{ name: "עברית", ietfBcp47: "he" },
84-
{ name: "हिन्दी", ietfBcp47: "hi" },
85-
{ name: "বাংলা", ietfBcp47: "bn" },
86-
{ name: "日本語", ietfBcp47: "ja" },
87-
{ name: "中文", ietfBcp47: "zh" },
88-
{ name: "한국어", ietfBcp47: "ko" },
89-
{ name: "Tiếng Việt", ietfBcp47: "vi" },
90-
{ name: "Deutsch (Schweiz)", ietfBcp47: "de-CH" },
91-
{ name: "Deutsch (Österreich)", ietfBcp47: "de-AT" },
92-
{ name: "Deutsch (Liechtenstein)", ietfBcp47: "de-LI" },
93-
{ name: "Deutsch (Luxemburg)", ietfBcp47: "de-LU" },
94-
{ name: "Deutsch (Belgien)", ietfBcp47: "de-BE" },
95-
{ name: "Français (Suisse)", ietfBcp47: "fr-CH" },
96-
{ name: "Français (Belgique)", ietfBcp47: "fr-BE" },
97-
{ name: "Français (Luxembourg)", ietfBcp47: "fr-LU" },
98-
{ name: "Français (Monaco)", ietfBcp47: "fr-MC" },
99-
{ name: "Italiano (Svizzera)", ietfBcp47: "it-CH" },
100-
{ name: "Italiano (San Marino)", ietfBcp47: "it-SM" },
101-
{ name: "Surselvisch Romontsch", ietfBcp47: "rm-sursilv" },
102-
{ name: "Vallader Romontsch", ietfBcp47: "rm-vallader" },
103-
{ name: "Puter Romontsch", ietfBcp47: "rm-puter" },
104-
{ name: "Rumantsch Grischun", ietfBcp47: "rm" },
79+
{ name: "Deutsch (Schweiz), German (Switzerland)", ietfBcp47: "de-CH" },
80+
{ name: "Deutsch (Österreich), German (Austria)", ietfBcp47: "de-AT" },
81+
{ name: "Deutsch (Liechtenstein), German (Liechtenstein)", ietfBcp47: "de-LI" },
82+
{ name: "Deutsch (Luxemburg), German (Luxemburg)", ietfBcp47: "de-LU" },
83+
{ name: "Deutsch (Belgien), German (Belgium)", ietfBcp47: "de-BE" },
84+
{ name: "Französisch (Schweiz), French (Switzerland)", ietfBcp47: "fr-CH" },
85+
{ name: "Französisch (Belgien), French (Belgium)", ietfBcp47: "fr-BE" },
86+
{ name: "Französisch (Luxembourg), French (Luxembourg)", ietfBcp47: "fr-LU" },
87+
{ name: "Französisch (Monaco), French (Monaco)", ietfBcp47: "fr-MC" },
88+
{ name: "Italienisch (Schweiz), Italian (Switzerland)", ietfBcp47: "it-CH" },
89+
{ name: "Romanisch Surselvisch, Surselvisch Romontsch", ietfBcp47: "rm-sursilv" },
90+
{ name: "Romanisch Vallader, Vallader Romontsch", ietfBcp47: "rm-vallader" },
91+
{ name: "Romanisch Puter, Puter Romontsch", ietfBcp47: "rm-puter" },
92+
{ name: "Romanisch Grischun, Rumantsch Grischun", ietfBcp47: "rm" },
93+
{ name: "Englisch (Vereinigtes Königreich), English (United Kingdom)", ietfBcp47: "en-GB" },
94+
{ name: "Englisch (Vereinigte Staaten), English (United States)", ietfBcp47: "en-US" },
95+
{ name: "Englisch (Irland), English (Ireland)", ietfBcp47: "en-IE" },
96+
{ name: "Spanisch (Spanien), Spanish (Spain)", ietfBcp47: "es-ES" },
97+
{ name: "Spanisch (Andorra), Spanish (Andorra)", ietfBcp47: "es-AD" },
98+
{ name: "Katalanisch (Spanien), Catalan (Spain)", ietfBcp47: "ca-ES" },
99+
{ name: "Katalanisch (Andorra), Catalan (Andorra)", ietfBcp47: "ca-AD" },
100+
{ name: "Portugiesisch (Portugal), Portuguese (Portugal)", ietfBcp47: "pt-PT" },
101+
{ name: "Italienisch (Italien), Italian (Italy)", ietfBcp47: "it-IT" },
102+
{ name: "Französisch (Frankreich), French (France)", ietfBcp47: "fr-FR" },
103+
{ name: "Niederländisch (Niederlande), Dutch (Netherlands)", ietfBcp47: "nl-NL" },
104+
{ name: "Niederländisch (Belgien), Dutch (Belgium)", ietfBcp47: "nl-BE" },
105+
{ name: "Dänisch (Dänemark), Danish (Denmark)", ietfBcp47: "da-DK" },
106+
{ name: "Schwedisch (Schweden), Swedish (Sweden)", ietfBcp47: "sv-SE" },
107+
{ name: "Norwegisch (Norwegen), Norwegian (Norway)", ietfBcp47: "no-NO" },
108+
{ name: "Finnisch (Finnland), Finnish (Finland)", ietfBcp47: "fi-FI" },
109+
{ name: "Isländisch (Island), Icelandic (Iceland)", ietfBcp47: "is-IS" },
110+
{ name: "Estnisch (Estland), Estonian (Estonia)", ietfBcp47: "et-EE" },
111+
{ name: "Lettisch (Lettland), Latvian (Latvia)", ietfBcp47: "lv-LV" },
112+
{ name: "Litauisch (Litauen), Lithuanian (Lithuania)", ietfBcp47: "lt-LT" },
113+
{ name: "Polnisch (Polen), Polish (Poland)", ietfBcp47: "pl-PL" },
114+
{ name: "Tschechisch (Tschechien), Czech (Czech Republic)", ietfBcp47: "cs-CZ" },
115+
{ name: "Slowakisch (Slowakei), Slovak (Slovakia)", ietfBcp47: "sk-SK" },
116+
{ name: "Ungarisch (Ungarn), Hungarian (Hungary)", ietfBcp47: "hu-HU" },
117+
{ name: "Rumänisch (Rumänien), Romanian (Romania)", ietfBcp47: "ro-RO" },
118+
{ name: "Bulgarisch (Bulgarien), Bulgarian (Bulgaria)", ietfBcp47: "bg-BG" },
119+
{ name: "Griechisch (Griechenland), Greek (Greece)", ietfBcp47: "el-GR" },
120+
{ name: "Türkisch (Türkei), Turkish (Turkey)", ietfBcp47: "tr-TR" },
121+
{ name: "Russisch (Russland), Russian (Russia)", ietfBcp47: "ru-RU" },
122+
{ name: "Belarussisch (Weissrussland), Belarusian (Belarus)", ietfBcp47: "be-BY" },
123+
{ name: "Ukrainisch (Ukraine), Ukrainian (Ukraine)", ietfBcp47: "uk-UA" },
124+
{ name: "Serbisch (Serbien), Serbian (Serbia)", ietfBcp47: "sr-RS" },
125+
{ name: "Kroatisch (Kroatien), Croatian (Croatia)", ietfBcp47: "hr-HR" },
126+
{ name: "Bosnisch (Bosnien), Bosnian (Bosnia)", ietfBcp47: "bs-BA" },
127+
{ name: "Slowenisch (Slowenien), Slovenian (Slovenia)", ietfBcp47: "sl-SI" },
128+
{ name: "Albanisch (Albanien), Albanian (Albania)", ietfBcp47: "sq-AL" },
129+
{ name: "Mazedonisch (Nordmazedonien), Macedonian (North Macedonia)", ietfBcp47: "mk-MK" },
130+
{ name: "Montenegrinisch (Montenegro), Montenegrin (Montenegro)", ietfBcp47: "sr-ME" },
131+
{ name: "Arabisch (Ägypten), Arabic (Egypt)", ietfBcp47: "ar-EG" },
132+
{ name: "Arabisch (Saudi-Arabien), Arabic (Saudi Arabia)", ietfBcp47: "ar-SA" },
133+
{ name: "Arabisch (Vereinigte Arabische Emirate), Arabic (UAE)", ietfBcp47: "ar-AE" },
134+
{ name: "Mandarin (China), Mandarin Chinese (China)", ietfBcp47: "zh-CN" },
135+
{ name: "Mandarin (Taiwan), Mandarin Chinese (Taiwan)", ietfBcp47: "zh-TW" },
136+
{ name: "Hindi (Indien), Hindi (India)", ietfBcp47: "hi-IN" },
137+
{ name: "Bengalisch (Bangladesch), Bengali (Bangladesh)", ietfBcp47: "bn-BD" },
138+
{ name: "Bengalisch (Indien), Bengali (India)", ietfBcp47: "bn-IN" },
139+
{ name: "Japanisch (Japan), Japanese (Japan)", ietfBcp47: "ja-JP" },
140+
{ name: "Koreanisch (Südkorea), Korean (South Korea)", ietfBcp47: "ko-KR" },
141+
{ name: "Vietnamesisch (Vietnam), Vietnamese (Vietnam)", ietfBcp47: "vi-VN" },
142+
{ name: "Thailändisch (Thailand), Thai (Thailand)", ietfBcp47: "th-TH" },
143+
{ name: "Malayisch (Malaysia), Malay (Malaysia)", ietfBcp47: "ms-MY" },
144+
{ name: "Tamil (Indien), Tamil (India)", ietfBcp47: "ta-IN" },
145+
{ name: "Telugu (Indien), Telugu (India)", ietfBcp47: "te-IN" },
146+
{ name: "Swahili (Kenia), Swahili (Kenya)", ietfBcp47: "sw-KE" },
147+
{ name: "Swahili (Tansania), Swahili (Tanzania)", ietfBcp47: "sw-TZ" },
148+
{ name: "Persisch (Iran), Persian (Iran)", ietfBcp47: "fa-IR" },
149+
{ name: "Urdu (Pakistan), Urdu (Pakistan)", ietfBcp47: "ur-PK" },
150+
{ name: "Paschtunisch (Afghanistan), Pashto (Afghanistan)", ietfBcp47: "ps-AF" },
151+
{ name: "Türkisch (Türkei), Turkish (Turkey)", ietfBcp47: "tr-TR" },
152+
{ name: "Hebräisch (Israel), Hebrew (Israel)", ietfBcp47: "he-IL" },
153+
{ name: "Javanisch (Indonesien), Javanese (Indonesia)", ietfBcp47: "jv-ID" },
154+
{ name: "Punjabi (Indien), Punjabi (India)", ietfBcp47: "pa-IN" },
155+
{ name: "Punjabi (Pakistan), Punjabi (Pakistan)", ietfBcp47: "pa-PK" },
156+
{ name: "Gujarati (Indien), Gujarati (India)", ietfBcp47: "gu-IN" },
157+
{ name: "Kannada (Indien), Kannada (India)", ietfBcp47: "kn-IN" },
158+
{ name: "Marathi (Indien), Marathi (India)", ietfBcp47: "mr-IN" },
159+
{ name: "Odia (Indien), Odia (India)", ietfBcp47: "or-IN" },
160+
{ name: "Sinhala (Sri Lanka), Sinhala (Sri Lanka)", ietfBcp47: "si-LK" },
161+
{ name: "Burmese (Myanmar), Burmese (Myanmar)", ietfBcp47: "my-MM" },
162+
{ name: "Khmer (Kambodscha), Khmer (Cambodia)", ietfBcp47: "km-KH" },
163+
{ name: "Lao (Laos), Lao (Laos)", ietfBcp47: "lo-LA" },
164+
{ name: "Mongolisch (Mongolei), Mongolian (Mongolia)", ietfBcp47: "mn-MN" },
165+
{ name: "Nepali (Nepal), Nepali (Nepal)", ietfBcp47: "ne-NP" },
166+
{ name: "Singhalesisch (Sri Lanka), Sinhala (Sri Lanka)", ietfBcp47: "si-LK" },
167+
{ name: "Tagalog (Philippinen), Tagalog (Philippines)", ietfBcp47: "tl-PH" },
168+
{ name: "Amharisch (Äthiopien), Amharic (Ethiopia)", ietfBcp47: "am-ET" },
169+
{ name: "Somali (Somalia), Somali (Somalia)", ietfBcp47: "so-SO" },
170+
{ name: "Zulu (Südafrika), Zulu (South Africa)", ietfBcp47: "zu-ZA" },
171+
{ name: "Xhosa (Südafrika), Xhosa (South Africa)", ietfBcp47: "xh-ZA" },
172+
{ name: "Afrikaans (Südafrika), Afrikaans (South Africa)", ietfBcp47: "af-ZA" },
173+
{ name: "Hausa (Nigeria), Hausa (Nigeria)", ietfBcp47: "ha-NG" },
174+
{ name: "Igbo (Nigeria), Igbo (Nigeria)", ietfBcp47: "ig-NG" },
175+
{ name: "Yoruba (Nigeria), Yoruba (Nigeria)", ietfBcp47: "yo-NG" },
176+
{ name: "Maori (Neuseeland), Maori (New Zealand)", ietfBcp47: "mi-NZ" },
105177
];
106178

107179
em.persist([
108180
...users.map((user) => em.create(User, user)),
109181
...participants.map((participant) => em.create(Participant, participant)),
182+
...studies.map((study) => em.create(Study, study)),
110183
...carers.map((carer) => em.create(Carer, carer)),
111184
...languages.map((language) => em.create(Language, language)),
112185
]);

apps/backend/mikro-orm.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Migrator } from "@mikro-orm/migrations";
33
import { TsMorphMetadataProvider } from "@mikro-orm/reflection";
44
import { SeedManager } from "@mikro-orm/seeder";
55
import { configuration } from "./src/config/configuration";
6+
import { HttpException, HttpStatus } from "@nestjs/common";
67

78
const c = configuration();
89

@@ -17,6 +18,7 @@ export default defineConfig({
1718
driver: PostgreSqlDriver,
1819
metadataProvider: TsMorphMetadataProvider,
1920
extensions: [Migrator, SeedManager],
21+
findOneOrFailHandler: (entityName) => new HttpException(`${entityName} not found.`, HttpStatus.NOT_FOUND),
2022
migrations: {
2123
path: "./db/migrations",
2224
pathTs: "./db/migrations",

apps/backend/package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,36 +33,36 @@
3333
"@mikro-orm/postgresql": "^6.4.0",
3434
"@mikro-orm/reflection": "^6.4.0",
3535
"@mikro-orm/seeder": "^6.4.0",
36-
"@nestjs/common": "^10.4.7",
36+
"@nestjs/common": "^10.4.12",
3737
"@nestjs/config": "^3.3.0",
38-
"@nestjs/core": "^10.4.7",
38+
"@nestjs/core": "^10.4.12",
3939
"@nestjs/jwt": "^10.2.0",
40-
"@nestjs/platform-fastify": "^10.4.7",
41-
"@nestjs/swagger": "^8.0.5",
40+
"@nestjs/platform-fastify": "^10.4.12",
41+
"@nestjs/swagger": "^8.0.7",
4242
"@nestjs/terminus": "^10.2.3",
4343
"class-transformer": "^0.5.1",
4444
"class-validator": "^0.14.1",
4545
"fastify": "^4.28.1",
46-
"hash-wasm": "^4.11.0",
46+
"hash-wasm": "^4.12.0",
4747
"reflect-metadata": "^0.2.2",
4848
"rxjs": "^7.8.1"
4949
},
5050
"devDependencies": {
51-
"@nestjs/cli": "^10.4.7",
51+
"@nestjs/cli": "^10.4.8",
5252
"@nestjs/schematics": "^10.2.3",
53-
"@nestjs/testing": "^10.4.7",
53+
"@nestjs/testing": "^10.4.12",
5454
"@types/jest": "^29.5.14",
55-
"@types/node": "^20.17.6",
55+
"@types/node": "^20.17.9",
5656
"@types/supertest": "^6.0.2",
5757
"jest": "^29.7.0",
58-
"prettier": "^3.3.3",
58+
"prettier": "^3.4.1",
5959
"source-map-support": "^0.5.21",
6060
"supertest": "^7.0.0",
6161
"ts-jest": "^29.2.5",
6262
"ts-loader": "^9.5.1",
6363
"ts-node": "^10.9.2",
6464
"tsconfig-paths": "^4.2.0",
65-
"typescript": "^5.6.3"
65+
"typescript": "^5.7.2"
6666
},
6767
"overrides": {
6868
"sodium-native": "4.2.0"

apps/backend/src/research/participants/participants.controller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Body, Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
22
import { ParticipantsService } from "./participants.service";
3-
import { ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
3+
import { ApiNotFoundResponse, ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
44
import { ParticipantCreationDto, ParticipantMutationDto, ParticipantResponseDto } from "./participant.dto";
55
import { ErrorResponseDto } from "../../common/dto/error.dto";
66
import { Roles } from "../../system/users/roles.decorator";
@@ -26,6 +26,7 @@ export class ParticipantsController {
2626

2727
@Get(":id")
2828
@ApiOperation({ summary: "Get a participant by ID" })
29+
@ApiNotFoundResponse({ description: "Entity not found exception", type: ErrorResponseDto })
2930
get(@Param("id") id: string): Promise<ParticipantResponseDto> {
3031
return this.participantService.findOne(+id);
3132
}

apps/backend/src/research/questionnaires/questionnaire.dto.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ApiProperty, OmitType, PartialType } from "@nestjs/swagger";
22
import { Type } from "class-transformer";
3-
import { IsDate, IsNotEmpty } from "class-validator";
3+
import { IsDateString, IsNotEmpty } from "class-validator";
44
import { ParticipantDto } from "../participants/participant.dto";
55
import { StudyDto } from "../studies/study.dto";
66

@@ -9,11 +9,11 @@ export class QuestionnaireDto {
99
id: number;
1010

1111
@ApiProperty({ example: "2024-11-01T07:00:00.000Z", description: "The starting date of the questionnaire" })
12-
@IsDate()
12+
@IsDateString()
1313
startedAt?: Date;
1414

1515
@ApiProperty({ example: "2024-11-01T08:00:00.00Z", description: "The ending date of the questionnaire" })
16-
@IsDate()
16+
@IsDateString()
1717
endedAt?: Date;
1818

1919
@ApiProperty({ example: "First few months", description: "The title of the questionnaire" })
@@ -33,5 +33,8 @@ export class QuestionnaireDto {
3333
entries?: number[];
3434
}
3535
export class QuestionnaireResponseDto extends QuestionnaireDto {}
36-
export class QuestionnaireCreationDto extends OmitType(QuestionnaireDto, ["id"]) {}
36+
export class QuestionnaireCreationDto extends OmitType(QuestionnaireDto, ["id", "study", "participant"]) {
37+
study: number;
38+
participant: number;
39+
}
3740
export class QuestionnaireMutationDto extends PartialType(QuestionnaireCreationDto) {}

apps/backend/src/research/questionnaires/questionnaires.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class QuestionnairesService {
1414

1515
async create(questionnaireCreationDto: QuestionnaireCreationDto) {
1616
const questionnaire = new Questionnaire();
17-
questionnaire.assign(questionnaireCreationDto);
17+
questionnaire.assign(questionnaireCreationDto, { em: this.em });
1818

1919
try {
2020
await this.em.persist(questionnaire).flush();

apps/backend/src/research/studies/studies.controller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Body, Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
2-
import { ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
2+
import { ApiNotFoundResponse, ApiOperation, ApiTags, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
33
import { ErrorResponseDto } from "../../common/dto/error.dto";
44
import { Roles } from "../../system/users/roles.decorator";
55
import { UserRole } from "../../system/users/user.entity";
@@ -26,6 +26,7 @@ export class StudiesController {
2626

2727
@Get(":id")
2828
@ApiOperation({ summary: "Get a study by ID" })
29+
@ApiNotFoundResponse({ description: "Entity not found exception", type: ErrorResponseDto })
2930
get(@Param("id") id: string): Promise<StudyResponseDto> {
3031
return this.studiesService.findOne(+id);
3132
}

apps/backend/src/research/studies/study.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class StudyDto {
1111
title: string;
1212

1313
@Type(() => Array<number>)
14-
questionnaires: number[];
14+
questionnaires?: number[];
1515
}
1616

1717
export class StudyResponseDto extends StudyDto {}

apps/frontend/package.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,32 @@
1616
"test": "vitest"
1717
},
1818
"dependencies": {
19-
"@mantine/form": "^7.13.5",
19+
"@mantine/form": "^7.14.3",
2020
"@nanostores/i18n": "^0.12.2",
2121
"@nanostores/persistent": "^0.10.2",
22-
"@nanostores/react": "^0.8.0",
22+
"@nanostores/react": "^0.8.2",
2323
"@quassel/ui": "workspace:*",
24-
"@tanstack/react-query": "^5.59.20",
25-
"@tanstack/react-router": "^1.81.4",
24+
"@tanstack/react-query": "^5.62.0",
25+
"@tanstack/react-router": "^1.85.0",
2626
"nanostores": "^0.11.3",
27-
"openapi-fetch": "^0.13.0",
28-
"openapi-react-query": "^0.2.4",
27+
"openapi-fetch": "^0.13.1",
28+
"openapi-react-query": "^0.2.6",
2929
"react": "^18.3.1",
3030
"react-dom": "^18.3.1"
3131
},
3232
"devDependencies": {
33-
"@tanstack/router-devtools": "^1.81.4",
34-
"@tanstack/router-plugin": "^1.79.0",
33+
"@tanstack/router-devtools": "^1.85.0",
34+
"@tanstack/router-plugin": "^1.84.4",
3535
"@testing-library/jest-dom": "^6.6.3",
3636
"@testing-library/react": "^16.0.1",
3737
"@types/react": "^18.3.12",
3838
"@types/react-dom": "^18.3.1",
39-
"@vitejs/plugin-react": "^4.3.3",
40-
"@vitest/coverage-v8": "2.1.4",
39+
"@vitejs/plugin-react": "^4.3.4",
40+
"@vitest/coverage-v8": "2.1.6",
4141
"jsdom": "^25.0.1",
42-
"openapi-typescript": "^7.4.3",
43-
"typescript": "^5.6.3",
44-
"vite": "^5.4.11",
45-
"vitest": "^2.1.4"
42+
"openapi-typescript": "^7.4.4",
43+
"typescript": "^5.7.2",
44+
"vite": "^6.0.2",
45+
"vitest": "^2.1.6"
4646
}
4747
}

0 commit comments

Comments
 (0)