Skip to content

Commit 73cb386

Browse files
committed
summary stats rewrite
1 parent b0781c6 commit 73cb386

File tree

389 files changed

+5991
-85391
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

389 files changed

+5991
-85391
lines changed

data/client/client.go

+18-32
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,14 @@ type Client interface {
3434

3535
DestroyDataForUserByID(ctx context.Context, userID string) error
3636

37-
GetCGMSummary(ctx context.Context, id string) (*types.Summary[*types.CGMStats, types.CGMStats], error)
38-
GetBGMSummary(ctx context.Context, id string) (*types.Summary[*types.BGMStats, types.BGMStats], error)
39-
GetContinuousSummary(ctx context.Context, id string) (*types.Summary[*types.ContinuousStats, types.ContinuousStats], error)
40-
UpdateCGMSummary(ctx context.Context, id string) (*types.Summary[*types.CGMStats, types.CGMStats], error)
41-
UpdateBGMSummary(ctx context.Context, id string) (*types.Summary[*types.BGMStats, types.BGMStats], error)
42-
UpdateContinuousSummary(ctx context.Context, id string) (*types.Summary[*types.ContinuousStats, types.ContinuousStats], error)
37+
GetCGMSummary(ctx context.Context, id string) (*types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket], error)
38+
GetBGMSummary(ctx context.Context, id string) (*types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket], error)
39+
GetContinuousSummary(ctx context.Context, id string) (*types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket], error)
40+
UpdateCGMSummary(ctx context.Context, id string) (*types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket], error)
41+
UpdateBGMSummary(ctx context.Context, id string) (*types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket], error)
42+
UpdateContinuousSummary(ctx context.Context, id string) (*types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket], error)
4343
GetOutdatedUserIDs(ctx context.Context, t string, pagination *page.Pagination) (*types.OutdatedSummariesResponse, error)
4444
GetMigratableUserIDs(ctx context.Context, t string, pagination *page.Pagination) ([]string, error)
45-
BackfillSummaries(ctx context.Context, t string) (int, error)
4645
}
4746

