@stuartshay/otel-graphql-types 1.0.0 → 1.0.95

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 (3) hide show
  1. package/index.d.ts +563 -24
  2. package/package.json +1 -1
  3. package/schema.graphql +1398 -5
package/schema.graphql CHANGED
@@ -6,234 +6,1321 @@ scalar DateTime
6
6
  # -------------------------------------------------------
7
7
  # Common Types
8
8
  # -------------------------------------------------------
9
+ """
10
+ Pagination metadata for paginated list responses.
11
+ """
9
12
  type PaginationInfo {
13
+ """
14
+ Total number of items matching the query
15
+ """
10
16
  total: Int!
17
+ """
18
+ Maximum number of items per page
19
+ """
11
20
  limit: Int!
21
+ """
22
+ Number of items skipped from the start
23
+ """
12
24
  offset: Int!
13
25
  }
14
26
 
15
27
  # -------------------------------------------------------
16
28
  # Health
17
29
  # -------------------------------------------------------
30
+ """
31
+ Service health status.
32
+ """
18
33
  type HealthStatus {
34
+ """
35
+ Service health status (healthy or unhealthy)
36
+ """
19
37
  status: String!
38
+ """
39
+ Application version from VERSION file
40
+ """
20
41
  version: String!
21
42
  }
22
43
 
44
+ """
45
+ Service readiness status including database connectivity.
46
+ """
23
47
  type ReadyStatus {
48
+ """
49
+ Service readiness status
50
+ """
24
51
  status: String!
52
+ """
53
+ Database connection status
54
+ """
25
55
  database: String
56
+ """
57
+ Application version from VERSION file
58
+ """
26
59
  version: String
27
60
  }
28
61
 
29
62
  # -------------------------------------------------------
30
63
  # Locations (OwnTracks)
31
64
  # -------------------------------------------------------
65
+ """
66
+ GPS location recorded by the OwnTracks mobile app.
67
+ """
32
68
  type Location {
69
+ """
70
+ Unique location record identifier
71
+ """
33
72
  id: Int!
73
+ """
74
+ OwnTracks device identifier (e.g. iphone_stuart)
75
+ """
34
76
  device_id: String!
77
+ """
78
+ Two-character tracker ID set in the OwnTracks app
79
+ """
35
80
  tid: String
81
+ """
82
+ GPS latitude in decimal degrees (WGS 84)
83
+ """
36
84
  latitude: Float!
85
+ """
86
+ GPS longitude in decimal degrees (WGS 84)
87
+ """
37
88
  longitude: Float!
89
+ """
90
+ Horizontal accuracy of the GPS fix in meters
91
+ """
38
92
  accuracy: Float
93
+ """
94
+ Altitude above sea level in meters
95
+ """
39
96
  altitude: Float
97
+ """
98
+ Device velocity in km/h at time of report
99
+ """
40
100
  velocity: Float
101
+ """
102
+ Device battery level as a percentage (0-100)
103
+ """
41
104
  battery: Int
105
+ """
106
+ Battery charging state (0=unknown, 1=unplugged, 2=charging, 3=full)
107
+ """
42
108
  battery_status: Int
109
+ """
110
+ Network connection type (w=WiFi, m=mobile)
111
+ """
43
112
  connection_type: String
113
+ """
114
+ What triggered this location report (p=ping, c=circular, t=timer)
115
+ """
44
116
  trigger: String
117
+ """
118
+ UTC timestamp when the device recorded the location
119
+ """
45
120
  timestamp: DateTime!
121
+ """
122
+ UTC timestamp when the record was inserted into the database
123
+ """
46
124
  created_at: String
125
+ """
126
+ Short formatted address from reverse geocoding
127
+ """
128
+ display_address: String
47
129
  }
48
130
 
131
+ """
132
+ Full location detail including the original OwnTracks JSON payload.
133
+ """
49
134
  type LocationDetail {
135
+ """
136
+ Unique location record identifier
137
+ """
50
138
  id: Int!
139
+ """
140
+ OwnTracks device identifier (e.g. iphone_stuart)
141
+ """
51
142
  device_id: String!
143
+ """
144
+ Two-character tracker ID set in the OwnTracks app
145
+ """
52
146
  tid: String
147
+ """
148
+ GPS latitude in decimal degrees (WGS 84)
149
+ """
53
150
  latitude: Float!
151
+ """
152
+ GPS longitude in decimal degrees (WGS 84)
153
+ """
54
154
  longitude: Float!
155
+ """
156
+ Horizontal accuracy of the GPS fix in meters
157
+ """
55
158
  accuracy: Float
159
+ """
160
+ Altitude above sea level in meters
161
+ """
56
162
  altitude: Float
163
+ """
164
+ Device velocity in km/h at time of report
165
+ """
57
166
  velocity: Float
167
+ """
168
+ Device battery level as a percentage (0-100)
169
+ """
58
170
  battery: Int
171
+ """
172
+ Battery charging state (0=unknown, 1=unplugged, 2=charging, 3=full)
173
+ """
59
174
  battery_status: Int
175
+ """
176
+ Network connection type (w=WiFi, m=mobile)
177
+ """
60
178
  connection_type: String
179
+ """
180
+ What triggered this location report (p=ping, c=circular, t=timer)
181
+ """
61
182
  trigger: String
183
+ """
184
+ UTC timestamp when the device recorded the location
185
+ """
62
186
  timestamp: DateTime!
187
+ """
188
+ UTC timestamp when the record was inserted into the database
189
+ """
63
190
  created_at: String
191
+ """
192
+ Original OwnTracks JSON payload as received from the MQTT broker
193
+ """
64
194
  raw_payload: JSON
195
+ """
196
+ Full reverse-geocoded address components from Pelias
197
+ """
198
+ address: GeocodedAddress
65
199
  }
66
200
 
67
201
  scalar JSON
68
202
 
