11import * as O from 'fp-ts/Option' ;
22import * as TE from 'fp-ts/TaskEither' ;
33import * as RA from 'fp-ts/ReadonlyArray' ;
4- import * as RR from 'fp-ts/ReadonlyRecord' ;
54
65import { Dependencies } from '../../dependencies' ;
76import { SheetDataTable } from '../../sync-worker/google/sheet-data-table' ;
87import { pipe } from 'fp-ts/lib/function' ;
98import { Equipment , MemberCoreInfo } from '../shared-state/return-types' ;
109import { DateTime , Duration } from 'luxon' ;
11- import { ReadonlyRecord } from 'fp-ts/lib/ReadonlyRecord' ;
12- import { EquipmentId } from '../../types/equipment-id' ;
1310
1411export type EquipmentQuizResults = {
1512 passedQuizes : SheetDataTable [ 'rows' ] ;
@@ -30,23 +27,20 @@ export type MemberAwaitingTraining = Pick<
3027 waitingSince : Date ;
3128} ;
3229
33- const isPassed = ( row : SheetDataTable [ 'rows' ] [ 0 ] ) => row . percentage >= 100 ;
34- const isFailed = ( row : SheetDataTable [ 'rows' ] [ 0 ] ) => ! isPassed ( row ) ;
35-
3630const extractPassedQuizes = (
3731 sheetData : SheetDataTable [ 'rows' ]
3832) : SheetDataTable [ 'rows' ] =>
3933 pipe (
4034 sheetData ,
41- RA . filter ( isPassed )
35+ RA . filter ( row => row . percentage === 100 )
4236 ) ;
4337
4438const extractFailedQuizes = (
4539 sheetData : SheetDataTable [ 'rows' ]
4640) : SheetDataTable [ 'rows' ] =>
4741 pipe (
4842 sheetData ,
49- RA . filter ( isFailed )
43+ RA . filter ( row => row . percentage < 100 )
5044 ) ;
5145
5246const getQuizResults = (
@@ -76,18 +70,18 @@ const getQuizResults = (
7670 ) ;
7771} ;
7872
79- export type FullQuizResultsForEquipment = {
73+ export type FullQuizResults = {
8074 lastQuizSync : O . Option < Date > ;
8175 membersAwaitingTraining : ReadonlyArray < MemberAwaitingTraining > ;
8276 unknownMembersAwaitingTraining : ReadonlyArray < OrphanedPassedQuiz > ;
8377 failedQuizes : SheetDataTable [ 'rows' ] ;
8478} ;
8579
86- export const getFullQuizResultsForEquipment = (
80+ export const getFullQuizResults = (
8781 deps : Pick < Dependencies , 'sharedReadModel' | 'lastQuizSync' | 'getSheetData' > ,
8882 sheetId : string ,
8983 equipment : Equipment
90- ) : TE . TaskEither < string , FullQuizResultsForEquipment > =>
84+ ) : TE . TaskEither < string , FullQuizResults > =>
9185 pipe (
9286 getQuizResults ( deps , sheetId , equipment . trainedMembers ) ,
9387 TE . map ( qr => {
@@ -130,71 +124,3 @@ export const getFullQuizResultsForEquipment = (
130124 } ;
131125 } )
132126 ) ;
133-
134- export type FullQuizResultsForMember = {
135- equipmentQuizPassedAt : ReadonlyRecord < EquipmentId , ReadonlyArray < Date > > ,
136- equipmentQuizAttempted : ReadonlyRecord < EquipmentId , ReadonlyArray < {
137- response_submitted : Date ,
138- sheet_id : string ;
139- score : number ;
140- max_score : number ;
141- percentage : number ;
142- } > > ,
143- orphanedQuizAttempts : ReadonlyArray < {
144- response_submitted : Date ,
145- sheet_id : string ;
146- score : number ;
147- max_score : number ;
148- percentage : number ;
149- } > ,
150- } ;
151-
152- export const getFullQuizResultsForMember = (
153- deps : Pick < Dependencies , 'sharedReadModel' | 'getSheetDataByMemberNumber' > ,
154- memberNumber : number
155- ) : TE . TaskEither < string , FullQuizResultsForMember > => pipe (
156- deps . getSheetDataByMemberNumber ( memberNumber ) ,
157- TE . map (
158- qr => {
159- const equipmentQuizPassedAt : Record < EquipmentId , Date [ ] > = { } ;
160- const equipmentQuizAttempted : Record < EquipmentId , {
161- response_submitted : Date ,
162- sheet_id : string ;
163- score : number ;
164- max_score : number ;
165- percentage : number ;
166- } [ ] > = { } ;
167- const orphanedQuizAttempts : {
168- response_submitted : Date ,
169- sheet_id : string ;
170- score : number ;
171- max_score : number ;
172- percentage : number ;
173- } [ ] = [ ] ;
174- const trainingSheetMapping = deps . sharedReadModel . equipment . getTrainingSheetIdMapping ( ) ;
175- for ( const row of qr ) {
176- const equipmentId = RR . lookup ( row . sheet_id ) ( trainingSheetMapping ) ;
177- if ( O . isNone ( equipmentId ) ) {
178- orphanedQuizAttempts . push ( row ) ;
179- } else {
180- if ( isPassed ( row ) ) {
181- if ( ! equipmentQuizPassedAt [ equipmentId . value ] ) {
182- equipmentQuizPassedAt [ equipmentId . value ] = [ ] ;
183- }
184- equipmentQuizPassedAt [ equipmentId . value ] . push ( row . response_submitted ) ;
185- } else {
186- if ( ! equipmentQuizAttempted [ equipmentId . value ] ) {
187- equipmentQuizAttempted [ equipmentId . value ] = [ ] ;
188- }
189- equipmentQuizAttempted [ equipmentId . value ] . push ( row ) ;
190- }
191- }
192- }
193- return {
194- equipmentQuizPassedAt,
195- equipmentQuizAttempted,
196- orphanedQuizAttempts,
197- }
198- }
199- )
200- ) ;
0 commit comments