@@ -2,16 +2,19 @@ const { ensureSignedIn } = require('@orbiting/backend-modules-auth')
22const {
33 findById,
44 ensureReadyToSubmit,
5- transformQuestion
5+ transformQuestion,
6+ updateResultIncrementally
67} = require ( '../../../lib/Questionnaire' )
78const {
89 validateAnswer
910} = require ( '../../../lib/Question' )
1011
11- module . exports = async ( _ , { answer : { id , questionId , payload } } , context ) => {
12+ module . exports = async ( _ , { answer } , context ) => {
1213 const { pgdb, user : me , t, req } = context
1314 ensureSignedIn ( req , t )
1415
16+ const { id, questionId, payload } = answer
17+
1518 const transaction = await pgdb . transactionBegin ( )
1619 try {
1720 const now = new Date ( )
@@ -21,7 +24,7 @@ module.exports = async (_, { answer: { id, questionId, payload } }, context) =>
2124 }
2225
2326 const questionnaire = await findById ( question . questionnaireId , transaction )
24- await ensureReadyToSubmit ( questionnaire , me . id , now , transaction , t )
27+ await ensureReadyToSubmit ( questionnaire , me . id , now , { ... context , pgdb : transaction } )
2528
2629 // check client generated ID
2730 const existingAnswer = await transaction . public . answers . findOne ( { id } )
@@ -38,6 +41,12 @@ module.exports = async (_, { answer: { id, questionId, payload } }, context) =>
3841 userId : me . id ,
3942 questionId
4043 } )
44+ if (
45+ ( existingAnswer && existingAnswer . submitted ) ||
46+ ( sameAnswer && sameAnswer . submitted )
47+ ) {
48+ throw new Error ( t ( 'api/questionnaire/answer/immutable' ) )
49+ }
4150 if ( sameAnswer ) {
4251 await transaction . public . answers . deleteOne ( { id : sameAnswer . id } )
4352 }
@@ -63,6 +72,19 @@ module.exports = async (_, { answer: { id, questionId, payload } }, context) =>
6372 )
6473 }
6574
75+ if ( emptyAnswer && questionnaire . noEmptyAnswers ) {
76+ throw new Error ( t ( 'api/questionnaire/answer/empty' ) )
77+ }
78+
79+ if ( questionnaire . updateResultIncrementally ) {
80+ await updateResultIncrementally (
81+ questionnaire . id ,
82+ answer ,
83+ transaction ,
84+ context
85+ )
86+ }
87+
6688 // write
6789 const findQuery = { id }
6890 if ( emptyAnswer ) {
@@ -85,7 +107,8 @@ module.exports = async (_, { answer: { id, questionId, payload } }, context) =>
85107 questionId,
86108 questionnaireId : questionnaire . id ,
87109 userId : me . id ,
88- payload
110+ payload,
111+ submitted : questionnaire . submitAnswersImmediately
89112 } )
90113 }
91114 }
0 commit comments