203
+ # -------------------------------------------------------
204
+ # Geocoding
205
+ # -------------------------------------------------------
206
+ """
207
+ Reverse-geocoded address components from Pelias.
208
+ """
209
+ type GeocodedAddress {
210
+ """
211
+ Full formatted address label from Pelias
212
+ """
213
+ display_address: String
214
+ """
215
+ Street name
216
+ """
217
+ street: String
218
+ """
219
+ House or building number
220
+ """
221
+ housenumber: String
222
+ """
223
+ Neighbourhood name
224
+ """
225
+ neighbourhood: String
226
+ """
227
+ City or town
228
+ """
229
+ locality: String
230
+ """
231
+ State or province
232
+ """
233
+ region: String
234
+ """
235
+ Country name
236
+ """
237
+ country: String
238
+ """
239
+ Postal or ZIP code
240
+ """
241
+ postalcode: String
242
+ """
243
+ Pelias confidence score (0-1)
244
+ """
245
+ confidence: Float
246
+ """
247
+ Geocoding status: success, no_coverage, error, pending
248
+ """
249
+ status: String!
250
+ """
251
+ UTC timestamp when geocoding was performed
252
+ """
253
+ geocoded_at: String
254
+ }
255
+
256
+ """
257
+ Coverage statistics for geocoded location records.
258
+ """
259
+ type GeocodingStatus {
260
+ """
261
+ Total number of OwnTracks location records
262
+ """
263
+ total_locations: Int!
264
+ """
265
+ Number of locations with a geocoded address (any status)
266
+ """
267
+ geocoded: Int!
268
+ """
269
+ Number of successfully geocoded locations
270
+ """
271
+ success: Int!
272
+ """
273
+ Number of locations awaiting geocoding
274
+ """
275
+ pending: Int!
276
+ """
277
+ Number of locations outside Pelias coverage area
278
+ """
279
+ no_coverage: Int!
280
+ """
281
+ Number of locations that failed geocoding
282
+ """
283
+ errors: Int!
284
+ """
285
+ Percentage of locations with a geocoded address
286
+ """
287
+ coverage_percent: Float!
288
+ """
289
+ Per-source breakdown of geocoding coverage (owntracks, garmin)
290
+ """
291
+ by_source: GeocodingStatusBySource!
292
+ }
293
+
294
+ """
295
+ Coverage statistics for a single geocoding source (owntracks or garmin).
296
+ """
297
+ type GeocodingSourceStatus {
298
+ """
299
+ Number of successfully geocoded records for this source
300
+ """
301
+ success: Int!
302
+ """
303
+ Number of records awaiting geocoding for this source
304
+ """
305
+ pending: Int!
306
+ """
307
+ Number of records outside Pelias coverage area
308
+ """
309
+ no_coverage: Int!
310
+ """
311
+ Number of records that failed geocoding
312
+ """
313
+ errors: Int!
314
+ """
315
+ Total number of geocoded_addresses rows for this source
316
+ """
317
+ total: Int!
318
+ }
319
+
320
+ """
321
+ Per-source breakdown of geocoding coverage.
322
+ """
323
+ type GeocodingStatusBySource {
324
+ """
325
+ Coverage stats for OwnTracks rows
326
+ """
327
+ owntracks: GeocodingSourceStatus!
328
+ """
329
+ Coverage stats for Garmin rows
330
+ """
331
+ garmin: GeocodingSourceStatus!
332
+ """
333
+ Total number of Garmin activities (denominator for activity-level coverage)
334
+ """
335
+ garmin_activities_total: Int!
336
+ """
337
+ Number of Garmin activities that have at least one address row
338
+ """
339
+ garmin_activities_geocoded: Int!
340
+ """
341
+ Percentage of Garmin activities with at least one geocoded address
342
+ """
343
+ garmin_coverage_percent: Float!
344
+ }
345
+
346
+ """
347
+ Result of triggering a batch geocoding operation.
348
+ """
349
+ type GeocodingTriggerResult {
350
+ """
351
+ Number of records processed in this batch
352
+ """
353
+ processed: Int!
354
+ """
355
+ Number of records still awaiting geocoding
356
+ """
357
+ remaining: Int!
358
+ """
359
+ Number of records skipped via proximity deduplication
360
+ """
361
+ skipped_dedup: Int!
362
+ }
363
+
364
+ """
365
+ Paginated list of OwnTracks location records.
366
+ """
69
367
  type LocationConnection {
368
+ """
369
+ List of location items in the current page
370
+ """
70
371
  items: [Location!]!
372
+ """
373
+ Total number of items matching the query
374
+ """
71
375
  total: Int!
376
+ """
377
+ Maximum number of items per page
378
+ """
72
379
  limit: Int!
380
+ """
381
+ Number of items skipped from the start
382
+ """
73
383
  offset: Int!
74
384
  }
75
385
 
386
+ """
387
+ Distinct OwnTracks device identifier.
388
+ """
76
389
  type DeviceInfo {
390
+ """
391
+ OwnTracks device identifier
392
+ """
77
393
  device_id: String!
78
394
  }
79
395
 
396
+ """
397
+ Aggregate location count with optional filter context.
398
+ """
80
399
  type LocationCount {
400
+ """
401
+ Total number of location records matching the filter
402
+ """
81
403
  count: Int!
404
+ """
405
+ Date filter applied (YYYY-MM-DD), if any
406
+ """
82
407
  date: String
408
+ """
409
+ Device ID filter applied, if any
410
+ """
83
411
  device_id: String
84
412
  }
85
413
 
414
+ """
415
+ Earliest and latest timestamps in the locations table.
416
+ """
417
+ type LocationDateRange {
418
+ """
419
+ Earliest location timestamp (ISO 8601)
420
+ """
421
+ min_date: DateTime!
422
+ """
423
+ Latest location timestamp (ISO 8601)
424
+ """
425
+ max_date: DateTime!
426
+ }
427
+
86
428
  # -------------------------------------------------------
87
429
  # Garmin
88
430
  # -------------------------------------------------------
