@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.
- package/README.md +131 -0
- package/dist/db/schema.d.ts +1009 -0
- package/dist/db/schema.js +80 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/routes/daily-stress-burden.d.ts +3 -0
- package/dist/routes/daily-stress-burden.js +24 -0
- package/dist/routes/daily-stress-burden.js.map +1 -0
- package/dist/routes/heart-rate-minute.d.ts +3 -0
- package/dist/routes/heart-rate-minute.js +24 -0
- package/dist/routes/heart-rate-minute.js.map +1 -0
- package/dist/routes/hr-zone-history.d.ts +3 -0
- package/dist/routes/hr-zone-history.js +24 -0
- package/dist/routes/hr-zone-history.js.map +1 -0
- package/dist/routes/user-profile.d.ts +3 -0
- package/dist/routes/user-profile.js +24 -0
- package/dist/routes/user-profile.js.map +1 -0
- package/dist/routes/user-timezones.d.ts +3 -0
- package/dist/routes/user-timezones.js +24 -0
- package/dist/routes/user-timezones.js.map +1 -0
- package/dist/routes/wipe.d.ts +6 -1
- package/dist/routes/wipe.js +16 -2
- package/dist/routes/wipe.js.map +1 -1
- package/dist/stores/daily-stress-burden.d.ts +3 -0
- package/dist/stores/daily-stress-burden.js +58 -0
- package/dist/stores/daily-stress-burden.js.map +1 -0
- package/dist/stores/heart-rate-minute.d.ts +3 -0
- package/dist/stores/heart-rate-minute.js +48 -0
- package/dist/stores/heart-rate-minute.js.map +1 -0
- package/dist/stores/hr-zone-history.d.ts +3 -0
- package/dist/stores/hr-zone-history.js +49 -0
- package/dist/stores/hr-zone-history.js.map +1 -0
- package/dist/stores/user-profile.d.ts +3 -0
- package/dist/stores/user-profile.js +76 -0
- package/dist/stores/user-profile.js.map +1 -0
- package/dist/stores/user-timezones.d.ts +3 -0
- package/dist/stores/user-timezones.js +43 -0
- package/dist/stores/user-timezones.js.map +1 -0
- package/drizzle/0001_sweet_firebird.sql +78 -0
- package/drizzle/meta/0001_snapshot.json +733 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +3 -3
package/dist/db/schema.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
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
|
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,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,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,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,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,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"}
|
package/dist/routes/wipe.d.ts
CHANGED
|
@@ -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;
|
package/dist/routes/wipe.js
CHANGED
|
@@ -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: {
|
|
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
|
});
|
package/dist/routes/wipe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wipe.js","sourceRoot":"","sources":["../../src/routes/wipe.ts"],"names":[],"mappings":"
|
|
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,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,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,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"}
|