4847
type ClientImpl struct {
@@ -132,7 +131,7 @@ func (c *ClientImpl) GetDataSet(ctx context.Context, id string) (*data.DataSet,
132131
return dataSet, nil
133132
}
134133

135-
func (c *ClientImpl) GetCGMSummary(ctx context.Context, userId string) (*types.Summary[*types.CGMStats, types.CGMStats], error) {
134+
func (c *ClientImpl) GetCGMSummary(ctx context.Context, userId string) (*types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket], error) {
136135
if ctx == nil {
137136
return nil, errors.New("context is missing")
138137
}
@@ -141,7 +140,7 @@ func (c *ClientImpl) GetCGMSummary(ctx context.Context, userId string) (*types.S
141140
}
142141

143142
url := c.client.ConstructURL("v1", "summaries", "cgm", userId)
144-
summary := &types.Summary[*types.CGMStats, types.CGMStats]{}
143+
summary := &types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket]{}
145144
if err := c.client.RequestData(ctx, http.MethodGet, url, nil, nil, summary); err != nil {
146145
if request.IsErrorResourceNotFound(err) {
147146
return nil, nil
@@ -152,7 +151,7 @@ func (c *ClientImpl) GetCGMSummary(ctx context.Context, userId string) (*types.S
152151
return summary, nil
153152
}
154153

155-
func (c *ClientImpl) GetBGMSummary(ctx context.Context, userId string) (*types.Summary[*types.BGMStats, types.BGMStats], error) {
154+
func (c *ClientImpl) GetBGMSummary(ctx context.Context, userId string) (*types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket], error) {
156155
if ctx == nil {
157156
return nil, errors.New("context is missing")
158157
}
@@ -161,7 +160,7 @@ func (c *ClientImpl) GetBGMSummary(ctx context.Context, userId string) (*types.S
161160
}
162161

163162
url := c.client.ConstructURL("v1", "summaries", "bgm", userId)
164-
summary := &types.Summary[*types.BGMStats, types.BGMStats]{}
163+
summary := &types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket]{}
165164
if err := c.client.RequestData(ctx, http.MethodGet, url, nil, nil, summary); err != nil {
166165
if request.IsErrorResourceNotFound(err) {
167166
return nil, nil
@@ -172,7 +171,7 @@ func (c *ClientImpl) GetBGMSummary(ctx context.Context, userId string) (*types.S
172171
return summary, nil
173172
}
174173

175-
func (c *ClientImpl) GetContinuousSummary(ctx context.Context, userId string) (*types.Summary[*types.ContinuousStats, types.ContinuousStats], error) {
174+
func (c *ClientImpl) GetContinuousSummary(ctx context.Context, userId string) (*types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket], error) {
176175
if ctx == nil {
177176
return nil, errors.New("context is missing")
178177
}
@@ -181,7 +180,7 @@ func (c *ClientImpl) GetContinuousSummary(ctx context.Context, userId string) (*
181180
}
182181

183182
url := c.client.ConstructURL("v1", "summaries", "continuous", userId)
184-
summary := &types.Summary[*types.ContinuousStats, types.ContinuousStats]{}
183+
summary := &types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket]{}
185184
if err := c.client.RequestData(ctx, http.MethodGet, url, nil, nil, summary); err != nil {
186185
if request.IsErrorResourceNotFound(err) {
187186
return nil, nil
@@ -192,7 +191,7 @@ func (c *ClientImpl) GetContinuousSummary(ctx context.Context, userId string) (*
192191
return summary, nil
193192
}
194193

195-
func (c *ClientImpl) UpdateCGMSummary(ctx context.Context, userId string) (*types.Summary[*types.CGMStats, types.CGMStats], error) {
194+
func (c *ClientImpl) UpdateCGMSummary(ctx context.Context, userId string) (*types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket], error) {
196195
if ctx == nil {
197196
return nil, errors.New("context is missing")
198197
}
@@ -201,7 +200,7 @@ func (c *ClientImpl) UpdateCGMSummary(ctx context.Context, userId string) (*type
201200
}
202201

203202
url := c.client.ConstructURL("v1", "summaries", "cgm", userId)
204-
summary := &types.Summary[*types.CGMStats, types.CGMStats]{}
203+
summary := &types.Summary[*types.CGMStats, *types.GlucoseBucket, types.CGMStats, types.GlucoseBucket]{}
205204
if err := c.client.RequestData(ctx, http.MethodPost, url, nil, nil, summary); err != nil {
206205
if request.IsErrorResourceNotFound(err) {
207206
return nil, nil
@@ -212,7 +211,7 @@ func (c *ClientImpl) UpdateCGMSummary(ctx context.Context, userId string) (*type
212211
return summary, nil
213212
}
214213

215-
func (c *ClientImpl) UpdateBGMSummary(ctx context.Context, userId string) (*types.Summary[*types.BGMStats, types.BGMStats], error) {
214+
func (c *ClientImpl) UpdateBGMSummary(ctx context.Context, userId string) (*types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket], error) {
216215
if ctx == nil {
217216
return nil, errors.New("context is missing")
218217
}
@@ -221,7 +220,7 @@ func (c *ClientImpl) UpdateBGMSummary(ctx context.Context, userId string) (*type
221220
}
222221

223222
url := c.client.ConstructURL("v1", "summaries", "bgm", userId)
224-
summary := &types.Summary[*types.BGMStats, types.BGMStats]{}
223+
summary := &types.Summary[*types.BGMStats, *types.GlucoseBucket, types.BGMStats, types.GlucoseBucket]{}
225224
if err := c.client.RequestData(ctx, http.MethodPost, url, nil, nil, summary); err != nil {
226225
if request.IsErrorResourceNotFound(err) {
227226
return nil, nil
@@ -232,7 +231,7 @@ func (c *ClientImpl) UpdateBGMSummary(ctx context.Context, userId string) (*type
232231
return summary, nil
233232
}
234233

235-
func (c *ClientImpl) UpdateContinuousSummary(ctx context.Context, userId string) (*types.Summary[*types.ContinuousStats, types.ContinuousStats], error) {
234+
func (c *ClientImpl) UpdateContinuousSummary(ctx context.Context, userId string) (*types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket], error) {
236235
if ctx == nil {
237236
return nil, errors.New("context is missing")
238237
}
@@ -241,7 +240,7 @@ func (c *ClientImpl) UpdateContinuousSummary(ctx context.Context, userId string)
241240
}
242241

243242
url := c.client.ConstructURL("v1", "summaries", "continuous", userId)
244-
summary := &types.Summary[*types.ContinuousStats, types.ContinuousStats]{}
243+
summary := &types.Summary[*types.ContinuousStats, *types.ContinuousBucket, types.ContinuousStats, types.ContinuousBucket]{}
245244
if err := c.client.RequestData(ctx, http.MethodPost, url, nil, nil, summary); err != nil {
246245
if request.IsErrorResourceNotFound(err) {
247246
return nil, nil
@@ -252,19 +251,6 @@ func (c *ClientImpl) UpdateContinuousSummary(ctx context.Context, userId string)
252251
return summary, nil
253252
}
254253

255-
func (c *ClientImpl) BackfillSummaries(ctx context.Context, typ string) (int, error) {
256-
var count int
257-
url := c.client.ConstructURL("v1", "summaries", "backfill", typ)
258-
259-
ctxWithTimeout, cancel := context.WithTimeout(ctx, ExtendedTimeout)
260-
defer cancel()
261-
if err := c.client.RequestData(ctxWithTimeout, http.MethodPost, url, nil, nil, &count); err != nil {
262-
return count, errors.Wrap(err, "backfill request returned an error")
263-
}
264-
265-
return count, nil
266-
}
267-
268254
func (c *ClientImpl) GetOutdatedUserIDs(ctx context.Context, typ string, pagination *page.Pagination) (*types.OutdatedSummariesResponse, error) {
269255
if ctx == nil {
270256
return nil, errors.New("context is missing")

data/service/api/v1/summary.go

+21-47
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,21 @@ import (
2121

2222
func SummaryRoutes() []dataService.Route {
2323
return []dataService.Route{
24-
dataService.Get("/v1/summaries/cgm/:userId", GetSummary[types.CGMStats, *types.CGMStats], api.RequireAuth),
25-
dataService.Get("/v1/summaries/bgm/:userId", GetSummary[types.BGMStats, *types.BGMStats], api.RequireAuth),
26-
dataService.Get("/v1/summaries/continuous/:userId", GetSummary[types.ContinuousStats, *types.ContinuousStats], api.RequireAuth),
24+
dataService.Get("/v1/summaries/cgm/:userId", GetSummary[*types.CGMStats, *types.GlucoseBucket], api.RequireAuth),
25+
dataService.Get("/v1/summaries/bgm/:userId", GetSummary[*types.BGMStats, *types.GlucoseBucket], api.RequireAuth),
26+
dataService.Get("/v1/summaries/continuous/:userId", GetSummary[*types.ContinuousStats, *types.ContinuousBucket], api.RequireAuth),
2727

28-
dataService.Post("/v1/summaries/cgm/:userId", UpdateSummary[types.CGMStats, *types.CGMStats], api.RequireAuth),
29-
dataService.Post("/v1/summaries/bgm/:userId", UpdateSummary[types.BGMStats, *types.BGMStats], api.RequireAuth),
30-
dataService.Post("/v1/summaries/continuous/:userId", UpdateSummary[types.ContinuousStats, *types.ContinuousStats], api.RequireAuth),
28+
dataService.Post("/v1/summaries/cgm/:userId", UpdateSummary[*types.CGMStats, *types.GlucoseBucket], api.RequireAuth),
29+
dataService.Post("/v1/summaries/bgm/:userId", UpdateSummary[*types.BGMStats, *types.GlucoseBucket], api.RequireAuth),
30+
dataService.Post("/v1/summaries/continuous/:userId", UpdateSummary[*types.ContinuousStats, *types.ContinuousBucket], api.RequireAuth),
3131

32-
dataService.Post("/v1/summaries/backfill/cgm", BackfillSummaries[types.CGMStats, *types.CGMStats], api.RequireAuth),
33-
dataService.Post("/v1/summaries/backfill/bgm", BackfillSummaries[types.BGMStats, *types.BGMStats], api.RequireAuth),
34-
dataService.Post("/v1/summaries/backfill/continuous", BackfillSummaries[types.ContinuousStats, *types.ContinuousStats], api.RequireAuth),
32+
dataService.Get("/v1/summaries/outdated/cgm", GetOutdatedUserIDs[*types.CGMStats, *types.GlucoseBucket], api.RequireAuth),
33+
dataService.Get("/v1/summaries/outdated/bgm", GetOutdatedUserIDs[*types.BGMStats, *types.GlucoseBucket], api.RequireAuth),
34+
dataService.Get("/v1/summaries/outdated/continuous", GetOutdatedUserIDs[*types.ContinuousStats, *types.ContinuousBucket], api.RequireAuth),
3535

36-
dataService.Get("/v1/summaries/outdated/cgm", GetOutdatedUserIDs[types.CGMStats, *types.CGMStats], api.RequireAuth),
37-
dataService.Get("/v1/summaries/outdated/bgm", GetOutdatedUserIDs[types.BGMStats, *types.BGMStats], api.RequireAuth),
38-
dataService.Get("/v1/summaries/outdated/continuous", GetOutdatedUserIDs[types.ContinuousStats, *types.ContinuousStats], api.RequireAuth),
39-
40-
dataService.Get("/v1/summaries/migratable/cgm", GetMigratableUserIDs[types.CGMStats, *types.CGMStats], api.RequireAuth),
41-
dataService.Get("/v1/summaries/migratable/bgm", GetMigratableUserIDs[types.BGMStats, *types.BGMStats], api.RequireAuth),
42-
dataService.Get("/v1/summaries/migratable/continuous", GetMigratableUserIDs[types.ContinuousStats, *types.ContinuousStats], api.RequireAuth),
36+
dataService.Get("/v1/summaries/migratable/cgm", GetMigratableUserIDs[*types.CGMStats, *types.GlucoseBucket], api.RequireAuth),
37+
dataService.Get("/v1/summaries/migratable/bgm", GetMigratableUserIDs[*types.BGMStats, *types.GlucoseBucket], api.RequireAuth),
38+
dataService.Get("/v1/summaries/migratable/continuous", GetMigratableUserIDs[*types.ContinuousStats, *types.ContinuousBucket], api.RequireAuth),
4339

4440
dataService.Get("/v1/clinics/:clinicId/reports/realtime", GetPatientsWithRealtimeData, api.RequireAuth),
4541
}
@@ -66,7 +62,7 @@ func CheckPermissions(ctx context.Context, dataServiceContext dataService.Contex
6662
return true
6763
}
6864

69-
func GetSummary[T types.Stats, A types.StatsPt[T]](dataServiceContext dataService.Context) {
65+
func GetSummary[A types.StatsPt[T, P, B], P types.BucketDataPt[B], T types.Stats, B types.BucketData](dataServiceContext dataService.Context) {
7066
ctx := dataServiceContext.Request().Context()
7167
res := dataServiceContext.Response()
7268
req := dataServiceContext.Request()
@@ -79,12 +75,12 @@ func GetSummary[T types.Stats, A types.StatsPt[T]](dataServiceContext dataServic
7975
return
8076
}
8177

82-
summarizer := summary.GetSummarizer[A](dataServiceContext.SummarizerRegistry())
78+
summarizer := summary.GetSummarizer[A, P](dataServiceContext.SummarizerRegistry())
8379
userSummary, err := summarizer.GetSummary(ctx, id)
8480
if err != nil {
8581
responder.Error(http.StatusInternalServerError, err)
8682
} else if userSummary == nil {
87-
responder.Error(http.StatusNotFound, fmt.Errorf("no %s summary found for user %s", types.GetTypeString[A](), id))
83+
responder.Error(http.StatusNotFound, fmt.Errorf("no %s summary found for user %s", types.GetTypeString[A, P](), id))
8884
} else {
8985
responder.Data(http.StatusOK, userSummary)
9086
}
@@ -133,7 +129,7 @@ func GetPatientsWithRealtimeData(dataServiceContext dataService.Context) {
133129
responder.Data(http.StatusOK, response)
134130
}
135131

136-
func UpdateSummary[T types.Stats, A types.StatsPt[T]](dataServiceContext dataService.Context) {
132+
func UpdateSummary[A types.StatsPt[T, P, B], P types.BucketDataPt[B], T types.Stats, B types.BucketData](dataServiceContext dataService.Context) {
137133
ctx := dataServiceContext.Request().Context()
138134
res := dataServiceContext.Response()
139135
req := dataServiceContext.Request()
@@ -146,7 +142,7 @@ func UpdateSummary[T types.Stats, A types.StatsPt[T]](dataServiceContext dataSer
146142
return
147143
}
148144

149-
summarizer := summary.GetSummarizer[A](dataServiceContext.SummarizerRegistry())
145+
summarizer := summary.GetSummarizer[A, P](dataServiceContext.SummarizerRegistry())
150146
userSummary, err := summarizer.UpdateSummary(ctx, id)
151147
if err != nil {
152148
responder.Error(http.StatusInternalServerError, err)
@@ -155,29 +151,7 @@ func UpdateSummary[T types.Stats, A types.StatsPt[T]](dataServiceContext dataSer
155151
}
156152
}
157153

158-
func BackfillSummaries[T types.Stats, A types.StatsPt[T]](dataServiceContext dataService.Context) {
159-
ctx := dataServiceContext.Request().Context()
160-
res := dataServiceContext.Response()
161-
req := dataServiceContext.Request()
162-
163-
responder := request.MustNewResponder(res, req)
164-
165-
if details := request.GetAuthDetails(ctx); !details.IsService() {
166-
dataServiceContext.RespondWithError(service.ErrorUnauthorized())
167-
return
168-
}
169-
170-
summarizer := summary.GetSummarizer[A](dataServiceContext.SummarizerRegistry())
171-
status, err := summarizer.BackfillSummaries(ctx)
172-
if err != nil {
173-
responder.Error(http.StatusInternalServerError, err)
174-
return
175-
}
176-
177-
responder.Data(http.StatusOK, status)
178-
}
179-
180-
func GetOutdatedUserIDs[T types.Stats, A types.StatsPt[T]](dataServiceContext dataService.Context) {
154+
func GetOutdatedUserIDs[A types.StatsPt[T, P, B], P types.BucketDataPt[B], T types.Stats, B types.BucketData](dataServiceContext dataService.Context) {
181155
ctx := dataServiceContext.Request().Context()
182156
res := dataServiceContext.Response()
183157
req := dataServiceContext.Request()
@@ -195,7 +169,7 @@ func GetOutdatedUserIDs[T types.Stats, A types.StatsPt[T]](dataServiceContext da
195169
return
196170
}
197171

198-
summarizer := summary.GetSummarizer[A](dataServiceContext.SummarizerRegistry())
172+
summarizer := summary.GetSummarizer[A, P](dataServiceContext.SummarizerRegistry())
199173
response, err := summarizer.GetOutdatedUserIDs(ctx, pagination)
200174
if err != nil {
201175
responder.Error(http.StatusInternalServerError, err)
@@ -205,7 +179,7 @@ func GetOutdatedUserIDs[T types.Stats, A types.StatsPt[T]](dataServiceContext da
205179
responder.Data(http.StatusOK, response)
206180
}
207181

208-
func GetMigratableUserIDs[T types.Stats, A types.StatsPt[T]](dataServiceContext dataService.Context) {
182+
func GetMigratableUserIDs[A types.StatsPt[T, P, B], P types.BucketDataPt[B], T types.Stats, B types.BucketData](dataServiceContext dataService.Context) {
209183
ctx := dataServiceContext.Request().Context()
210184
res := dataServiceContext.Response()
211185
req := dataServiceContext.Request()
@@ -223,7 +197,7 @@ func GetMigratableUserIDs[T types.Stats, A types.StatsPt[T]](dataServiceContext
223197
return
224198
}
225199

226-
summarizer := summary.GetSummarizer[A](dataServiceContext.SummarizerRegistry())
200+
summarizer := summary.GetSummarizer[A, P](dataServiceContext.SummarizerRegistry())
227201
userIDs, err := summarizer.GetMigratableUserIDs(ctx, pagination)
228202
if err != nil {
229203
responder.Error(http.StatusInternalServerError, err)

data/service/context/standard.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type Standard struct {
3333
dataStore dataStore.Store
3434
dataRepository dataStore.DataRepository
3535
summaryRepository dataStore.SummaryRepository
36+
bucketsRepository dataStore.BucketsRepository
3637
summarizerRegistry *summary.SummarizerRegistry
3738
summaryReporter *reporters.PatientRealtimeDaysReporter
3839
syncTaskStore syncTaskStore.Store
@@ -126,6 +127,9 @@ func (s *Standard) Close() {
126127
if s.summaryReporter != nil {
127128
s.summaryReporter = nil
128129
}
130+
if s.bucketsRepository != nil {
131+
s.bucketsRepository = nil
132+
}
129133
if s.alertsRepository != nil {
130134
s.alertsRepository = nil
131135
}
@@ -163,7 +167,7 @@ func (s *Standard) SummaryRepository() dataStore.SummaryRepository {
163167

164168
func (s *Standard) SummarizerRegistry() *summary.SummarizerRegistry {
165169
if s.summarizerRegistry == nil {
166-
s.summarizerRegistry = summary.New(s.SummaryRepository().GetStore(), s.DataRepository())
170+
s.summarizerRegistry = summary.New(s.SummaryRepository().GetStore(), s.BucketsRepository().GetStore(), s.DataRepository())
167171
}
168172
return s.summarizerRegistry
169173
}
@@ -175,6 +179,13 @@ func (s *Standard) SummaryReporter() *reporters.PatientRealtimeDaysReporter {
175179
return s.summaryReporter
176180
}
177181

182+
func (s *Standard) BucketsRepository() dataStore.BucketsRepository {
183+
if s.bucketsRepository == nil {
184+
s.bucketsRepository = s.dataStore.NewBucketsRepository()
185+
}
186+
return s.bucketsRepository
187+
}
188+
178189
func (s *Standard) SyncTaskRepository() syncTaskStore.SyncTaskRepository {
179190
if s.syncTasksRepository == nil {
180191
s.syncTasksRepository = s.syncTaskStore.NewSyncTaskRepository()

0 commit comments

Comments
 (0)