431
+ """
432
+ Recording device metadata captured from a Garmin activity's FIT file.
433
+ """
434
+ type GarminDevice {
435
+ """
436
+ Recording device serial number
437
+ """
438
+ device_id: Float
439
+ """
440
+ Device manufacturer (e.g. garmin)
441
+ """
442
+ manufacturer: String
443
+ """
444
+ Raw Garmin product enum id from the FIT file (e.g. 4061)
445
+ """
446
+ garmin_product: Int
447
+ """
448
+ Friendly device model name (e.g. Edge 540 Solar)
449
+ """
450
+ model: String
451
+ """
452
+ Device firmware/software version (e.g. 31.30)
453
+ """
454
+ software_version: String
455
+ }
456
+
457
+ """
458
+ Summary of a Garmin Connect activity parsed from a FIT file.
459
+ """
89
460
  type GarminActivity {
461
+ """
462
+ Garmin Connect activity identifier
463
+ """
90
464
  activity_id: String!
465
+ """
466
+ Primary sport type (e.g. cycling, running)
467
+ """
91
468
  sport: String!
469
+ """
470
+ Sub-sport classification (e.g. road, trail)
471
+ """
92
472
  sub_sport: String
473
+ """
474
+ Activity start time in UTC
475
+ """
93
476
  start_time: String
477
+ """
478
+ Activity end time in UTC
479
+ """
94
480
  end_time: String
481
+ """
482
+ Total distance in kilometres
483
+ """
95
484
  distance_km: Float
485
+ """
486
+ Active duration in seconds (excludes pauses)
487
+ """
96
488
  duration_seconds: Float
489
+ """
490
+ Average heart rate in beats per minute
491
+ """
97
492
  avg_heart_rate: Int
493
+ """
494
+ Maximum heart rate in beats per minute
495
+ """
98
496
  max_heart_rate: Int
497
+ """
498
+ Whether this activity has usable heart-rate data in summary or track points
499
+ """
500
+ hr_available: Boolean!
501
+ """
502
+ Minimum heart rate in beats per minute
503
+ """
504
+ min_heart_rate: Int
505
+ """
506
+ Aerobic training effect score
507
+ """
508
+ aerobic_training_effect: Float
509
+ """
510
+ Anaerobic training effect score
511
+ """
512
+ anaerobic_training_effect: Float
513
+ """
514
+ Exercise load score
515
+ """
516
+ exercise_load: Int
517
+ """
518
+ Average respiration rate in breaths per minute
519
+ """
520
+ avg_respiration_rate: Int
521
+ """
522
+ Minimum respiration rate in breaths per minute
523
+ """
524
+ min_respiration_rate: Int
525
+ """
526
+ Maximum respiration rate in breaths per minute
527
+ """
528
+ max_respiration_rate: Int
529
+ """
530
+ Estimated sweat loss in millilitres
531
+ """
532
+ sweat_loss_ml: Int
533
+ """
534
+ Moderate intensity minutes
535
+ """
536
+ moderate_intensity_minutes: Int
537
+ """
538
+ Vigorous intensity minutes
539
+ """
540
+ vigorous_intensity_minutes: Int
541
+ """
542
+ Total intensity minutes
543
+ """
544
+ total_intensity_minutes: Int
545
+ """
546
+ Distance over paved surfaces in kilometres
547
+ """
548
+ paved_distance_km: Float
549
+ """
550
+ Distance over unpaved surfaces in kilometres
551
+ """
552
+ unpaved_distance_km: Float
553
+ """
554
+ Average cadence in RPM
555
+ """
99
556
  avg_cadence: Int
557
+ """
558
+ Maximum cadence in RPM
559
+ """
100
560
  max_cadence: Int
561
+ """
562
+ Total activity strokes
563
+ """
564
+ total_strokes: Int
565
+ """
566
+ Total calories burned
567
+ """
101
568
  calories: Int
569
+ """
570
+ Average speed in km/h
571
+ """
102
572
  avg_speed_kmh: Float
573
+ """
574
+ Maximum speed in km/h
575
+ """
103
576
  max_speed_kmh: Float
577
+ """
578
+ Total elevation gain in meters
579
+ """
104
580
  total_ascent_m: Float
581
+ """
582
+ Total elevation loss in meters
583
+ """
105
584
  total_descent_m: Float
585
+ """
586
+ Raw total distance in meters from FIT file
587
+ """
106
588
  total_distance: Float
589
+ """
590
+ Average pace in minutes per kilometre
591
+ """
107
592
  avg_pace: Float
593
+ """
594
+ Device manufacturer (e.g. garmin)
595
+ """
108
596
  device_manufacturer: String
597
+ """
598
+ Recording device metadata (manufacturer, model, firmware)
599
+ """
600
+ device: GarminDevice
601
+ """
602
+ Average ambient temperature in degrees C
603
+ """
109
604
  avg_temperature_c: Int
605
+ """
606
+ Minimum ambient temperature in degrees C
607
+ """
110
608
  min_temperature_c: Int
609
+ """
610
+ Maximum ambient temperature in degrees C
611
+ """
111
612
  max_temperature_c: Int
613
+ """
614
+ Total elapsed time in seconds (includes pauses)
615
+ """
112
616
  total_elapsed_time: Float
617
+ """
618
+ Total timer time in seconds (active recording)
619
+ """
113
620
  total_timer_time: Float
621
+ """
622
+ UTC timestamp when the record was inserted
623
+ """
114
624
  created_at: String
625
+ """
626
+ UTC timestamp when the FIT file was uploaded
627
+ """
115
628
  uploaded_at: String
629
+ """
630
+ Number of GPS track points in this activity
631
+ """
116
632
  track_point_count: Int
117
633
  }
118
634
 
635
+ """
636
+ Paginated list of Garmin activities.
637
+ """
119
638
  type GarminActivityConnection {
639
+ """
640
+ List of Garmin activity items in the current page
641
+ """
120
642
  items: [GarminActivity!]!
643
+ """
644
+ Total number of items matching the query
645
+ """
121
646
  total: Int!
647
+ """
648
+ Maximum number of items per page
649
+ """
122
650
  limit: Int!
651
+ """
652
+ Number of items skipped from the start
653
+ """
123
654
  offset: Int!
124
655
  }
125
656
 
