@@ -4,27 +4,21 @@ import {
4
4
run ,
5
5
validate
6
6
} from './jobs' ;
7
- import {
8
- dateMarketCloses ,
9
- dateMarketOpens ,
10
- getMarketHours ,
11
- MarketHours ,
12
- tradier
13
- } from './tradier' ;
14
7
import { Job } from '@prmichaelsen/hb-common' ;
15
8
import { database } from 'firebase-admin' ;
16
9
import * as _ from 'lodash' ;
10
+ import * as moment from 'moment' ;
17
11
import { isNullOrUndefined } from 'util' ;
18
- import {
19
- CronJob ,
20
- } from 'cron' ;
21
12
import {
22
13
sanitize ,
23
14
DeepImmutableObject ,
24
15
time as _time ,
25
16
ITimeString ,
26
17
} from '@prmichaelsen/ts-utils' ;
27
- import moment = require( 'moment' ) ;
18
+
19
+
20
+ /** initialize the node-cron jobs */
21
+ require ( './cron' ) ;
28
22
29
23
const time = {
30
24
..._time ,
@@ -33,121 +27,36 @@ const time = {
33
27
}
34
28
}
35
29
36
- // As an admin, the app has access to read and write all data, regardless of Security Rules
37
- var db = firebase . database ( ) ;
30
+ /** db reference for firebase connection */
31
+ const db = firebase . database ( ) ;
38
32
db . ref ( 'meta/' ) . once ( 'value' ) . then ( function ( snapshot : any ) {
39
33
console . log ( 'meta' , snapshot . val ( ) ) ;
40
34
} ) ;
41
35
db . ref ( 'meta/dateServerLastStarted' ) . set ( time . now ( ) . toString ( ) ) ;
42
36
43
- db . ref ( 'jobs' ) . on ( 'child_added' , receive ) ;
44
-
45
- /**
46
- * runs every month at midnight NYSE time
47
- * to update the database with market hours
48
- * for this month and next
49
- */
50
- const onUpdateMonthlyMarketHours = async ( ) => {
51
- const thisMonth = moment ( ) ;
52
- const nextMonth = moment ( ) . add ( { month : 1 } ) ;
53
- const marketHours : MarketHours [ ] = [
54
- ...getMarketHours ( await tradier . calendar ( {
55
- month : String ( thisMonth . month ( ) + 1 ) ,
56
- year : String ( thisMonth . year ( ) ) ,
57
- } ) ) ,
58
- ...getMarketHours ( await tradier . calendar ( {
59
- month : String ( nextMonth . month ( ) + 1 ) ,
60
- year : String ( nextMonth . year ( ) ) ,
61
- } ) ) ,
62
- ] ;
63
- await db . ref ( 'market/meta/marketHours' ) . set ( marketHours ) ;
64
- }
65
- new CronJob ( {
66
- // at 00:00:00 on day-of-month 1
67
- cronTime : '0 0 0 1 * *' ,
68
- timeZone : 'America/New_York' ,
69
- start : true ,
70
- onTick : onUpdateMonthlyMarketHours ,
71
- } ) ;
72
-
73
- /**
74
- * runs every day at midnight NYSE time
75
- * to update the database with market hours
76
- * for today
77
- */
78
- const onUpdateTodaysMarketHours = async ( ) => {
79
- const marketHours : MarketHours [ ] = (
80
- await db . ref ( 'market/meta/marketHours' ) . once ( 'value' )
81
- ) . val ( ) || [ ] ;
82
- await db . ref ( 'market/meta' ) . update ( sanitize ( {
83
- dateMarketCloses : dateMarketCloses ( marketHours ) ,
84
- dateMarketOpens : dateMarketOpens ( marketHours ) ,
85
- } ) ) ;
86
- } ;
87
- new CronJob ( {
88
- // at 00:00:00
89
- cronTime : '0 0 0 * * *' ,
90
- timeZone : 'America/New_York' ,
91
- start : true ,
92
- onTick : onUpdateTodaysMarketHours ,
93
- } ) ;
94
-
95
37
/**
96
- * runs every second in order to update
97
- * the database with whether or not
98
- * the market is currently open.
38
+ * handle newly created jobs by setting some metadata
99
39
*/
100
- const onUpdateMarketIsOpen = async ( ) => {
101
- const now = moment ( ) ;
102
- const dateMarketCloses = moment ( (
103
- await db . ref ( 'market/meta/dateMarketCloses' ) . once ( 'value' )
104
- ) . val ( ) ) ;
105
- const dateMarketOpens = moment ( (
106
- await db . ref ( 'market/meta/dateMarketOpens' ) . once ( 'value' )
107
- ) . val ( ) ) ;
108
- if ( ! dateMarketCloses . isValid ( ) || ! dateMarketOpens . isValid ( ) ) {
109
- return ;
110
- }
111
- const isOpen = now . isAfter ( dateMarketOpens ) && now . isBefore ( dateMarketCloses ) ;
112
- await db . ref ( 'market/meta/isOpen' ) . set ( isOpen ) ;
113
- } ;
114
- new CronJob ( {
115
- // every second
116
- cronTime : '0/1 0 0 * * *' ,
117
- timeZone : 'America/New_York' ,
118
- start : true ,
119
- onTick : onUpdateMarketIsOpen ,
120
- } ) ;
121
-
122
- // fire off jobs, in case they have
123
- // never been run before
124
- ( async function seedJobs ( ) {
125
- await onUpdateMonthlyMarketHours ( ) ;
126
- await onUpdateTodaysMarketHours ( ) ;
127
- await onUpdateMarketIsOpen ( ) ;
128
- } ) ( ) ;
129
-
130
- async function receive ( snapshot : database . DataSnapshot ) {
40
+ db . ref ( 'jobs' ) . on ( 'child_added' , async snapshot => {
131
41
const job : Job . Job = snapshot . val ( ) ;
132
42
if ( job . status !== 'Sent' )
133
43
return ;
134
44
const id = snapshot . key ;
135
45
const uri = [ 'jobs' , id ] . join ( '/' ) ;
136
- const data = _ . cloneDeep < Job . Job > ( job ) ;
137
46
const result : Job . Job = {
138
- ...data ,
47
+ ...job ,
139
48
lifecycle : { step : 'init' } ,
140
49
status : 'Received' ,
141
50
dateReceived : time . now ( ) . toString ( ) ,
142
51
id,
143
52
}
144
53
return await db . ref ( uri ) . set ( sanitize ( result ) ) ;
145
- }
54
+ } ) ;
146
55
56
+ /** fires any time a job has been updated in any way */
147
57
db . ref ( 'jobs' ) . on ( 'child_changed' , async snapshot => {
148
58
const job : DeepImmutableObject < Job . Job > = snapshot . val ( ) ;
149
59
const key = snapshot . key ;
150
- const id = job . id ;
151
60
const uri = [ 'jobs' , key ] . join ( '/' ) ;
152
61
const data = _ . cloneDeep < Job . Job > ( job ) ;
153
62
switch ( job . status ) {
0 commit comments