Commit Graph
28 Commits
Author SHA1 Message Date
Andy Low 69b620dd2f Harden MongoDB driver compatibility 2026-04-19 23:24:22 +01:00
Ben WestandCopilot 246e46adb3 fix: legacy UUID treatments findable via $or fallback (#6923)
updateIdQuery() and upsertQueryFor() now use
  {$or: [{identifier: UUID}, {_id: UUID}]}
instead of only {identifier: UUID}. This matches both:
- New documents (UUID in identifier field, ObjectId in _id)
- Legacy documents (UUID directly in _id, no identifier field)

Gated behind env.uuidHandling (UUID_HANDLING env var, default true).

All 30 treatment tests pass:
- 3 legacy UUID tests (issue-6923): DELETE, PUT, GET all work
- 12 gap-treat-012 tests: new data paths unaffected
- 15 uuid-handling tests: edge cases, UUID_HANDLING=false still works

Fixes #6923 (unable to edit/save/delete overrides for legacy data)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-25 15:20:51 -07:00
copilot-swe-agent[bot]andbewest 002f34fcda fix: gate UUID write-path normalization on UUID_HANDLING flag and fix docs accuracy
Co-authored-by: bewest <394179+bewest@users.noreply.github.com>
2026-03-17 23:44:47 +00:00
Ben WestandCopilot 095c9d0454 fix: remove scope creep from UUID handling (syncIdentifier/uuid dedup)
UUID_HANDLING should ONLY affect UUID values in the _id field.
Previous commit incorrectly added server-side dedup for syncIdentifier
and uuid fields, which was never part of the original behavior.

Changes:
- upsertQueryFor(): Remove syncIdentifier/uuid as dedup keys
- Batch POST: Only fetch existing IDs by identifier, not by
  syncIdentifier/uuid
- tests: Update TEST-CACHE-003/004 to document actual behavior
  (duplicates occur without ObjectIdCache - this is by design)
- docs: Correct treatments-schema.md (syncIdentifier/uuid preserved,
  not copied to identifier)
- docs: Remove external link from entries-schema.md

Loop carbs/doses rely on ObjectIdCache for dedup, not server-side logic.
This matches the original (pre-change) server behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-17 16:00:03 -07:00
Ben WestandCopilot 8fc155aa48 fix(treatments): correct UUID handling scope (only _id field)
REQ-SYNC-072 scope correction: normalizeTreatmentId() should ONLY
handle UUID values in the _id field, not copy syncIdentifier or uuid
fields to identifier.

Changes:
- normalizeTreatmentId(): Only extract UUID from _id to identifier
- normalizeEntryId(): Same fix for entries collection
- upsertQueryFor(): Add syncIdentifier and uuid as dedup fallbacks
  (fields are preserved, not copied to identifier)
- Batch POST: Fetch _id for docs deduped by syncIdentifier/uuid

Test updates:
- TEST-ID-003, TEST-V1-ID-004: Updated to expect identifier NOT copied
  from syncIdentifier (scope fix)

Affected clients:
- Loop overrides (UUID _id → identifier): Still works
- Loop carbs/doses (syncIdentifier): Dedup works, no identifier copy
- xDrip+ (uuid): Dedup works, no identifier copy
- AAPS (identifier): Unchanged

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-17 15:21:25 -07:00
Ben WestandCopilot bf6cfb7730 feat: add UUID_HANDLING feature flag for GET/DELETE by identifier
- env.js: Add UUID_HANDLING env var (default: false)
- query.js: Add UUID detection in normalizeIdValue()
  - When UUID_HANDLING=true and _id is UUID, search by identifier field
  - Returns searchByIdentifier flag to redirect query
- treatments.js: Move queryOpts inside query_for() for env access
- entries.js: Same pattern for entries collection

When UUID_HANDLING=true:
- GET /treatments/{uuid} searches by identifier field
- DELETE /treatments/{uuid} deletes by identifier field
- Same behavior for entries collection

When UUID_HANDLING=false (default):
- UUID _id values return empty results (safe, no crash)
- Maintains backwards compatibility

Refs: uuid-feature-flag, uuid-query-impl from uuid-identifier-lookup.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-17 13:21:14 -07:00
Ben WestandCopilot e78a5bc6e7 fix(treatments): implement REQ-SYNC-072 server-controlled ID with transparent promotion
Fixes #8450 - Loop Temporary Override sync breaks due to UUID _id handling

Option G Implementation:
- Extract client sync identity (identifier) from any source:
  - Loop overrides: UUID in _id field → moved to identifier
  - Loop carbs/doses: syncIdentifier → copied to identifier
  - AAPS: identifier already present
  - xDrip+: uuid → copied to identifier

- Server generates proper ObjectId for _id field
- Deduplication uses identifier (not _id) as primary key
- No database migration needed - gradual adoption

Changes:
- normalizeTreatmentId(): extracts client identity to identifier field
- upsertQueryFor(): identifier-first lookup, strips UUID _id for upsert
- create()/upsert()/save(): fetch _id from DB after update by identifier
- Added 'identifier' to indexedFields for efficient querying
- Updated UUID treatment test with full workflow coverage

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-10 13:36:34 -07:00
Andy Low 1231ec6b65 Handle UUID treatment ids in v1 API 2026-03-08 01:01:57 +00:00
Ben West 9318a577b5 refactor: use insertMany/bulkWrite for batch MongoDB operations
- devicestatus.js: Replace async.eachSeries + insertOne with insertMany
- entries.js: Replace forEach + updateOne with bulkWrite
- treatments.js: Replace async.eachSeries + replaceOne with bulkWrite
  (preserves sequential fallback for preBolus treatments)

This improves performance for batch inserts and aligns with MongoDB
best practices per data-shape-requirements.md recommendations.
2026-01-19 13:49:36 -08:00
Ben West 1107e84a6e Revert "Revert "Merge pull request #8026 from nightscout/less_frequent_db_updates""
This reverts commit 2e65b1dd9b.
Try to bring back #8026.
2026-01-19 13:13:43 -08:00
Ben West 2e65b1dd9b Revert "Merge pull request #8026 from nightscout/less_frequent_db_updates"
This reverts commit 2757fe585d, reversing
changes made to 4a461e5890.
2023-10-19 13:03:38 -07:00
Sulka Haro 32163a0cd1 * Fix storage so tests pass with new Mongo driver
* Removes old openaps-storage feature
2023-06-01 22:45:07 +03:00
Sulka Haro 93ffb25147 Upgrade Mongo driver to latest legacy-API compatible version 2023-06-01 12:20:36 +03:00
Sulka HaroandGitHub dfa86a9c6a Fix memory leak and cache update issues in 14.0.4 (#6133)
* Fix a memory leak in 14.0.4
* Fix linter error in ddata.js
* Move data retention periods to caching
* Update _id of inserted entries and device status so merging to cache works correctly
* Reset the data in ddata before updating
* Fix typo on entry cache retention period
* Have device status cache retention period follow configuration
* Fix _id injection in treatments
2020-09-27 17:16:42 +03:00
Sulka Haro 54008a7122 Remove excess logging 2020-09-22 11:14:13 +03:00
Sulka Haro f878ce115b Add support for CGM data and device statuses. Refactor dataloader to use the new model and reduce queries back down 2020-09-20 18:36:19 +03:00
Sulka Haro 0c7e9bf456 * Require created_at for Treatments on insert
* Refactoring the cache: moved to another file and support flushing from bus events
2020-09-19 18:17:20 +03:00
Adam HarrisonandGitHub b1ec21cd3f Added indexes to 'entries' and 'treatments' along with other updates (#5463)
* Added compound indexes for treatments and entries collections. Updated ensureIndex to createIndex in mongo-strage.js as ensureIndex has been deprecated. Finally, updated testing/populate.js to be compatible with more recent versions of the node driver, as well as fixing a path issue.

* Fixed missing end quote in lib/server/treatments.js. Changed all newly added double quotes to single quote to match style guide.

* Removed indexes that referenced key600.
2020-02-05 08:27:56 +02:00
JakobandSulka Haro 7dc292e056 Resolve unnecessary uses of eslint-ignore (#5436)
* Resolve unnecessary disabling of no-undef eslint rule

* Resolve unnecessary disabling of no-prototype-builtins eslint rule

* Resolve unnecessary disabling of no-unused-vars eslint rule

* Resolve unnecessary disabling of no-empty eslint rule
2020-01-12 20:13:29 +00:00
Sulka Haro 851b08ff4c Fix issues found with linting in the server code & update module versions based on npm audit 2019-07-19 09:46:40 +03:00
Sulka HaroandGitHub b04476e1f9 Normalize Treatment, Entry and Device Status object dates to be all in UTC Strings (#4658)
* Normalize Treatment object dates to be all in UTC Strings, as expected by the codebase

* Also normalize the device status data

* Sort the results so results with mixed dates are returned in correct order

* Use MomentJS to correctly parse the offsets & output the offset to objects at all times

* Removing a debug console log message causing excessive logging

* Use UTC date values for queries even if client asks for zoned dates

* Remove extra sorting based on date. Code clarifications

* * Add missing parseZone() call to treatments
* Check isValid() date on entries

* Use isValid() to check date validity for device status data
2019-07-17 09:03:39 +03:00
Jeremy Cunningham 440807ef89 Reload data when entries or treatments are deleted 2018-12-07 17:40:04 -06:00
Jeremy Cunningham b44890606b Remove unused function. 2018-12-07 17:40:04 -06:00
Jeremy Cunningham 759dd40dec Add clean treatments admin tool. 2018-12-07 17:39:11 -06:00
Jeremy Cunningham 630114ecb9 Use new objId in api call 2018-11-20 21:57:51 -06:00
Jeremy Cunningham 3d6fd3552b Fix devicestatus ObjectID usage. 2018-11-20 21:53:25 -06:00
Jeremy Cunningham a13d8ff5e9 Add treatments delete id debug. 2018-11-20 21:17:11 -06:00
Sulka Haro 051576056a Moved server-specific sources to their own folder. Removed some unused code as per Codacy reports 2017-12-28 19:15:52 +02:00