@@ -5,6 +5,7 @@ import { QuestionnaireCreationDto, QuestionnaireMutationDto } from "./questionna
5
5
import { Questionnaire } from "./questionnaire.entity" ;
6
6
import { Entry } from "../entries/entry.entity" ;
7
7
import { EntryLanguage } from "../entry-languages/entry-language.entity" ;
8
+ import { addDays , isSameDay } from "date-fns" ;
8
9
9
10
@Injectable ( )
10
11
export class QuestionnairesService {
@@ -18,10 +19,12 @@ export class QuestionnairesService {
18
19
const questionnaire = new Questionnaire ( ) ;
19
20
questionnaire . assign ( questionnaireCreationDto , { em : this . em } ) ;
20
21
21
- const prevQuestionnaire = await this . questionnaireRepository . findOne (
22
- { participant : questionnaire . participant } ,
23
- { orderBy : { endedAt : "desc" } , populate : [ "entries.entryLanguages" ] }
24
- ) ;
22
+ const prevQuestionnaire = await this . findLatestByParticipant ( questionnaire . participant ! . id ) ;
23
+ this . validateStartDate ( questionnaire , prevQuestionnaire ) ;
24
+
25
+ prevQuestionnaire ?. populate ( [ "entries.entryLanguages" ] ) ;
26
+
27
+ await this . questionnaireRepository . findOne ( { participant : questionnaire . participant } , { orderBy : { endedAt : "desc" } } ) ;
25
28
26
29
const clonedEntries = prevQuestionnaire ?. entries . map ( ( entry ) => {
27
30
const { id : _id , entryLanguages : _entryLanguages , questionnaire : _questionnaire , ...rest } = entry . toPOJO ( ) ;
@@ -35,7 +38,7 @@ export class QuestionnairesService {
35
38
return newEntry ;
36
39
} ) ;
37
40
38
- questionnaire . assign ( { entries : clonedEntries } ) ;
41
+ questionnaire . assign ( { entries : clonedEntries ?? [ ] } ) ;
39
42
40
43
try {
41
44
await this . em . persist ( questionnaire ) . flush ( ) ;
@@ -63,12 +66,21 @@ export class QuestionnairesService {
63
66
return ( await this . questionnaireRepository . findOneOrFail ( filter ) ) . toObject ( ) ;
64
67
}
65
68
69
+ async findLatestByParticipant ( participantId : number ) {
70
+ return this . questionnaireRepository . findOne ( { participant : participantId } , { orderBy : { endedAt : "desc" } } ) ;
71
+ }
72
+
66
73
async update ( id : number , questionnaireMutationDto : QuestionnaireMutationDto ) {
67
74
const questionnaire = await this . questionnaireRepository . findOneOrFail ( id , {
68
75
populate : [ "entries" , "entries.carer" , "entries.entryLanguages.language" ] ,
69
76
} ) ;
70
77
questionnaire . assign ( questionnaireMutationDto ) ;
71
78
79
+ const prevQuestionnaire = await this . findLatestByParticipant ( questionnaire . participant ! . id ) ;
80
+ if ( prevQuestionnaire ?. id !== id ) {
81
+ this . validateStartDate ( questionnaire , prevQuestionnaire ) ;
82
+ }
83
+
72
84
await this . em . persist ( questionnaire ) . flush ( ) ;
73
85
74
86
return questionnaire . toObject ( ) ;
@@ -77,4 +89,10 @@ export class QuestionnairesService {
77
89
remove ( id : number ) {
78
90
return this . em . remove ( this . questionnaireRepository . getReference ( id ) ) . flush ( ) ;
79
91
}
92
+
93
+ private validateStartDate ( questionnaire : Questionnaire , prevQuestionnaire : Questionnaire | null ) {
94
+ if ( prevQuestionnaire && ! isSameDay ( addDays ( prevQuestionnaire . endedAt ! , 1 ) , questionnaire . startedAt ! ) ) {
95
+ throw new UnprocessableEntityException ( "Start of the new questionnaire must match with the end of the previous" ) ;
96
+ }
97
+ }
80
98
}
0 commit comments