657
+ """
658
+ Earliest and latest timestamps in the Garmin activities table.
659
+ """
660
+ type GarminDateRange {
661
+ """
662
+ Earliest Garmin activity timestamp (ISO 8601)
663
+ """
664
+ min_date: DateTime!
665
+ """
666
+ Latest Garmin activity timestamp (ISO 8601)
667
+ """
668
+ max_date: DateTime!
669
+ }
670
+
671
+ """
672
+ Individual GPS track point within a Garmin activity.
673
+ """
126
674
  type GarminTrackPoint {
675
+ """
676
+ Unique track point record identifier
677
+ """
127
678
  id: Int!
679
+ """
680
+ Parent Garmin activity identifier
681
+ """
128
682
  activity_id: String!
683
+ """
684
+ GPS latitude in decimal degrees (WGS 84)
685
+ """
129
686
  latitude: Float!
687
+ """
688
+ GPS longitude in decimal degrees (WGS 84)
689
+ """
130
690
  longitude: Float!
691
+ """
692
+ UTC timestamp of the track point recording
693
+ """
131
694
  timestamp: DateTime!
695
+ """
696
+ Elevation above sea level in meters
697
+ """
132
698
  altitude: Float
699
+ """
700
+ Cumulative distance from activity start in km
701
+ """
133
702
  distance_from_start_km: Float
703
+ """
704
+ Instantaneous speed in km/h
705
+ """
134
706
  speed_kmh: Float
707
+ """
708
+ Heart rate in beats per minute
709
+ """
135
710
  heart_rate: Int
711
+ """
712
+ Heart-rate zone index (1-5)
713
+ """
714
+ hr_zone: Int
715
+ """
716
+ Respiration rate in breaths per minute
717
+ """
718
+ respiration_rate: Int
719
+ """
720
+ Pedal/step cadence in RPM
721
+ """
136
722
  cadence: Int
723
+ """
724
+ Ambient temperature in degrees C
725
+ """
137
726
  temperature_c: Float
727
+ """
728
+ Road or terrain type
729
+ """
730
+ surface_type: String
731
+ """
732
+ Effort classification label
733
+ """
734
+ effort_level: String
735
+ """
736
+ UTC timestamp when the record was inserted
737
+ """
138
738
  created_at: String
739
+ """
740
+ Compact reverse-geocoded address summary, when geocoded
741
+ """
742
+ address: GeocodedAddressSummary
139
743
  }
140
744
 
745
+ """
746
+ Compact reverse-geocoded address summary embedded in track-point payloads.
747
+ """
748
+ type GeocodedAddressSummary {
749
+ """
750
+ Full formatted address label from Pelias
751
+ """
752
+ display_address: String
753
+ """
754
+ Street name
755
+ """
756
+ street: String
757
+ """
758
+ House or building number
759
+ """
760
+ housenumber: String
761
+ """
762
+ Neighbourhood name
763
+ """
764
+ neighbourhood: String
765
+ """
766
+ City or town
767
+ """
768
+ locality: String
769
+ """
770
+ State or province
771
+ """
772
+ region: String
773
+ """
774
+ Country name
775
+ """
776
+ country: String
777
+ """
778
+ Postal or ZIP code
779
+ """
780
+ postalcode: String
781
+ """
782
+ Pelias confidence score (0-1)
783
+ """
784
+ confidence: Float
785
+ """
786
+ Role of this waypoint within a Garmin activity (start, end, waypoint). Null for OwnTracks records.
787
+ """
788
+ waypoint_kind: String
789
+ """
790
+ Geocoding status: success, no_coverage, error, pending
791
+ """
792
+ status: String!
793
+ """
794
+ UTC timestamp when geocoding was performed
795
+ """
796
+ geocoded_at: String
797
+ }
798
+
799
+ """
800
+ Full reverse-geocoded address attached to a Garmin activity waypoint.
801
+ """
802
+ type GarminActivityAddress {
803
+ """
804
+ garmin_track_points.id this address was geocoded from
805
+ """
806
+ track_point_id: Int!
807
+ """
808
+ Parent Garmin activity identifier
809
+ """
810
+ activity_id: String!
811
+ """
812
+ Role of this waypoint within the activity: start, end, or waypoint
813
+ """
814
+ waypoint_kind: String!
815
+ """
816
+ UTC timestamp of the track point this address was derived from
817
+ """
818
+ timestamp: DateTime!
819
+ """
820
+ GPS latitude in decimal degrees (WGS 84)
821
+ """
822
+ latitude: Float!
823
+ """
824
+ GPS longitude in decimal degrees (WGS 84)
825
+ """
826
+ longitude: Float!
827
+ """
828
+ Full formatted address label from Pelias
829
+ """
830
+ display_address: String
831
+ """
832
+ Street name
833
+ """
834
+ street: String
835
+ """
836
+ House or building number
837
+ """
838
+ housenumber: String
839
+ """
840
+ Neighbourhood name
841
+ """
842
+ neighbourhood: String
843
+ """
844
+ City or town
845
+ """
846
+ locality: String
847
+ """
848
+ State or province
849
+ """
850
+ region: String
851
+ """
852
+ Country name
853
+ """
854
+ country: String
855
+ """
856
+ Postal or ZIP code
857
+ """
858
+ postalcode: String
859
+ """
860
+ Pelias confidence score (0-1)
861
+ """
862
+ confidence: Float
863
+ """
864
+ Geocoding status: success, no_coverage, error, pending
865
+ """
866
+ status: String!
867
+ """
868
+ UTC timestamp when geocoding was performed
869
+ """
870
+ geocoded_at: String
871
+ }
872
+
873
+ """
874
+ Paginated list of Garmin track points.
875
+ """
141
876
  type GarminTrackPointConnection {
877
+ """
878
+ List of track point items in the current page
879
+ """
142
880
  items: [GarminTrackPoint!]!
881
+ """
882
+ Total number of items matching the query
883
+ """
143
884
  total: Int!
885
+ """
886
+ Maximum number of items per page
887
+ """
144
888
  limit: Int!
889
+ """
890
+ Number of items skipped from the start
891
+ """
145
892
  offset: Int!
146
893
  }
147
894
 
