6
6
require_relative ( '../../test/lib/protocol/covidshield_pb' )
7
7
8
8
class Database
9
- Fetch = Struct . new ( :date , :hour )
9
+ Fetch = Struct . new ( :period )
10
10
11
11
def initialize
12
12
@fetches = [ ]
@@ -17,21 +17,13 @@ def drop_old_data
17
17
@fetches . reject! { |fetch | fetch . date < min_date }
18
18
end
19
19
20
- def has_all_hours? ( date )
21
- ( 0 .. 23 ) . all? { | hour | has_hour? ( date , hour ) }
20
+ def fetched? ( period )
21
+ @fetches . include? ( Fetch . new ( period ) )
22
22
end
23
23
24
- def has_hour? ( date , hour )
25
- @fetches . include? ( Fetch . new ( date , hour ) )
26
- end
27
-
28
- def mark_hours_fetched ( date )
29
- ( 0 ..23 ) . each { |hour | mark_hour_fetched ( date , hour ) }
30
- end
31
-
32
- def mark_hour_fetched ( date , hour )
33
- return if @fetches . include? ( Fetch . new ( date , hour ) )
34
- @fetches << Fetch . new ( date , hour )
24
+ def mark_fetched ( period )
25
+ return if @fetches . include? ( Fetch . new ( period ) )
26
+ @fetches << Fetch . new ( period )
35
27
end
36
28
37
29
private
@@ -89,15 +81,10 @@ def fetch_new_keys
89
81
90
82
@database . drop_old_data
91
83
92
- ( 1 ..14 ) . to_a . reverse . each do |days_ago | # [1, 14] => 14,13,...,2,1
93
- date = today_utc . prev_day ( days_ago )
94
- fetch_date ( date ) unless @database . has_all_hours? ( date )
95
- end
96
-
97
- # ... is exclusive range -- [0, hour)
98
- ( 0 ...current_hour_number_within_utc_day ) . each do |hour |
99
- date = today_utc
100
- fetch_hour ( date , hour ) unless @database . has_hour? ( date , hour )
84
+ curr = current_period
85
+ 168 . times do |n |
86
+ period = curr - ( 2 * ( n + 1 ) )
87
+ fetch_period ( period ) unless @database . fetched? ( period )
101
88
end
102
89
end
103
90
@@ -108,40 +95,25 @@ def fetch_exposure_config(region)
108
95
raise ( "failed" ) unless resp [ 'Content-Type' ] == 'application/json'
109
96
end
110
97
111
- def fetch_date ( date )
112
- puts "Fetching date : #{ date } "
113
- resp = Faraday . get ( date_url ( date ) )
98
+ def fetch_period ( period )
99
+ puts "Fetching period : #{ period } "
100
+ resp = Faraday . get ( period_url ( period ) )
114
101
raise ( "failed" ) unless resp . status == 200
115
- raise ( "failed" ) unless resp [ 'Content-Type' ] == 'application/x-protobuf; delimited=true '
102
+ raise ( "failed" ) unless resp [ 'Content-Type' ] == 'application/zip '
116
103
db_transaction do
117
- keys = parse_and_save_keys_from ( resp )
118
- puts ( "retrieved #{ keys . size } keys " )
119
- @database . mark_hours_fetched ( date )
104
+ keys = send_to_framework ( resp )
105
+ puts ( "retrieved pack " )
106
+ @database . mark_fetched ( period )
120
107
end
121
108
end
122
109
123
- def fetch_hour ( date , hour )
124
- puts "Fetching hour: #{ date } // #{ hour } "
125
- resp = Faraday . get ( hour_url ( date , hour ) )
126
- raise ( "failed" ) unless resp . status == 200
127
- raise ( "failed" ) unless resp [ 'Content-Type' ] == 'application/x-protobuf; delimited=true'
128
- db_transaction do
129
- keys = parse_and_save_keys_from ( resp )
130
- puts ( "retrieved #{ keys . size } keys" )
131
- @database . mark_hour_fetched ( date , hour )
132
- end
110
+ def current_period
111
+ ( Time . now . to_i / 3600 / 2 ) * 2
133
112
end
134
113
135
- BIG_ENDIAN_UINT32 = 'N'
136
-
137
- def parse_and_save_keys_from ( resp )
138
- buf = resp . body . each_byte . to_a
139
- files = [ ]
140
- until buf . empty?
141
- len = buf . shift ( 4 ) . map ( &:chr ) . join . unpack ( BIG_ENDIAN_UINT32 ) . first
142
- files << Covidshield ::File . decode ( buf . shift ( len ) . map ( &:chr ) . join )
143
- end
144
- files . flat_map ( &:key )
114
+ def send_to_framework ( resp )
115
+ # See retrieve_test.rb for a ruby example of how to load this format, but probably,
116
+ # you'll just be feeding the response body to the EN framework.
145
117
end
146
118
147
119
def db_transaction
@@ -152,23 +124,11 @@ def exposure_configuration_url(region)
152
124
"#{ KEY_RETRIEVAL_URL } /exposure-configuration/#{ region } .json"
153
125
end
154
126
155
- def date_url ( date )
156
- message = "#{ date . iso8601 } :#{ format ( "%02d" , hour_number ) } "
157
- key = [ ENV . fetch ( "RETRIEVE_HMAC_KEY" ) ] . pack ( "H*" )
158
- hmac = OpenSSL ::HMAC . hexdigest ( "SHA256" , key , message )
159
- "#{ KEY_RETRIEVAL_URL } /retrieve-day/#{ date . iso8601 } /#{ hmac } "
160
- end
161
-
162
- def hour_url ( date , hour )
163
- hour = format ( "%02d" , hour )
164
- message = "#{ date . iso8601 } :#{ hour } :#{ format ( "%02d" , hour_number ) } "
127
+ def period_url ( period )
128
+ message = "#{ period } :#{ hour_number } "
165
129
key = [ ENV . fetch ( "RETRIEVE_HMAC_KEY" ) ] . pack ( "H*" )
166
130
hmac = OpenSSL ::HMAC . hexdigest ( "SHA256" , key , message )
167
- "#{ KEY_RETRIEVAL_URL } /retrieve-hour/#{ date . iso8601 } /#{ hour } /#{ hmac } "
168
- end
169
-
170
- def current_hour_number_within_utc_day
171
- ( Time . now . to_i % 86400 ) / 3600
131
+ "#{ KEY_RETRIEVAL_URL } /retrieve/#{ period } /#{ hmac } "
172
132
end
173
133
174
134
def hour_number ( at = Time . now )
0 commit comments