-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathflipcard.utils.ts
More file actions
60 lines (53 loc) · 1.89 KB
/
flipcard.utils.ts
File metadata and controls
60 lines (53 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import {
FlipCardStageConfig,
FlipCardStageParticipantAnswer,
FlipCardStagePublicData,
ParticipantProfileExtended,
} from '@deliberation-lab/utils';
import * as admin from 'firebase-admin';
import {app} from '../app';
/** Update FlipCard stage public data. */
export async function addParticipantAnswerToFlipCardStagePublicData(
experimentId: string,
stage: FlipCardStageConfig,
participant: ParticipantProfileExtended,
answer: FlipCardStageParticipantAnswer,
) {
// Run document write as transaction to ensure consistency
await app.firestore().runTransaction(async (transaction) => {
const publicDocument = app
.firestore()
.collection('experiments')
.doc(experimentId)
.collection('cohorts')
.doc(participant.currentCohortId)
.collection('publicStageData')
.doc(stage.id);
// Read current public data first (all reads must come before writes)
const publicDoc = await transaction.get(publicDocument);
const publicData = publicDoc.data() as FlipCardStagePublicData | undefined;
if (!publicData) {
console.warn(
`Public stage data not found for stage ${stage.id} in cohort ${participant.currentCohortId}. This should have been initialized on cohort creation.`,
);
return;
}
const currentPublicData = publicData;
// Update public data with participant's flip history and selections
const updatedPublicData: FlipCardStagePublicData = {
...currentPublicData,
participantFlipHistory: {
...currentPublicData.participantFlipHistory,
[participant.publicId]: answer.flipHistory,
},
participantSelections: {
...currentPublicData.participantSelections,
[participant.publicId]: answer.selectedCardIds,
},
};
transaction.set(publicDocument, {
...updatedPublicData,
timestamp: admin.firestore.FieldValue.serverTimestamp(),
});
});
}