895
+ """
896
+ Sport type with its activity count.
897
+ """
148
898
  type SportInfo {
899
+ """
900
+ Sport type name (e.g. cycling, running)
901
+ """
149
902
  sport: String!
903
+ """
904
+ Number of activities for this sport
905
+ """
906
+ activity_count: Int!
907
+ }
908
+
909
+ """
910
+ Lightweight track point optimised for time-series chart rendering.
911
+ """
912
+ type GarminChartPoint {
913
+ """
914
+ UTC timestamp of the data point
915
+ """
916
+ timestamp: DateTime!
917
+ """
918
+ Elevation above sea level in meters
919
+ """
920
+ altitude: Float
921
+ """
922
+ Cumulative distance from activity start in km
923
+ """
924
+ distance_from_start_km: Float
925
+ """
926
+ Instantaneous speed in km/h
927
+ """
928
+ speed_kmh: Float
929
+ """
930
+ Heart rate in beats per minute
931
+ """
932
+ heart_rate: Int
933
+ """
934
+ Heart-rate zone index (1-5)
935
+ """
936
+ hr_zone: Int
937
+ """
938
+ Respiration rate in breaths per minute
939
+ """
940
+ respiration_rate: Int
941
+ """
942
+ Pedal/step cadence in RPM
943
+ """
944
+ cadence: Int
945
+ """
946
+ Ambient temperature in degrees C
947
+ """
948
+ temperature_c: Float
949
+ """
950
+ GPS latitude in decimal degrees (WGS 84)
951
+ """
952
+ latitude: Float!
953
+ """
954
+ GPS longitude in decimal degrees (WGS 84)
955
+ """
956
+ longitude: Float!
957
+ }
958
+
959
+ """
960
+ Aggregated Garmin activity totals for a single time bucket (week, month, or year).
961
+ """
962
+ type GarminActivityTotal {
963
+ """
964
+ Start date of the period bucket (DATE_TRUNC of week/month/year)
965
+ """
966
+ period_start: String!
967
+ """
968
+ Number of activities in the period
969
+ """
150
970
  activity_count: Int!
971
+ """
972
+ Sum of distance in kilometres
973
+ """
974
+ total_distance_km: Float
975
+ """
976
+ Sum of active duration in seconds (excludes pauses)
977
+ """
978
+ total_duration_seconds: Int
979
+ """
980
+ Sum of elevation gain in meters
981
+ """
982
+ total_ascent_m: Int
983
+ """
984
+ Sum of calories burned
985
+ """
986
+ total_calories: Int
151
987
  }
152
988
 
153
989
  # -------------------------------------------------------
154
990
  # Unified GPS
155
991
  # -------------------------------------------------------
992
+ """
993
+ Single GPS data point from the unified view combining OwnTracks and Garmin sources.
994
+ """
156
995
  type UnifiedGpsPoint {
996
+ """
997
+ Data source: 'owntracks' or 'garmin'
998
+ """
157
999
  source: String!
1000
+ """
1001
+ Device or activity identifier from the source
1002
+ """
158
1003
  identifier: String!
1004
+ """
1005
+ GPS latitude in decimal degrees (WGS 84)
1006
+ """
159
1007
  latitude: Float!
1008
+ """
1009
+ GPS longitude in decimal degrees (WGS 84)
1010
+ """
160
1011
  longitude: Float!
1012
+ """
1013
+ UTC timestamp of the GPS recording
1014
+ """
161
1015
  timestamp: DateTime!
1016
+ """
1017
+ Horizontal GPS accuracy in meters (OwnTracks only)
1018
+ """
162
1019
  accuracy: Float
1020
+ """
1021
+ Device battery percentage (OwnTracks only)
1022
+ """
163
1023
  battery: Int
1024
+ """
1025
+ Instantaneous speed in km/h (Garmin only)
1026
+ """
164
1027
  speed_kmh: Float
1028
+ """
1029
+ Heart rate in BPM (Garmin only)
1030
+ """
165
1031
  heart_rate: Int
1032
+ """
1033
+ UTC timestamp when the record was inserted
1034
+ """
166
1035
  created_at: String
167
1036
  }
168
1037
 
1038
+ """
1039
+ Paginated list of unified GPS data points.
1040
+ """
169
1041
  type UnifiedGpsConnection {
1042
+ """
1043
+ List of unified GPS items in the current page
1044
+ """
170
1045
  items: [UnifiedGpsPoint!]!
1046
+ """
1047
+ Total number of items matching the query
1048
+ """
171
1049
  total: Int!
1050
+ """
1051
+ Maximum number of items per page
1052
+ """
172
1053
  limit: Int!
1054
+ """
1055
+ Number of items skipped from the start
1056
+ """
173
1057
  offset: Int!
174
1058
  }
175
1059
 
1060
+ """
1061
+ Per-day aggregate combining OwnTracks location stats and Garmin activity metrics.
1062
+ """
176
1063
  type DailyActivitySummary {
1064
+ """
1065
+ Calendar date in YYYY-MM-DD format
1066
+ """
177
1067
  activity_date: String
1068
+ """
1069
+ OwnTracks device that reported data for this day
1070
+ """
178
1071
  owntracks_device: String
1072
+ """
1073
+ Number of OwnTracks GPS points recorded
1074
+ """
179
1075
  owntracks_points: Int
1076
+ """
1077
+ Lowest device battery percentage observed
1078
+ """
180
1079
  min_battery: Int
1080
+ """
1081
+ Highest device battery percentage observed
1082
+ """
181
1083
  max_battery: Int
1084
+ """
1085
+ Mean horizontal GPS accuracy in meters
1086
+ """
182
1087
  avg_accuracy: Float
1088
+ """
1089
+ Garmin sport type for activities on this day
1090
+ """
183
1091
  garmin_sport: String
1092
+ """
1093
+ Number of Garmin activities recorded
1094
+ """
184
1095
  garmin_activities: Int
1096
+ """
1097
+ Combined Garmin activity distance in km
1098
+ """
185
1099
  total_distance_km: Float
1100
+ """
1101
+ Combined Garmin activity duration in seconds
1102
+ """
186
1103
  total_duration_seconds: Float
1104
+ """
1105
+ Mean heart rate across Garmin activities in BPM
1106
+ """
187
1107
  avg_heart_rate: Int
1108
+ """
1109
+ Total calories burned across Garmin activities
1110
+ """
188
1111
  total_calories: Int
189
1112
  }
190
1113
 
