@@ -3,13 +3,12 @@ import * as E from 'fp-ts/Either';
33import * as O from 'fp-ts/Option' ;
44import { DomainEvent } from '../../types' ;
55import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3' ;
6- import { EpochTimestampMilliseconds , MinimalEquipment } from './return-types' ;
6+ import { EpochTimestampMilliseconds } from './return-types' ;
77
88import { constructEvent , EventOfType } from '../../types/domain-event' ;
99import { GoogleHelpers } from '../../init-dependencies/google/pull_sheet_data' ;
1010
1111import { getAllEquipmentMinimal } from './equipment/get' ;
12- import { expandLastQuizResult } from './equipment/expand' ;
1312import { Dependencies } from '../../dependencies' ;
1413import {
1514 extractGoogleSheetMetadata ,
@@ -22,18 +21,17 @@ import {
2221 shouldPullFromSheet ,
2322} from '../../training-sheets/google' ;
2423import { getChunkIndexes } from '../../util' ;
24+ import { UUID } from 'io-ts-types' ;
25+ import { expandLastQuizResult } from './equipment/expand' ;
2526
2627const ROW_BATCH_SIZE = 200 ;
2728
28- export type EquipmentWithLastQuizResult = MinimalEquipment & {
29- lastQuizResult : O . Option < EpochTimestampMilliseconds > ;
30- } ;
31-
3229const pullNewEquipmentQuizResultsForSheet = async (
3330 logger : Logger ,
3431 googleHelpers : GoogleHelpers ,
35- equipment : EquipmentWithLastQuizResult ,
32+ equipmentId : UUID ,
3633 trainingSheetId : string ,
34+ eventsFromExclusive : O . Option < EpochTimestampMilliseconds > ,
3735 sheet : GoogleSheetMetadata ,
3836 timezone : string ,
3937 updateState : ( event : EventOfType < 'EquipmentTrainingQuizResult' > ) => void
@@ -71,10 +69,10 @@ const pullNewEquipmentQuizResultsForSheet = async (
7169 const result = extractGoogleSheetData (
7270 logger ,
7371 trainingSheetId ,
74- equipment . id ,
72+ equipmentId ,
7573 sheet ,
7674 timezone ,
77- equipment . lastQuizResult
75+ eventsFromExclusive
7876 ) ( data . right ) ;
7977 logger . info (
8078 'Google sheet data extracted, updating data with the extracted data...'
@@ -89,28 +87,16 @@ const pullNewEquipmentQuizResultsForSheet = async (
8987export const pullNewEquipmentQuizResults = async (
9088 logger : Logger ,
9189 googleHelpers : GoogleHelpers ,
92- equipment : EquipmentWithLastQuizResult ,
90+ equipmentId : UUID ,
91+ trainingSheetId : string ,
92+ eventsSinceExclusive : O . Option < EpochTimestampMilliseconds > ,
9393 updateState : (
9494 event :
9595 | EventOfType < 'EquipmentTrainingQuizSync' >
9696 | EventOfType < 'EquipmentTrainingQuizResult' >
9797 ) => void
9898) : Promise < void > => {
99- // TODO - Refactor this into fp-ts style.
100- if ( O . isNone ( equipment . trainingSheetId ) ) {
101- logger . warn (
102- 'No training sheet registered for equipment %s, skipping training data ingestion' ,
103- equipment . name
104- ) ;
105- // eslint-disable-next-line @typescript-eslint/require-await
106- return ;
107- }
108- const trainingSheetId = equipment . trainingSheetId . value ;
109- logger = logger . child ( { trainingSheetId} ) ;
110- logger . info (
111- 'Scanning training sheet. Pulling google sheet data from %s...' ,
112- equipment . lastQuizResult
113- ) ;
99+ logger . info ( 'Scanning training sheet. Pulling google sheet data...' ) ;
114100
115101 const initialMeta = await googleHelpers . pullGoogleSheetDataMetadata (
116102 logger ,
@@ -167,8 +153,9 @@ export const pullNewEquipmentQuizResults = async (
167153 await pullNewEquipmentQuizResultsForSheet (
168154 logger ,
169155 googleHelpers ,
170- equipment ,
156+ equipmentId ,
171157 trainingSheetId ,
158+ eventsSinceExclusive ,
172159 sheet ,
173160 initialMeta . right . properties . timeZone ,
174161 updateState
@@ -181,7 +168,7 @@ export const pullNewEquipmentQuizResults = async (
181168
182169 updateState (
183170 constructEvent ( 'EquipmentTrainingQuizSync' ) ( {
184- equipmentId : equipment . id ,
171+ equipmentId,
185172 } )
186173 ) ;
187174} ;
@@ -191,8 +178,8 @@ export const asyncApplyExternalEventSources = (
191178 currentState : BetterSQLite3Database ,
192179 googleHelpers : O . Option < GoogleHelpers > ,
193180 updateState : ( event : DomainEvent ) => void ,
194- googleRateLimitMs : number ,
195- _cacheSheetData : Dependencies [ 'cacheSheetData' ]
181+ googleRefreshIntervalMs : number ,
182+ cacheSheetData : Dependencies [ 'cacheSheetData' ]
196183) => {
197184 return ( ) => async ( ) => {
198185 logger . info ( 'Applying external event sources...' ) ;
@@ -201,54 +188,56 @@ export const asyncApplyExternalEventSources = (
201188 return ;
202189 }
203190 for ( const equipment of getAllEquipmentMinimal ( currentState ) ) {
191+ const equipmentLogger = logger . child ( { equipment} ) ;
204192 if (
205- O . isSome ( equipment . trainingSheetId ) &&
206- ( O . isNone ( equipment . lastQuizSync ) ||
207- ( Date . now ( ) as EpochTimestampMilliseconds ) -
208- equipment . lastQuizSync . value >
209- googleRateLimitMs )
193+ O . isNone ( equipment . trainingSheetId ) ||
194+ ( O . isSome ( equipment . lastQuizSync ) &&
195+ Date . now ( ) - equipment . lastQuizSync . value < googleRefreshIntervalMs )
210196 ) {
211- logger . info (
212- 'Triggering event update from google training sheets for %s...' ,
213- equipment . name
214- ) ;
215- const events : (
197+ equipmentLogger . info ( 'No google training sheet refresh required' ) ;
198+ continue ;
199+ }
200+
201+ equipmentLogger . info (
202+ 'Triggering event update from google training sheets...'
203+ ) ;
204+
205+ const events : (
206+ | EventOfType < 'EquipmentTrainingQuizSync' >
207+ | EventOfType < 'EquipmentTrainingQuizResult' >
208+ ) [ ] = [ ] ;
209+ const collectEvents = (
210+ event :
216211 | EventOfType < 'EquipmentTrainingQuizSync' >
217212 | EventOfType < 'EquipmentTrainingQuizResult' >
218- ) [ ] = [ ] ;
219- const collectEvents = (
220- event :
221- | EventOfType < 'EquipmentTrainingQuizSync' >
222- | EventOfType < 'EquipmentTrainingQuizResult' >
223- ) => {
224- events . push ( event ) ;
225- updateState ( event ) ;
226- } ;
227-
228- await pullNewEquipmentQuizResults (
229- logger ,
230- googleHelpers . value ,
231- expandLastQuizResult ( currentState ) ( equipment ) ,
232- collectEvents
233- ) ;
234- logger . info (
235- 'Finished pulling %s events from google training sheet for %s, caching...' ,
236- events . length ,
237- equipment . name
213+ ) => {
214+ events . push ( event ) ;
215+ updateState ( event ) ;
216+ } ;
217+
218+ await pullNewEquipmentQuizResults (
219+ equipmentLogger ,
220+ googleHelpers . value ,
221+ equipment . id ,
222+ equipment . trainingSheetId . value ,
223+ expandLastQuizResult ( currentState ) ( equipment ) . lastQuizResult ,
224+ collectEvents
225+ ) ;
226+ equipmentLogger . info (
227+ 'Finished pulling %s events from google training sheet, caching...' ,
228+ events . length
229+ ) ;
230+ const x = await cacheSheetData (
231+ new Date ( ) ,
232+ equipment . trainingSheetId . value ,
233+ equipmentLogger ,
234+ events
235+ ) ( ) ;
236+ if ( E . isLeft ( x ) ) {
237+ equipmentLogger . error (
238+ 'Failed to cache training sheet data due to: %s' ,
239+ x . left . message
238240 ) ;
239- // const x = await cacheSheetData(
240- // new Date(),
241- // equipment.trainingSheetId.value,
242- // events
243- // )();
244- // if (E.isLeft(x)) {
245- // logger.error(
246- // 'Failed to cache training sheet data for %s training sheet id %s, due to: %s',
247- // equipment.name,
248- // equipment.trainingSheetId,
249- // x.left.message
250- // );
251- // }
252241 }
253242 }
254243 logger . info ( 'Finished applying external event sources' ) ;
0 commit comments