@zykeco/sync-server 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +131 -0
  2. package/dist/db/schema.d.ts +1009 -0
  3. package/dist/db/schema.js +80 -1
  4. package/dist/db/schema.js.map +1 -1
  5. package/dist/index.js +25 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/routes/daily-stress-burden.d.ts +3 -0
  8. package/dist/routes/daily-stress-burden.js +24 -0
  9. package/dist/routes/daily-stress-burden.js.map +1 -0
  10. package/dist/routes/heart-rate-minute.d.ts +3 -0
  11. package/dist/routes/heart-rate-minute.js +24 -0
  12. package/dist/routes/heart-rate-minute.js.map +1 -0
  13. package/dist/routes/hr-zone-history.d.ts +3 -0
  14. package/dist/routes/hr-zone-history.js +24 -0
  15. package/dist/routes/hr-zone-history.js.map +1 -0
  16. package/dist/routes/user-profile.d.ts +3 -0
  17. package/dist/routes/user-profile.js +24 -0
  18. package/dist/routes/user-profile.js.map +1 -0
  19. package/dist/routes/user-timezones.d.ts +3 -0
  20. package/dist/routes/user-timezones.js +24 -0
  21. package/dist/routes/user-timezones.js.map +1 -0
  22. package/dist/routes/wipe.d.ts +6 -1
  23. package/dist/routes/wipe.js +16 -2
  24. package/dist/routes/wipe.js.map +1 -1
  25. package/dist/stores/daily-stress-burden.d.ts +3 -0
  26. package/dist/stores/daily-stress-burden.js +58 -0
  27. package/dist/stores/daily-stress-burden.js.map +1 -0
  28. package/dist/stores/heart-rate-minute.d.ts +3 -0
  29. package/dist/stores/heart-rate-minute.js +48 -0
  30. package/dist/stores/heart-rate-minute.js.map +1 -0
  31. package/dist/stores/hr-zone-history.d.ts +3 -0
  32. package/dist/stores/hr-zone-history.js +49 -0
  33. package/dist/stores/hr-zone-history.js.map +1 -0
  34. package/dist/stores/user-profile.d.ts +3 -0
  35. package/dist/stores/user-profile.js +76 -0
  36. package/dist/stores/user-profile.js.map +1 -0
  37. package/dist/stores/user-timezones.d.ts +3 -0
  38. package/dist/stores/user-timezones.js +43 -0
  39. package/dist/stores/user-timezones.js.map +1 -0
  40. package/drizzle/0001_sweet_firebird.sql +78 -0
  41. package/drizzle/meta/0001_snapshot.json +733 -0
  42. package/drizzle/meta/_journal.json +7 -0
  43. package/package.json +3 -3