1114
+ """
1115
+ Paginated list of daily activity summaries.
1116
+ """
1117
+ type DailySummaryConnection {
1118
+ """
1119
+ List of daily activity summary items in the current page
1120
+ """
1121
+ items: [DailyActivitySummary!]!
1122
+ """
1123
+ Total number of items matching the query
1124
+ """
1125
+ total: Int!
1126
+ """
1127
+ Maximum number of items per page
1128
+ """
1129
+ limit: Int!
1130
+ """
1131
+ Number of items skipped from the start
1132
+ """
1133
+ offset: Int!
1134
+ }
1135
+
1136
+ """
1137
+ Earliest and latest activity dates available in the daily activity summary view.
1138
+ """
1139
+ type DailySummaryDateRange {
1140
+ """
1141
+ Earliest activity date with daily summary data (YYYY-MM-DD)
1142
+ """
1143
+ min_date: String!
1144
+ """
1145
+ Latest activity date with daily summary data (YYYY-MM-DD)
1146
+ """
1147
+ max_date: String!
1148
+ }
1149
+
191
1150
  # -------------------------------------------------------
192
1151
  # Reference Locations
193
1152
  # -------------------------------------------------------
1153
+ """
1154
+ Named geographic reference point used for spatial queries (e.g. home, office).
1155
+ """
194
1156
  type ReferenceLocation {
1157
+ """
1158
+ Unique reference location identifier
1159
+ """
195
1160
  id: Int!
1161
+ """
1162
+ Short, unique name for the location (e.g. home, office)
1163
+ """
196
1164
  name: String!
1165
+ """
1166
+ GPS latitude in decimal degrees (WGS 84)
1167
+ """
197
1168
  latitude: Float!
1169
+ """
1170
+ GPS longitude in decimal degrees (WGS 84)
1171
+ """
198
1172
  longitude: Float!
1173
+ """
1174
+ Geofence radius in meters for proximity queries
1175
+ """
199
1176
  radius_meters: Float!
1177
+ """
1178
+ Optional human-readable description of the location
1179
+ """
200
1180
  description: String
1181
+ """
1182
+ UTC timestamp when the record was created
1183
+ """
201
1184
  created_at: String
1185
+ """
1186
+ UTC timestamp when the record was last updated
1187
+ """
202
1188
  updated_at: String
203
1189
  }
204
1190
 
205
1191
  # -------------------------------------------------------
206
1192
  # Spatial
207
1193
  # -------------------------------------------------------
1194
+ """
1195
+ GPS point found within a spatial proximity search.
1196
+ """
208
1197
  type NearbyPoint {
1198
+ """
1199
+ Data source: 'owntracks' or 'garmin'
1200
+ """
209
1201
  source: String!
1202
+ """
1203
+ Record identifier in the source table
1204
+ """
210
1205
  id: Int!
1206
+ """
1207
+ GPS latitude in decimal degrees (WGS 84)
1208
+ """
211
1209
  latitude: Float!
1210
+ """
1211
+ GPS longitude in decimal degrees (WGS 84)
1212
+ """
212
1213
  longitude: Float!
1214
+ """
1215
+ Distance from the search center point in meters
1216
+ """
213
1217
  distance_meters: Float!
1218
+ """
1219
+ UTC timestamp of the GPS recording
1220
+ """
214
1221
  timestamp: DateTime!
215
1222
  }
216
1223
 
1224
+ """
1225
+ Geodesic distance calculation result between two geographic points.
1226
+ """
217
1227
  type DistanceResult {
1228
+ """
1229
+ Geodesic distance between the two points in meters
1230
+ """
218
1231
  distance_meters: Float!
1232
+ """
1233
+ Origin latitude in decimal degrees
1234
+ """
219
1235
  from_lat: Float!
1236
+ """
1237
+ Origin longitude in decimal degrees
1238
+ """
220
1239
  from_lon: Float!
1240
+ """
1241
+ Destination latitude in decimal degrees
1242
+ """
221
1243
  to_lat: Float!
1244
+ """
1245
+ Destination longitude in decimal degrees
1246
+ """
222
1247
  to_lon: Float!
223
1248
  }
224
1249
 
1250
+ """
1251
+ GPS points found within a named reference location's geofence radius.
1252
+ """
225
1253
  type WithinReferenceResult {
1254
+ """
1255
+ Name of the reference location searched
1256
+ """
226
1257
  reference_name: String!
1258
+ """
1259
+ Geofence radius used for the search in meters
1260
+ """
227
1261
  radius_meters: Float!
1262
+ """
1263
+ Number of GPS points found within the radius
1264
+ """
228
1265
  total_points: Int!
1266
+ """
1267
+ GPS points within the radius, sorted by distance
1268
+ """
229
1269
  points: [NearbyPoint!]!
230
1270
  }
231
1271
 
1272
+ """
1273
+ Result payload returned when triggering an on-demand Garmin sync.
1274
+ """
1275
+ type GarminSyncTriggerResult {
1276
+ """
1277
+ Sync trigger status (e.g. accepted, conflict, bad_request, error)
1278
+ """
1279
+ status: String!
1280
+ """
1281
+ Human-readable status message from upstream sync service
1282
+ """
1283
+ message: String!
1284
+ """
1285
+ True when a new sync run was accepted and triggered
1286
+ """
1287
+ accepted: Boolean!
1288
+ """
1289
+ UTC timestamp when sync was triggered
1290
+ """
1291
+ triggered_at: String
1292
+ """
1293
+ UTC timestamp when an already-running sync started
1294
+ """
1295
+ started_at: String
1296
+ """
1297
+ Effective sync window in hours
1298
+ """
1299
+ window_hours: Int
1300
+ """
1301
+ Window start timestamp computed by upstream service, when available
1302
+ """
1303
+ window_start: String
1304
+ """
1305
+ Effective lookback value, when provided
1306
+ """
1307
+ lookback: Int
1308
+ }
1309
+
232
1310
  # -------------------------------------------------------
233
1311
  # Enums
234
1312
  # -------------------------------------------------------
1313
+ """
1314
+ Sort direction for query results.
1315
+ """
235
1316
  enum SortOrder {
1317
+ """
1318
+ Ascending order (oldest first, A-Z)
1319
+ """
236
1320
  asc
1321
+ """
1322
+ Descending order (newest first, Z-A)
1323
+ """
237
1324
  desc
238
1325
  }
239
1326
 
@@ -242,89 +1329,395 @@ enum SortOrder {
242
1329
  # -------------------------------------------------------
243
1330
  type Query {
244
1331
  # Health
1332
+ """
1333
+ Get service health status.
1334
+ """
245
1335
  health: HealthStatus!
1336
+ """
1337
+ Get service readiness status including database connectivity.
1338
+ """
246
1339
  ready: ReadyStatus!
247
1340
 
248
1341
  # Locations
1342
+ """
1343
+ Retrieve a paginated list of OwnTracks location records.
1344
+ """
249
1345
  locations(
1346
+ """
1347
+ Filter by OwnTracks device identifier
1348
+ """
250
1349
  device_id: String
1350
+ """
1351
+ Start date filter (YYYY-MM-DD or ISO 8601)
1352
+ """
251
1353
  date_from: String
1354
+ """
1355
+ End date filter (YYYY-MM-DD or ISO 8601)
1356
+ """
252
1357
  date_to: String
1358
+ """
1359
+ Maximum number of items to return per page
1360
+ """
253
1361
  limit: Int
1362
+ """
1363
+ Number of items to skip for pagination
1364
+ """
254
1365
  offset: Int
1366
+ """
1367
+ Field name to sort by
1368
+ """
255
1369
  sort: String
1370
+ """
1371
+ Sort direction
1372
+ """
256
1373
  order: SortOrder
257
1374
  ): LocationConnection!
258
1375
 
259
- location(id: Int!): LocationDetail
1376
+ """
1377
+ Retrieve a single location by its ID, including raw payload.
1378
+ """
1379
+ location(
1380
+ """
1381
+ Unique location record identifier
1382
+ """
1383
+ id: Int!
1384
+ ): LocationDetail
260
1385
 
1386
+ """
1387
+ List all distinct OwnTracks device identifiers.
1388
+ """
261
1389
  devices: [DeviceInfo!]!
262
1390
 
263
- locationCount(date: String, device_id: String): LocationCount!
1391
+ """
1392
+ Get aggregate count of location records with optional filters.
1393
+ """
1394
+ locationCount(
1395
+ """
1396
+ Filter by date (YYYY-MM-DD)
1397
+ """
1398
+ date: String
1399
+ """
1400
+ Filter by device identifier
1401
+ """
1402
+ device_id: String
1403
+ ): LocationCount!
1404
+
1405
+ """
1406
+ Get the earliest and latest location timestamps.
1407
+ """
1408
+ locationDateRange: LocationDateRange!
264
1409
 
265
1410
  # Garmin
1411
+ """
1412
+ Get the earliest and latest Garmin activity timestamps.
1413
+ """
1414
+ garminDateRange: GarminDateRange!
1415
+
1416
+ """
1417
+ Retrieve a paginated list of Garmin activities.
1418
+ """
266
1419
  garminActivities(
1420
+ """
1421
+ Filter by sport type (e.g. cycling, running)
1422
+ """
267
1423
  sport: String
1424
+ """
1425
+ Start date filter (YYYY-MM-DD or ISO 8601)
1426
+ """
268
1427
  date_from: String
1428
+ """
1429
+ End date filter (YYYY-MM-DD or ISO 8601)
1430
+ """
269
1431
  date_to: String
1432
+ """
1433
+ Maximum number of items to return per page
1434
+ """
270
1435
  limit: Int
1436
+ """
1437
+ Number of items to skip for pagination
1438
+ """
271
1439
  offset: Int
1440
+ """
1441
+ Field name to sort by
1442
+ """
272
1443
  sort: String
1444
+ """
1445
+ Sort direction
1446
+ """
273
1447
  order: SortOrder
274
1448
  ): GarminActivityConnection!
275
1449
 
276
- garminActivity(activity_id: String!): GarminActivity
1450
+ """
1451
+ Retrieve a single Garmin activity by its ID.
1452
+ """
1453
+ garminActivity(
1454
+ """
1455
+ Garmin Connect activity identifier
1456
+ """
1457
+ activity_id: String!
1458
+ ): GarminActivity
277
1459
 
1460
+ """
1461
+ Retrieve paginated GPS track points for a Garmin activity.
1462
+ """
278
1463
  garminTrackPoints(
1464
+ """
1465
+ Garmin Connect activity identifier
1466
+ """
279
1467
  activity_id: String!
1468
+ """
1469
+ Maximum number of items to return per page
1470
+ """
280
1471
  limit: Int
1472
+ """
1473
+ Number of items to skip for pagination
1474
+ """
281
1475
  offset: Int
1476
+ """
1477
+ Field name to sort by
1478
+ """
282
1479
  sort: String
1480
+ """
1481
+ Sort direction
1482
+ """
283
1483
  order: SortOrder
1484
+ """
1485
+ Simplification tolerance for track point reduction
1486
+ """
284
1487
  simplify: Float
285
1488
  ): GarminTrackPointConnection!
286
1489
 
1490
+ """
1491
+ List all distinct sport types with activity counts.
1492
+ """
287
1493
  garminSports: [SportInfo!]!
288
1494
 
1495
+ """
1496
+ Retrieve chart-optimised track points for a Garmin activity.
1497
+ """
1498
+ garminChartData(
1499
+ """
1500
+ Garmin Connect activity identifier
1501
+ """
1502
+ activity_id: String!
1503
+ ): [GarminChartPoint!]!
1504
+
1505
+ """
1506
+ Retrieve all reverse-geocoded addresses for a Garmin activity (start, mid-route waypoints, and end).
1507
+ """
1508
+ garminActivityAddresses(
1509
+ """
1510
+ Garmin Connect activity identifier
1511
+ """
1512
+ activity_id: String!
1513
+ ): [GarminActivityAddress!]!
1514
+
1515
+ """
1516
+ Aggregate Garmin activity totals grouped by week, month, or year.
1517
+ """
1518
+ garminActivityTotals(
1519
+ """
1520
+ Aggregation period: 'week', 'month', or 'year'
1521
+ """
1522
+ period: String!
1523
+ """
1524
+ Filter by sport (e.g. cycling, running)
1525
+ """
1526
+ sport: String
1527
+ """
1528
+ Inclusive lower bound on activity start time (YYYY-MM-DD)
1529
+ """
1530
+ date_from: String
1531
+ """
1532
+ Inclusive upper bound on activity start time (YYYY-MM-DD)
1533
+ """
1534
+ date_to: String
1535
+ ): [GarminActivityTotal!]!
1536
+
289
1537
  # Unified GPS
1538
+ """
1539
+ Retrieve a paginated list of unified GPS points from all sources.
1540
+ """
290
1541
  unifiedGps(
1542
+ """
1543
+ Filter by data source: 'owntracks' or 'garmin'
1544
+ """
291
1545
  source: String
1546
+ """
1547
+ Start date filter (YYYY-MM-DD or ISO 8601)
1548
+ """
292
1549
  date_from: String
1550
+ """
1551
+ End date filter (YYYY-MM-DD or ISO 8601)
1552
+ """
293
1553
  date_to: String
1554
+ """
1555
+ Maximum number of items to return per page
1556
+ """
294
1557
  limit: Int
1558
+ """
1559
+ Number of items to skip for pagination
1560
+ """
295
1561
  offset: Int
1562
+ """
1563
+ Sort direction
1564
+ """
296
1565
  order: SortOrder
1566
+ """
1567
+ Exclude stationary points where speed is zero
1568
+ """
1569
+ exclude_stationary: Boolean
1570
+ """
1571
+ Remove points with duplicate coordinates (rounded to ~11m precision)
1572
+ """
1573
+ deduplicate: Boolean
297
1574
  ): UnifiedGpsConnection!
298
1575
 
1576
+ """
1577
+ Retrieve daily activity summaries combining OwnTracks and Garmin data.
1578
+ """
299
1579
  dailySummary(
1580
+ """
1581
+ Start date filter (YYYY-MM-DD or ISO 8601)
1582
+ """
300
1583
  date_from: String
1584
+ """
1585
+ End date filter (YYYY-MM-DD or ISO 8601)
1586
+ """
301
1587
  date_to: String
1588
+ """
1589
+ Maximum number of days to return per page
1590
+ """
302
1591
  limit: Int
303
- ): [DailyActivitySummary!]!
1592
+ """
1593
+ Number of items to skip for pagination
1594
+ """
1595
+ offset: Int
1596
+ ): DailySummaryConnection!
1597
+
1598
+ """
1599
+ Get the earliest and latest activity dates available in the daily activity summary view.
1600
+ """
1601
+ dailySummaryDateRange: DailySummaryDateRange!
304
1602
 
305
1603
  # Reference Locations
1604
+ """
1605
+ List all named reference locations.
1606
+ """
306
1607
  referenceLocations: [ReferenceLocation!]!
307
- referenceLocation(id: Int!): ReferenceLocation
1608
+ """
1609
+ Retrieve a single reference location by its ID.
1610
+ """
1611
+ referenceLocation(
1612
+ """
1613
+ Unique reference location identifier
1614
+ """
1615
+ id: Int!
1616
+ ): ReferenceLocation
308
1617
 
309
1618
  # Spatial
1619
+ """
1620
+ Find GPS points within a radius of a geographic coordinate.
1621
+ """
310
1622
  nearbyPoints(
1623
+ """
1624
+ Center point latitude in decimal degrees
1625
+ """
311
1626
  lat: Float!
1627
+ """
1628
+ Center point longitude in decimal degrees
1629
+ """
312
1630
  lon: Float!
1631
+ """
1632
+ Search radius in meters
1633
+ """
313
1634
  radius_meters: Float
1635
+ """
1636
+ Filter by data source: 'owntracks' or 'garmin'
1637
+ """
314
1638
  source: String
1639
+ """
1640
+ Maximum number of points to return
1641
+ """
315
1642
  limit: Int
316
1643
  ): [NearbyPoint!]!
317
1644
 
1645
+ """
1646
+ Calculate the geodesic distance between two geographic points.
1647
+ """
318
1648
  calculateDistance(
1649
+ """
1650
+ Origin latitude in decimal degrees
1651
+ """
319
1652
  from_lat: Float!
1653
+ """
1654
+ Origin longitude in decimal degrees
1655
+ """
320
1656
  from_lon: Float!
1657
+ """
1658
+ Destination latitude in decimal degrees
1659
+ """
321
1660
  to_lat: Float!
1661
+ """
1662
+ Destination longitude in decimal degrees
1663
+ """
322
1664
  to_lon: Float!
323
1665
  ): DistanceResult!
324
1666
 
1667
+ """
1668
+ Find GPS points within a named reference location's geofence.
1669
+ """
325
1670
  withinReference(
1671
+ """
1672
+ Name of the reference location to search within
1673
+ """
326
1674
  name: String!
1675
+ """
1676
+ Filter by data source: 'owntracks' or 'garmin'
1677
+ """
327
1678
  source: String
1679
+ """
1680
+ Maximum number of points to return
1681
+ """
328
1682
  limit: Int
329
1683
  ): WithinReferenceResult!
1684
+
1685
+ # Geocoding
1686
+ """
1687
+ Get geocoding coverage statistics.
1688
+ """
1689
+ geocodingStatus: GeocodingStatus!
1690
+ }
1691
+
1692
+ # -------------------------------------------------------
1693
+ # Mutations
1694
+ # -------------------------------------------------------
1695
+ type Mutation {
1696
+ """
1697
+ Trigger an on-demand Garmin sync in the upstream API.
1698
+ """
1699
+ triggerGarminSync(
1700
+ """
1701
+ Optional sync window in hours. Preferred over lookback.
1702
+ """
1703
+ window_hours: Int
1704
+ """
1705
+ Optional legacy lookback value.
1706
+ """
1707
+ lookback: Int
1708
+ ): GarminSyncTriggerResult!
1709
+
1710
+ """
1711
+ Trigger batch reverse-geocoding of un-geocoded location records.
1712
+ """
1713
+ triggerGeocoding(
1714
+ """
1715
+ Number of locations to geocode in this batch (default 100)
1716
+ """
1717
+ batch_size: Int
1718
+ """
1719
+ Re-process previously failed location records (for example, those with status `no_coverage`)
1720
+ """
1721
+ retry_failed: Boolean
1722
+ ): GeocodingTriggerResult!
330
1723
  }