package/dist/db/schema.js CHANGED
@@ -1,4 +1,5 @@
1
- import { blob, integer, real, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
1
+ import { sql } from 'drizzle-orm';
2
+ import { blob, check, index, integer, real, sqliteTable, text, uniqueIndex, } from 'drizzle-orm/sqlite-core';
2
3
  export const blobs = sqliteTable('blobs', {
3
4
  id: text('id').primaryKey(),
4
5
  contentType: text('content_type').notNull(),
@@ -35,4 +36,82 @@ export const sleepSessions = sqliteTable('sleep_sessions', {
35
36
  payloadVersion: integer('payload_version').notNull().default(1),
36
37
  payload: text('payload', { mode: 'json' }).notNull(),
37
38
  });
39
+ export const userTimezones = sqliteTable('user_timezones', {
40
+ id: integer('id').primaryKey({ autoIncrement: false }),
41
+ timezone: text('timezone').notNull(),
42
+ type: text('type').notNull(),
43
+ utcOffsetMinutes: integer('utc_offset_minutes').notNull(),
44
+ effectiveFrom: integer('effective_from').notNull(),
45
+ }, (t) => ({
46
+ effectiveFromIdx: index('user_tz_effective_from_idx').on(t.effectiveFrom),
47
+ }));
48
+ export const userProfile = sqliteTable('user_profile', {
49
+ id: integer('id').primaryKey({ autoIncrement: false }),
50
+ name: text('name').notNull(),
51
+ birthDate: text('birth_date').notNull(),
52
+ height: real('height').notNull(),
53
+ weight: real('weight').notNull(),
54
+ biologicalGender: text('biological_gender').notNull(),
55
+ maxHeartRate: integer('max_heart_rate'),
56
+ maxHeartRateManually: integer('max_heart_rate_manually'),
57
+ restingHeartRate: integer('resting_heart_rate'),
58
+ vo2Max: real('vo2_max'),
59
+ heartRateZonesManually: integer('heart_rate_zones_manually'),
60
+ hrZone1: integer('hr_zone_1'),
61
+ hrZone2: integer('hr_zone_2'),
62
+ hrZone3: integer('hr_zone_3'),
63
+ hrZone4: integer('hr_zone_4'),
64
+ hrZone5: integer('hr_zone_5'),
65
+ trainingBackground: text('training_background'),
66
+ typicalDay: text('typical_day'),
67
+ sleepGoalMinutes: integer('sleep_goal_minutes'),
68
+ dataRetentionLevel: text('data_retention_level'),
69
+ createdAt: integer('created_at').notNull(),
70
+ updatedAt: integer('updated_at').notNull(),
71
+ }, (t) => ({
72
+ singleton: check('user_profile_singleton', sql `${t.id} = 1`),
73
+ }));
74
+ export const dailyStressBurden = sqliteTable('daily_stress_burden', {
75
+ id: integer('id').primaryKey({ autoIncrement: false }),
76
+ isoDate: text('iso_date').notNull(),
77
+ timezone: text('timezone').notNull(),
78
+ intervalsRelaxed: integer('intervals_relaxed').notNull(),
79
+ intervalsBalanced: integer('intervals_balanced').notNull(),
80
+ intervalsElevated: integer('intervals_elevated').notNull(),
81
+ intervalsHigh: integer('intervals_high').notNull(),
82
+ intervalsScored: integer('intervals_scored').notNull(),
83
+ meanScore: real('mean_score').notNull(),
84
+ peakScore: real('peak_score').notNull(),
85
+ peakScoreUtc: integer('peak_score_utc').notNull(),
86
+ stressBurden: real('stress_burden').notNull(),
87
+ updatedAt: integer('updated_at').notNull(),
88
+ }, (t) => ({
89
+ isoDateIdx: uniqueIndex('dsb_unique_date_idx').on(t.isoDate),
90
+ }));
91
+ export const heartRateMinute = sqliteTable('heart_rate_minute', {
92
+ id: integer('id').primaryKey({ autoIncrement: false }),
93
+ minuteStartUtc: integer('minute_start_utc').notNull(),
94
+ bpmMean: real('bpm_mean').notNull(),
95
+ bpmMin: integer('bpm_min').notNull(),
96
+ bpmMax: integer('bpm_max').notNull(),
97
+ sampleCount: integer('sample_count').notNull(),
98
+ deviceId: integer('device_id').notNull(),
99
+ updatedAt: integer('updated_at').notNull(),
100
+ }, (t) => ({
101
+ minuteIdx: index('hrm_minute_idx').on(t.minuteStartUtc),
102
+ uniqueMinutePerDevice: uniqueIndex('hrm_unique_minute_per_device_idx').on(t.minuteStartUtc, t.deviceId),
103
+ deviceUpdatedIdx: index('hrm_device_updated_idx').on(t.deviceId, t.updatedAt),
104
+ }));
105
+ export const hrZoneHistory = sqliteTable('hr_zone_history', {
106
+ id: integer('id').primaryKey({ autoIncrement: false }),
107
+ effectiveFromIsoDate: text('effective_from_iso_date').notNull(),
108
+ zone1: integer('zone1').notNull(),
109
+ zone2: integer('zone2').notNull(),
110
+ zone3: integer('zone3').notNull(),
111
+ zone4: integer('zone4').notNull(),
112
+ zone5: integer('zone5').notNull(),
113
+ createdAt: integer('created_at').notNull(),
114
+ }, (t) => ({
115
+ uniqueEffective: uniqueIndex('hrzh_unique_effective_idx').on(t.effectiveFromIsoDate),
116
+ }));
38
117
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,12 +4,22 @@ import { createDb } from './db/client.js';
4
4
  import { runMigrations } from './db/migrate.js';
5
5
  import { loadEnv } from './env.js';
6
6
  import { dailyMetricsRoutes } from './routes/daily-metrics.js';
7
+ import { dailyStressBurdenRoutes } from './routes/daily-stress-burden.js';
7
8
  import { healthRoutes } from './routes/health.js';
9
+ import { heartRateMinuteRoutes } from './routes/heart-rate-minute.js';
10
+ import { hrZoneHistoryRoutes } from './routes/hr-zone-history.js';
8
11
  import { sleepSessionsRoutes } from './routes/sleep-sessions.js';
12
+ import { userProfileRoutes } from './routes/user-profile.js';
13
+ import { userTimezonesRoutes } from './routes/user-timezones.js';
9
14
  import { weeklyMetricsRoutes } from './routes/weekly-metrics.js';
10
15
  import { wipeRoutes } from './routes/wipe.js';
11
16
  import { createDailyMetricsStore } from './stores/daily-metrics.js';
17
+ import { createDailyStressBurdenStore } from './stores/daily-stress-burden.js';
18
+ import { createHeartRateMinuteStore } from './stores/heart-rate-minute.js';
19
+ import { createHrZoneHistoryStore } from './stores/hr-zone-history.js';
12
20
  import { createSleepSessionsStore } from './stores/sleep-sessions.js';
21
+ import { createUserProfileStore } from './stores/user-profile.js';
22
+ import { createUserTimezonesStore } from './stores/user-timezones.js';
13
23
  import { createWeeklyMetricsStore } from './stores/weekly-metrics.js';
14
24
  const env = loadEnv();
15
25
  const db = createDb(env.databaseUrl);
@@ -20,13 +30,28 @@ app.route('/v1/health', healthRoutes(db));
20
30
  const dailyMetricsStore = createDailyMetricsStore(db);
21
31
  const weeklyMetricsStore = createWeeklyMetricsStore(db);
22
32
  const sleepSessionsStore = createSleepSessionsStore(db);
33
+ const userTimezonesStore = createUserTimezonesStore(db);
34
+ const userProfileStore = createUserProfileStore(db);
35
+ const dailyStressBurdenStore = createDailyStressBurdenStore(db);
36
+ const heartRateMinuteStore = createHeartRateMinuteStore(db);
37
+ const hrZoneHistoryStore = createHrZoneHistoryStore(db);
23
38
  app.route('/v1/sync/daily-metrics', dailyMetricsRoutes(dailyMetricsStore, auth));
24
39
  app.route('/v1/sync/weekly-metrics', weeklyMetricsRoutes(weeklyMetricsStore, auth));
25
40
  app.route('/v1/sync/sleep-sessions', sleepSessionsRoutes(sleepSessionsStore, auth));
41
+ app.route('/v1/sync/user-timezones', userTimezonesRoutes(userTimezonesStore, auth));
42
+ app.route('/v1/sync/user-profile', userProfileRoutes(userProfileStore, auth));
43
+ app.route('/v1/sync/daily-stress-burden', dailyStressBurdenRoutes(dailyStressBurdenStore, auth));
44
+ app.route('/v1/sync/heart-rate-minute', heartRateMinuteRoutes(heartRateMinuteStore, auth));
45
+ app.route('/v1/sync/hr-zone-history', hrZoneHistoryRoutes(hrZoneHistoryStore, auth));
26
46
  app.route('/v1/sync/wipe', wipeRoutes({
27
47
  dailyMetrics: dailyMetricsStore,
28
48
  weeklyMetrics: weeklyMetricsStore,
29
49
  sleepSessions: sleepSessionsStore,
50
+ userTimezones: userTimezonesStore,
51
+ userProfile: userProfileStore,
52
+ dailyStressBurden: dailyStressBurdenStore,
53
+ heartRateMinute: heartRateMinuteStore,
54
+ hrZoneHistory: hrZoneHistoryStore,
30
55
  }, auth));
31
56
  serve({ fetch: app.fetch, port: env.port }, (info) => {
32
57
  console.info(`zyke-sync listening on http://localhost:${info.port}`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAErC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;AAExB,MAAM,IAAI,GAAe,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AAEtF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1C,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;AACtD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;AACxD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;AAExD,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;AACjF,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,GAAG,CAAC,KAAK,CACP,eAAe,EACf,UAAU,CACR;IACE,YAAY,EAAE,iBAAiB;IAC/B,aAAa,EAAE,kBAAkB;IACjC,aAAa,EAAE,kBAAkB;CAClC,EACD,IAAI,CACL,CACF,CAAC;AAEF,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACnD,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, DailyStressBurdenStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function dailyStressBurdenRoutes(store: DailyStressBurdenStore, auth: AuthConfig): Hono;
@@ -0,0 +1,24 @@
1
+ import { DailyStressBurdensBatchWrite, DeletionsBatchWrite } from '@zykeco/sync-protocol';
2
+ import { Hono } from 'hono';
3
+ import { requireAuth } from './auth.js';
4
+ import { parseJsonBody } from './validate.js';
5
+ export function dailyStressBurdenRoutes(store, auth) {
6
+ const app = new Hono();
7
+ app.post('/batch', requireAuth('write', auth), async (c) => {
8
+ const body = await parseJsonBody(c, DailyStressBurdensBatchWrite);
9
+ if (body instanceof Response)
10
+ return body;
11
+ const serverNowMs = Date.now();
12
+ const stored = await store.upsertBatch(body.rows, serverNowMs);
13
+ return c.json({ stored, serverNowMs });
14
+ });
15
+ app.post('/delete', requireAuth('write', auth), async (c) => {
16
+ const body = await parseJsonBody(c, DeletionsBatchWrite);
17
+ if (body instanceof Response)
18
+ return body;
19
+ const deleted = await store.deleteBatch(body.ids);
20
+ return c.json({ deleted, serverNowMs: Date.now() });
21
+ });
22
+ return app;
23
+ }
24
+ //# sourceMappingURL=daily-stress-burden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-stress-burden.js","sourceRoot":"","sources":["../../src/routes/daily-stress-burden.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,uBAAuB,CAAC,KAA6B,EAAE,IAAgB;IACrF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAClE,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, HeartRateMinuteStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function heartRateMinuteRoutes(store: HeartRateMinuteStore, auth: AuthConfig): Hono;
@@ -0,0 +1,24 @@
1
+ import { DeletionsBatchWrite, HeartRateMinutesBatchWrite } from '@zykeco/sync-protocol';
2
+ import { Hono } from 'hono';
3
+ import { requireAuth } from './auth.js';
4
+ import { parseJsonBody } from './validate.js';
5
+ export function heartRateMinuteRoutes(store, auth) {
6
+ const app = new Hono();
7
+ app.post('/batch', requireAuth('write', auth), async (c) => {
8
+ const body = await parseJsonBody(c, HeartRateMinutesBatchWrite);
9
+ if (body instanceof Response)
10
+ return body;
11
+ const serverNowMs = Date.now();
12
+ const stored = await store.upsertBatch(body.rows, serverNowMs);
13
+ return c.json({ stored, serverNowMs });
14
+ });
15
+ app.post('/delete', requireAuth('write', auth), async (c) => {
16
+ const body = await parseJsonBody(c, DeletionsBatchWrite);
17
+ if (body instanceof Response)
18
+ return body;
19
+ const deleted = await store.deleteBatch(body.ids);
20
+ return c.json({ deleted, serverNowMs: Date.now() });
21
+ });
22
+ return app;
23
+ }
24
+ //# sourceMappingURL=heart-rate-minute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heart-rate-minute.js","sourceRoot":"","sources":["../../src/routes/heart-rate-minute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,KAA2B,EAAE,IAAgB;IACjF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAChE,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, HrZoneHistoryStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function hrZoneHistoryRoutes(store: HrZoneHistoryStore, auth: AuthConfig): Hono;
@@ -0,0 +1,24 @@
1
+ import { DeletionsBatchWrite, HrZoneHistoriesBatchWrite } from '@zykeco/sync-protocol';
2
+ import { Hono } from 'hono';
3
+ import { requireAuth } from './auth.js';
4
+ import { parseJsonBody } from './validate.js';
5
+ export function hrZoneHistoryRoutes(store, auth) {
6
+ const app = new Hono();
7
+ app.post('/batch', requireAuth('write', auth), async (c) => {
8
+ const body = await parseJsonBody(c, HrZoneHistoriesBatchWrite);
9
+ if (body instanceof Response)
10
+ return body;
11
+ const serverNowMs = Date.now();
12
+ const stored = await store.upsertBatch(body.rows, serverNowMs);
13
+ return c.json({ stored, serverNowMs });
14
+ });
15
+ app.post('/delete', requireAuth('write', auth), async (c) => {
16
+ const body = await parseJsonBody(c, DeletionsBatchWrite);
17
+ if (body instanceof Response)
18
+ return body;
19
+ const deleted = await store.deleteBatch(body.ids);
20
+ return c.json({ deleted, serverNowMs: Date.now() });
21
+ });
22
+ return app;
23
+ }
24
+ //# sourceMappingURL=hr-zone-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hr-zone-history.js","sourceRoot":"","sources":["../../src/routes/hr-zone-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,IAAgB;IAC7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC/D,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, UserProfileStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function userProfileRoutes(store: UserProfileStore, auth: AuthConfig): Hono;
@@ -0,0 +1,24 @@
1
+ import { DeletionsBatchWrite, UserProfilesBatchWrite } from '@zykeco/sync-protocol';
2
+ import { Hono } from 'hono';
3
+ import { requireAuth } from './auth.js';
4
+ import { parseJsonBody } from './validate.js';
5
+ export function userProfileRoutes(store, auth) {
6
+ const app = new Hono();
7
+ app.post('/batch', requireAuth('write', auth), async (c) => {
8
+ const body = await parseJsonBody(c, UserProfilesBatchWrite);
9
+ if (body instanceof Response)
10
+ return body;
11
+ const serverNowMs = Date.now();
12
+ const stored = await store.upsertBatch(body.rows, serverNowMs);
13
+ return c.json({ stored, serverNowMs });
14
+ });
15
+ app.post('/delete', requireAuth('write', auth), async (c) => {
16
+ const body = await parseJsonBody(c, DeletionsBatchWrite);
17
+ if (body instanceof Response)
18
+ return body;
19
+ const deleted = await store.deleteBatch(body.ids);
20
+ return c.json({ deleted, serverNowMs: Date.now() });
21
+ });
22
+ return app;
23
+ }
24
+ //# sourceMappingURL=user-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../../src/routes/user-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,KAAuB,EAAE,IAAgB;IACzE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC5D,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, UserTimezonesStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function userTimezonesRoutes(store: UserTimezonesStore, auth: AuthConfig): Hono;
@@ -0,0 +1,24 @@
1
+ import { DeletionsBatchWrite, UserTimezonesBatchWrite } from '@zykeco/sync-protocol';
2
+ import { Hono } from 'hono';
3
+ import { requireAuth } from './auth.js';
4
+ import { parseJsonBody } from './validate.js';
5
+ export function userTimezonesRoutes(store, auth) {
6
+ const app = new Hono();
7
+ app.post('/batch', requireAuth('write', auth), async (c) => {
8
+ const body = await parseJsonBody(c, UserTimezonesBatchWrite);
9
+ if (body instanceof Response)
10
+ return body;
11
+ const serverNowMs = Date.now();
12
+ const stored = await store.upsertBatch(body.rows, serverNowMs);
13
+ return c.json({ stored, serverNowMs });
14
+ });
15
+ app.post('/delete', requireAuth('write', auth), async (c) => {
16
+ const body = await parseJsonBody(c, DeletionsBatchWrite);
17
+ if (body instanceof Response)
18
+ return body;
19
+ const deleted = await store.deleteBatch(body.ids);
20
+ return c.json({ deleted, serverNowMs: Date.now() });
21
+ });
22
+ return app;
23
+ }
24
+ //# sourceMappingURL=user-timezones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-timezones.js","sourceRoot":"","sources":["../../src/routes/user-timezones.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,IAAgB;IAC7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC7D,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,7 +1,12 @@
1
- import type { AuthConfig, DailyMetricsStore, SleepSessionsStore, WeeklyMetricsStore } from '@zykeco/server-core';
1
+ import type { AuthConfig, DailyMetricsStore, DailyStressBurdenStore, HeartRateMinuteStore, HrZoneHistoryStore, SleepSessionsStore, UserProfileStore, UserTimezonesStore, WeeklyMetricsStore } from '@zykeco/server-core';
2
2
  import { Hono } from 'hono';
3
3
  export declare function wipeRoutes(stores: {
4
4
  dailyMetrics: DailyMetricsStore;
5
5
  weeklyMetrics: WeeklyMetricsStore;
6
6
  sleepSessions: SleepSessionsStore;
7
+ userTimezones: UserTimezonesStore;
8
+ userProfile: UserProfileStore;
9
+ dailyStressBurden: DailyStressBurdenStore;
10
+ heartRateMinute: HeartRateMinuteStore;
11
+ hrZoneHistory: HrZoneHistoryStore;
7
12
  }, auth: AuthConfig): Hono;
@@ -8,13 +8,27 @@ export function wipeRoutes(stores, auth) {
8
8
  const body = await parseJsonBody(c, WipeRequest);
9
9
  if (body instanceof Response)
10
10
  return body;
11
- const [dailyMetrics, weeklyMetrics, sleepSessions] = await Promise.all([
11
+ const [dailyMetrics, weeklyMetrics, sleepSessions, userTimezones, userProfile, dailyStressBurden, heartRateMinute, hrZoneHistory,] = await Promise.all([
12
12
  stores.dailyMetrics.wipeAll(),
13
13
  stores.weeklyMetrics.wipeAll(),
14
14
  stores.sleepSessions.wipeAll(),
15
+ stores.userTimezones.wipeAll(),
16
+ stores.userProfile.wipeAll(),
17
+ stores.dailyStressBurden.wipeAll(),
18
+ stores.heartRateMinute.wipeAll(),
19
+ stores.hrZoneHistory.wipeAll(),
15
20
  ]);
16
21
  return c.json({
17
- wiped: { dailyMetrics, weeklyMetrics, sleepSessions },
22
+ wiped: {
23
+ dailyMetrics,
24
+ weeklyMetrics,
25
+ sleepSessions,
26
+ userTimezones,
27
+ userProfile,
28
+ dailyStressBurden,
29
+ heartRateMinute,
30
+ hrZoneHistory,
31
+ },
18
32
  serverNowMs: Date.now(),
19
33
  });
20
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"wipe.js","sourceRoot":"","sources":["../../src/routes/wipe.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,UAAU,CACxB,MAIC,EACD,IAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;YAC7B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;YAC9B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;SAC/B,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE;YACrD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"wipe.js","sourceRoot":"","sources":["../../src/routes/wipe.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,UAAU,CACxB,MASC,EACD,IAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,CACJ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,EACd,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;YAC7B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;YAC9B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;YAC9B,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;YAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE;YAClC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE;YAChC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;SAC/B,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE;gBACL,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,iBAAiB;gBACjB,eAAe;gBACf,aAAa;aACd;YACD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DailyStressBurdenStore } from '@zykeco/server-core';
2
+ import type { Db } from '../db/client.js';
3
+ export declare function createDailyStressBurdenStore(db: Db): DailyStressBurdenStore;
@@ -0,0 +1,58 @@
1
+ import { inArray, sql } from 'drizzle-orm';
2
+ import { dailyStressBurden } from '../db/schema.js';
3
+ export function createDailyStressBurdenStore(db) {
4
+ return {
5
+ async upsertBatch(rows, _serverNowMs) {
6
+ if (rows.length === 0)
7
+ return [];
8
+ const values = rows.map((r) => ({
9
+ id: r.id,
10
+ isoDate: r.isoDate,
11
+ timezone: r.timezone,
12
+ intervalsRelaxed: r.intervalsRelaxed,
13
+ intervalsBalanced: r.intervalsBalanced,
14
+ intervalsElevated: r.intervalsElevated,
15
+ intervalsHigh: r.intervalsHigh,
16
+ intervalsScored: r.intervalsScored,
17
+ meanScore: r.meanScore,
18
+ peakScore: r.peakScore,
19
+ peakScoreUtc: r.peakScoreUtc,
20
+ stressBurden: r.stressBurden,
21
+ updatedAt: r.updatedAt,
22
+ }));
23
+ await db
24
+ .insert(dailyStressBurden)
25
+ .values(values)
26
+ .onConflictDoUpdate({
27
+ target: dailyStressBurden.id,
28
+ set: {
29
+ isoDate: sql `excluded.iso_date`,
30
+ timezone: sql `excluded.timezone`,
31
+ intervalsRelaxed: sql `excluded.intervals_relaxed`,
32
+ intervalsBalanced: sql `excluded.intervals_balanced`,
33
+ intervalsElevated: sql `excluded.intervals_elevated`,
34
+ intervalsHigh: sql `excluded.intervals_high`,
35
+ intervalsScored: sql `excluded.intervals_scored`,
36
+ meanScore: sql `excluded.mean_score`,
37
+ peakScore: sql `excluded.peak_score`,
38
+ peakScoreUtc: sql `excluded.peak_score_utc`,
39
+ stressBurden: sql `excluded.stress_burden`,
40
+ updatedAt: sql `excluded.updated_at`,
41
+ },
42
+ where: sql `excluded.updated_at > ${dailyStressBurden.updatedAt}`,
43
+ });
44
+ return rows.map((r) => r.id);
45
+ },
46
+ async deleteBatch(ids) {
47
+ if (ids.length === 0)
48
+ return [];
49
+ await db.delete(dailyStressBurden).where(inArray(dailyStressBurden.id, [...ids]));
50
+ return [...ids];
51
+ },
52
+ async wipeAll() {
53
+ const result = await db.delete(dailyStressBurden);
54
+ return result.rowsAffected;
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=daily-stress-burden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-stress-burden.js","sourceRoot":"","sources":["../../src/stores/daily-stress-burden.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,4BAA4B,CAAC,EAAM;IACjD,OAAO;QACL,KAAK,CAAC,WAAW,CACf,IAAuC,EACvC,YAAoB;YAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;gBACpC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;gBACtC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;gBACtC,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAC;YACJ,MAAM,EAAE;iBACL,MAAM,CAAC,iBAAiB,CAAC;iBACzB,MAAM,CAAC,MAAM,CAAC;iBACd,kBAAkB,CAAC;gBAClB,MAAM,EAAE,iBAAiB,CAAC,EAAE;gBAC5B,GAAG,EAAE;oBACH,OAAO,EAAE,GAAG,CAAA,mBAAmB;oBAC/B,QAAQ,EAAE,GAAG,CAAA,mBAAmB;oBAChC,gBAAgB,EAAE,GAAG,CAAA,4BAA4B;oBACjD,iBAAiB,EAAE,GAAG,CAAA,6BAA6B;oBACnD,iBAAiB,EAAE,GAAG,CAAA,6BAA6B;oBACnD,aAAa,EAAE,GAAG,CAAA,yBAAyB;oBAC3C,eAAe,EAAE,GAAG,CAAA,2BAA2B;oBAC/C,SAAS,EAAE,GAAG,CAAA,qBAAqB;oBACnC,SAAS,EAAE,GAAG,CAAA,qBAAqB;oBACnC,YAAY,EAAE,GAAG,CAAA,yBAAyB;oBAC1C,YAAY,EAAE,GAAG,CAAA,wBAAwB;oBACzC,SAAS,EAAE,GAAG,CAAA,qBAAqB;iBACpC;gBACD,KAAK,EAAE,GAAG,CAAA,yBAAyB,iBAAiB,CAAC,SAAS,EAAE;aACjE,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,GAAsB;YACtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC,YAAY,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { HeartRateMinuteStore } from '@zykeco/server-core';
2
+ import type { Db } from '../db/client.js';
3
+ export declare function createHeartRateMinuteStore(db: Db): HeartRateMinuteStore;
@@ -0,0 +1,48 @@
1
+ import { inArray, sql } from 'drizzle-orm';
2
+ import { heartRateMinute } from '../db/schema.js';
3
+ export function createHeartRateMinuteStore(db) {
4
+ return {
5
+ async upsertBatch(rows, _serverNowMs) {
6
+ if (rows.length === 0)
7
+ return [];
8
+ const values = rows.map((r) => ({
9
+ id: r.id,
10
+ minuteStartUtc: r.minuteStartUtc,
11
+ bpmMean: r.bpmMean,
12
+ bpmMin: r.bpmMin,
13
+ bpmMax: r.bpmMax,
14
+ sampleCount: r.sampleCount,
15
+ deviceId: r.deviceId,
16
+ updatedAt: r.updatedAt,
17
+ }));
18
+ await db
19
+ .insert(heartRateMinute)
20
+ .values(values)
21
+ .onConflictDoUpdate({
22
+ target: heartRateMinute.id,
23
+ set: {
24
+ minuteStartUtc: sql `excluded.minute_start_utc`,
25
+ bpmMean: sql `excluded.bpm_mean`,
26
+ bpmMin: sql `excluded.bpm_min`,
27
+ bpmMax: sql `excluded.bpm_max`,
28
+ sampleCount: sql `excluded.sample_count`,
29
+ deviceId: sql `excluded.device_id`,
30
+ updatedAt: sql `excluded.updated_at`,
31
+ },
32
+ where: sql `excluded.updated_at > ${heartRateMinute.updatedAt}`,
33
+ });
34
+ return rows.map((r) => r.id);
35
+ },
36
+ async deleteBatch(ids) {
37
+ if (ids.length === 0)
38
+ return [];
39
+ await db.delete(heartRateMinute).where(inArray(heartRateMinute.id, [...ids]));
40
+ return [...ids];
41
+ },
42
+ async wipeAll() {
43
+ const result = await db.delete(heartRateMinute);
44
+ return result.rowsAffected;
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=heart-rate-minute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heart-rate-minute.js","sourceRoot":"","sources":["../../src/stores/heart-rate-minute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,UAAU,0BAA0B,CAAC,EAAM;IAC/C,OAAO;QACL,KAAK,CAAC,WAAW,CACf,IAAqC,EACrC,YAAoB;YAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAC;YACJ,MAAM,EAAE;iBACL,MAAM,CAAC,eAAe,CAAC;iBACvB,MAAM,CAAC,MAAM,CAAC;iBACd,kBAAkB,CAAC;gBAClB,MAAM,EAAE,eAAe,CAAC,EAAE;gBAC1B,GAAG,EAAE;oBACH,cAAc,EAAE,GAAG,CAAA,2BAA2B;oBAC9C,OAAO,EAAE,GAAG,CAAA,mBAAmB;oBAC/B,MAAM,EAAE,GAAG,CAAA,kBAAkB;oBAC7B,MAAM,EAAE,GAAG,CAAA,kBAAkB;oBAC7B,WAAW,EAAE,GAAG,CAAA,uBAAuB;oBACvC,QAAQ,EAAE,GAAG,CAAA,oBAAoB;oBACjC,SAAS,EAAE,GAAG,CAAA,qBAAqB;iBACpC;gBACD,KAAK,EAAE,GAAG,CAAA,yBAAyB,eAAe,CAAC,SAAS,EAAE;aAC/D,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,GAAsB;YACtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,YAAY,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { HrZoneHistoryStore } from '@zykeco/server-core';
2
+ import type { Db } from '../db/client.js';
3
+ export declare function createHrZoneHistoryStore(db: Db): HrZoneHistoryStore;
@@ -0,0 +1,49 @@
1
+ import { inArray, sql } from 'drizzle-orm';
2
+ import { hrZoneHistory } from '../db/schema.js';
3
+ export function createHrZoneHistoryStore(db) {
4
+ return {
5
+ async upsertBatch(rows, _serverNowMs) {
6
+ if (rows.length === 0)
7
+ return [];
8
+ const values = rows.map((r) => ({
9
+ id: r.id,
10
+ effectiveFromIsoDate: r.effectiveFromIsoDate,
11
+ zone1: r.zone1,
12
+ zone2: r.zone2,
13
+ zone3: r.zone3,
14
+ zone4: r.zone4,
15
+ zone5: r.zone5,
16
+ createdAt: r.createdAt,
17
+ }));
18
+ await db
19
+ .insert(hrZoneHistory)
20
+ .values(values)
21
+ .onConflictDoUpdate({
22
+ target: hrZoneHistory.id,
23
+ set: {
24
+ effectiveFromIsoDate: sql `excluded.effective_from_iso_date`,
25
+ zone1: sql `excluded.zone1`,
26
+ zone2: sql `excluded.zone2`,
27
+ zone3: sql `excluded.zone3`,
28
+ zone4: sql `excluded.zone4`,
29
+ zone5: sql `excluded.zone5`,
30
+ createdAt: sql `excluded.created_at`,
31
+ },
32
+ // LWW on createdAt (table is append-only; no updatedAt)
33
+ where: sql `excluded.created_at > ${hrZoneHistory.createdAt}`,
34
+ });
35
+ return rows.map((r) => r.id);
36
+ },
37
+ async deleteBatch(ids) {
38
+ if (ids.length === 0)
39
+ return [];
40
+ await db.delete(hrZoneHistory).where(inArray(hrZoneHistory.id, [...ids]));
41
+ return [...ids];
42
+ },
43
+ async wipeAll() {
44
+ const result = await db.delete(hrZoneHistory);
45
+ return result.rowsAffected;
46
+ },
47
+ };
48
+ }
49
+ //# sourceMappingURL=hr-zone-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hr-zone-history.js","sourceRoot":"","sources":["../../src/stores/hr-zone-history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,UAAU,wBAAwB,CAAC,EAAM;IAC7C,OAAO;QACL,KAAK,CAAC,WAAW,CACf,IAAmC,EACnC,YAAoB;YAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;gBAC5C,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAC;YACJ,MAAM,EAAE;iBACL,MAAM,CAAC,aAAa,CAAC;iBACrB,MAAM,CAAC,MAAM,CAAC;iBACd,kBAAkB,CAAC;gBAClB,MAAM,EAAE,aAAa,CAAC,EAAE;gBACxB,GAAG,EAAE;oBACH,oBAAoB,EAAE,GAAG,CAAA,kCAAkC;oBAC3D,KAAK,EAAE,GAAG,CAAA,gBAAgB;oBAC1B,KAAK,EAAE,GAAG,CAAA,gBAAgB;oBAC1B,KAAK,EAAE,GAAG,CAAA,gBAAgB;oBAC1B,KAAK,EAAE,GAAG,CAAA,gBAAgB;oBAC1B,KAAK,EAAE,GAAG,CAAA,gBAAgB;oBAC1B,SAAS,EAAE,GAAG,CAAA,qBAAqB;iBACpC;gBACD,wDAAwD;gBACxD,KAAK,EAAE,GAAG,CAAA,yBAAyB,aAAa,CAAC,SAAS,EAAE;aAC7D,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,GAAsB;YACtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,OAAO;YACX,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,YAAY,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UserProfileStore } from '@zykeco/server-core';
2
+ import type { Db } from '../db/client.js';
3
+ export declare function createUserProfileStore(db: Db): UserProfileStore;