Skip to content

feat(group): Add upsert and mCreate/mUpdate/mUpsert actions#431

Merged
etrousset merged 5 commits intonextfrom
KZLPRD-992-group-upsert-and-mactions
Aug 21, 2025
Merged

feat(group): Add upsert and mCreate/mUpdate/mUpsert actions#431
etrousset merged 5 commits intonextfrom
KZLPRD-992-group-upsert-and-mactions

Conversation

@QuentinRousselet
Copy link
Copy Markdown
Contributor

@QuentinRousselet QuentinRousselet commented Aug 5, 2025

What does this PR do ?

This PR adds several actions to the groups api:
Issues : ticket ticket

  • upsert
  • mCreate
  • mUpdate
  • mUpsert

How should this be manually tested?

Try the different controllers

@QuentinRousselet QuentinRousselet self-assigned this Aug 5, 2025
Copy link
Copy Markdown
Contributor

@afondard afondard left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment thread tests/scenario/modules/groups/group.test.ts Outdated
@QuentinRousselet QuentinRousselet requested a review from cyrng August 20, 2025 08:28
Copy link
Copy Markdown
Contributor

@cyrng cyrng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@etrousset etrousset merged commit c458f38 into next Aug 21, 2025
11 checks passed
@etrousset etrousset deleted the KZLPRD-992-group-upsert-and-mactions branch August 21, 2025 07:40
github-actions Bot pushed a commit that referenced this pull request Aug 21, 2025
## [3.0.0-next.7](v3.0.0-next.6...v3.0.0-next.7) (2025-08-21)

### Features

* **group:** Add upsert and mCreate/mUpdate/mUpsert actions ([#431](#431)) ([c458f38](c458f38))
github-actions Bot pushed a commit that referenced this pull request Mar 13, 2026
## 3.0.0-3-dev.1 (2026-03-13)

* chore: configure next branch ([2c77332](2c77332))
* chore: linting ([14ba308](14ba308))
* chore: merge '2-dev' into 3-dev ([13e5006](13e5006))
* chore: rebase next on master (#406) ([4d657c1](4d657c1)), closes [#406](#406) [#383](#383) [#386](#386) [#384](#384) [#388](#388) [#389](#389) [#390](#390) [#393](#393) [#395](#395) [#389](#389) [#390](#390) [#393](#393)
* chore(ci): update branch names in workflows ([c800422](c800422))
* chore(docs): rename add/remove devices/assets from groups controller ([60ac401](60ac401))
* chore(eslint): configuration ([f326a7e](f326a7e))
* chore(license): updated license file ([e63649b](e63649b))
* chore(release): '2-dev' into beta ([e89d00a](e89d00a))
* chore(release): '3-dev' into next ([d2578bf](d2578bf))
* chore(release): 2-dev into beta ([850583b](850583b))
* chore(release): 2.4.0-beta.21 [skip ci] ([0b9d465](0b9d465))
* chore(release): 2.5.0-beta.1 [skip ci] ([6d46cde](6d46cde))
* chore(release): 2.5.0-beta.2 [skip ci] ([fbe00d4](fbe00d4))
* chore(release): 2.5.0-dev.1 [skip ci] ([8328d57](8328d57))
* chore(release): 2.5.0-dev.2 [skip ci] ([f69c0a7](f69c0a7))
* chore(release): 3.0.0-next.1 [skip ci] ([a691826](a691826))
* chore(release): 3.0.0-next.10 [skip ci] ([000baef](000baef))
* chore(release): 3.0.0-next.11 [skip ci] ([a4869ca](a4869ca))
* chore(release): 3.0.0-next.12 [skip ci] ([742f38d](742f38d))
* chore(release): 3.0.0-next.13 [skip ci] ([6ee87cd](6ee87cd))
* chore(release): 3.0.0-next.14 [skip ci] ([8ba5e32](8ba5e32))
* chore(release): 3.0.0-next.15 [skip ci] ([4e2a854](4e2a854))
* chore(release): 3.0.0-next.16 [skip ci] ([4b0912b](4b0912b))
* chore(release): 3.0.0-next.17 [skip ci] ([9021562](9021562))
* chore(release): 3.0.0-next.18 [skip ci] ([004fb43](004fb43))
* chore(release): 3.0.0-next.19 [skip ci] ([80a0131](80a0131))
* chore(release): 3.0.0-next.2 [skip ci] ([c17e257](c17e257))
* chore(release): 3.0.0-next.20 [skip ci] ([124c717](124c717))
* chore(release): 3.0.0-next.21 [skip ci] ([90c7bcc](90c7bcc))
* chore(release): 3.0.0-next.22 [skip ci] ([3314ef3](3314ef3))
* chore(release): 3.0.0-next.23 [skip ci] ([3e3ce84](3e3ce84))
* chore(release): 3.0.0-next.24 [skip ci] ([1e07d0d](1e07d0d))
* chore(release): 3.0.0-next.25 [skip ci] ([0a00b4c](0a00b4c))
* chore(release): 3.0.0-next.26 [skip ci] ([3ca41f3](3ca41f3))
* chore(release): 3.0.0-next.27 [skip ci] ([12fc8a9](12fc8a9))
* chore(release): 3.0.0-next.3 [skip ci] ([efaa8e1](efaa8e1)), closes [#410](#410) [#408](#408) [#409](#409)
* chore(release): 3.0.0-next.4 [skip ci] ([3b48a18](3b48a18))
* chore(release): 3.0.0-next.5 [skip ci] ([baab4c2](baab4c2))
* chore(release): 3.0.0-next.6 [skip ci] ([6084b23](6084b23))
* chore(release): 3.0.0-next.7 [skip ci] ([a836e8a](a836e8a))
* chore(release): 3.0.0-next.8 [skip ci] ([f9e3953](f9e3953))
* chore(release): 3.0.0-next.9 [skip ci] ([24813dd](24813dd))
* chore(release): merge master [skip ci] ([7cbb68c](7cbb68c))
* chore(semantic-release): update config to match new branches ([7cfe498](7cfe498))
* feat: embed measure slots in asset and device documents (#372) ([ffa73b9](ffa73b9)), closes [#372](#372)
* feat: stop using measures from assets and devices in exporter (#369) ([6ee21a0](6ee21a0)), closes [#369](#369)
* feat(assetModel): add spec artifacts for multi-group asset models (#462) ([e8cff06](e8cff06)), closes [#462](#462)
* feat(assets): allow to add or remove measure slots to an asset (#457) ([cafd09a](cafd09a)), closes [#457](#457)
* feat(decoder): warn no measures instead of throwing error (#425) ([c2fe3f6](c2fe3f6)), closes [#425](#425)
* feat(decoders): add the device payload "route" endpoint (#456) ([9d4c251](9d4c251)), closes [#456](#456)
* feat(devices): can create orphan devices (#460) ([0d913ae](0d913ae)), closes [#460](#460)
* feat(doc 3): added documentation for the Groups controller ([a22f657](a22f657))
* feat(doc): add breaking changes ([bb1ce3f](bb1ce3f))
* feat(doc): add measure linkage + screenshots ([a552dfb](a552dfb))
* feat(doc): add migration documentation and migration scripts ([fc1cf1c](fc1cf1c))
* feat(doc): add migration scripts ([6eb9515](6eb9515))
* feat(doc): add new group endpoints ([3c04d76](3c04d76))
* feat(doc): add new linkAssets/devices endpoint doc ([6e321ef](6e321ef))
* feat(doc): reword engine into tenant engine where necessary for comprehension ([30c9a52](30c9a52))
* feat(doc): update digitial twins devices assets ([d9b086a](d9b086a))
* feat(doc): update measure-propagation screen + remove tenant references ([3f284e9](3f284e9))
* feat(doc): update migration scripts and docs to be used with  npx ([a414c58](a414c58))
* feat(docs): duplicate v2 doc ([d6f6dca](d6f6dca))
* feat(group): add endpoint to list items of a group ([813fe49](813fe49))
* feat(group): Add upsert and mCreate/mUpdate/mUpsert actions (#431) ([c458f38](c458f38)), closes [#431](#431)
* feat(groupModels): add group affinity and allow groups to contain devices ([110217e](110217e))
* feat(groups): rework asset groups into broader groups (#424) ([6cfcede](6cfcede)), closes [#424](#424)
* feat(groupservice): add refresh option (#437) ([2587f3b](2587f3b)), closes [#437](#437)
* feat(logger): add module and decoder scoped logger (#461) ([6f0c6b9](6f0c6b9)), closes [#461](#461)
* feat(measure): allow measures to be pushed on Assets via API (no devices) (#344) ([c1073c1](c1073c1)), closes [#344](#344)
* feat(measureModel): tenant scoped measure model (#459) ([7659425](7659425)), closes [#459](#459)
* feat(models): add tenant-scoped asset models with 3-level fallback (KZLPRD-1150) ([07be354](07be354))
* feat(models): engine-aware conflict detection and API docs for tenant-scoped models (KZLPRD-1150) ([80b6f17](80b6f17))
* feat(twins): many-to-many link relations (#433) ([719b8cd](719b8cd)), closes [#433](#433)
* feat!: remove deprecations support (#409) ([3937249](3937249)), closes [#409](#409)
* feat!: remove kdm measures export (#410) ([897097f](897097f)), closes [#410](#410)
* feat(doc 3) update configuration / measures-ingestion ([c420bc8](c420bc8))
* feat(doc) Add link to kourous doc for migration ([864f175](864f175))
* feat(test):add test for new listItems endpoint ([1a81b91](1a81b91))
* fix!: rename engine collections (#408) ([220aa51](220aa51)), closes [#408](#408)
* Merge branch 'next' of github.com:kuzzleio/kuzzle-device-manager into next ([9ceac57](9ceac57))
* Merge pull request #426 from kuzzleio/3-dev ([5bb37cc](5bb37cc)), closes [#426](#426)
* Merge pull request #427 from kuzzleio/3-dev ([92f3201](92f3201)), closes [#427](#427)
* Merge pull request #428 from kuzzleio/KZLPRD-979-group-affinity ([9ce7c7e](9ce7c7e)), closes [#428](#428)
* Merge pull request #429 from kuzzleio/3-dev ([2ea4a8f](2ea4a8f)), closes [#429](#429)
* Merge pull request #434 from kuzzleio/FEAT/docs-v3 ([4e2394d](4e2394d)), closes [#434](#434)
* Merge pull request #438 from kuzzleio/KZLPRD-1013-await-promise-try-catch ([5c73b8e](5c73b8e)), closes [#438](#438)
* Merge pull request #446 from kuzzleio/chore/export-type-internal-collections ([8f0b4d4](8f0b4d4)), closes [#446](#446)
* Merge pull request #447 from kuzzleio/chore/export-type-internal-collections ([5cfead0](5cfead0)), closes [#447](#447)
* Merge pull request #458 from kuzzleio/feat/KZLPRD-1150_tenant_specific_asset_model ([4fd7f74](4fd7f74)), closes [#458](#458)
* Update openspec/changes/tenant-specific-asset-models/design.md ([4d542f4](4d542f4))
* style: fix prettier formatting in ModelService search queries ([351ecfa](351ecfa))
* fix: add prefix to build command ([da91fee](da91fee))
* fix: backport fix (#380) ([5392b56](5392b56)), closes [#380](#380)
* fix: create a workspace for the device manager and one for types ([6ccb890](6ccb890))
* fix: engines name ([9cf6da3](9cf6da3))
* fix: fix semantic version ([f64ca2f](f64ca2f))
* fix: fix types from last merge ([5f3c973](5f3c973))
* fix: gitignore and ci cd commands ([c3769c1](c3769c1))
* fix: kuzzle version, semantic version ([c55be75](c55be75))
* fix: launch tests in docker ([a1541a9](a1541a9))
* fix: little change to trigger release ([e3094a9](e3094a9))
* fix: name the service in docker compose ([dff55c1](dff55c1))
* fix: remove metadata property to avoid update (#432) ([6925e81](6925e81)), closes [#432](#432)
* fix: restore next version releasing ([9bebc53](9bebc53))
* fix: script in ci ([e782694](e782694))
* fix: semantic-release ([8804514](8804514))
* fix: should fix tests ([8f7c468](8f7c468))
* fix: test app ([f3e3108](f3e3108))
* fix: testing with right node version ([39b8144](39b8144))
* fix: trusted publishing ([691584d](691584d))
* fix: types (#411) ([aeb3e35](aeb3e35)), closes [#411](#411)
* fix: typo in docker compose file ([dd12b2f](dd12b2f))
* fix: url of types package ([a548520](a548520))
* fix: use original event with new payload (#414) ([3fd1557](3fd1557)), closes [#414](#414)
* fix: use vite, properly launch tests ([37b916a](37b916a))
* fix: version of tests is 24 for now ([396da18](396da18))
* fix(assetsController): await a promise inside of a try-catch ([1720df3](1720df3))
* fix(ci): set runner node-version to 22 ([f4ccead](f4ccead))
* fix(deviceService): fix metadata init to accept 0 (#448) ([30f8ea0](30f8ea0)), closes [#448](#448)
* fix(doc): typo ([33fab8a](33fab8a))
* fix(fixtures): add missign groups property in device emptytemp ([bf313e1](bf313e1))
* fix(implicitMeasureLinking): no error if link already exists (#436) ([0e01111](0e01111)), closes [#436](#436)
* fix(measureIngest): infer engineGroup from engine (#455) ([1f68e8d](1f68e8d)), closes [#455](#455)
* fix(measures): add device groups field to origin of measures documents (#441) ([35aa43d](35aa43d)), closes [#441](#441)
* fix(models): address remaining PR #458 review feedback (KZLPRD-1150) ([1394ac2](1394ac2)), closes [#458](#458)
* fix(models): filter undefined from ES must arrays and add lang to getAsset queries (KZLPRD-1150) ([f8185d1](f8185d1))
* fix(ModelService): twin types ([7d4fc85](7d4fc85))
* fix(plugin exports): add missing type export InternalCollection ([3624519](3624519))
* fix(test app): fix imports ([b635f59](b635f59))
* fix(tests): replace jest.setTimeout with vitest equivalent (KZLPRD-1150) ([0296f21](0296f21))
* fix(unlinkAsset): throw if no measure to unlink is provided (#453) ([991c21b](991c21b)), closes [#453](#453)
* refactor(models): address PR #458 review feedback (KZLPRD-1150) ([0171cf1](0171cf1)), closes [#458](#458)
* test(models): add tenant-scoped mapping conflict detection tests (KZLPRD-1150) ([620dff2](620dff2))
* docs(KZLPRD-1150): asset model individual tenant-engine granularity ([f720834](f720834))

### BREAKING CHANGE

* `engineGroup` field renamed to `engineGroups` (string[])
in model documents, API request/response types, and ask events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(models): add multi-group asset model behavior

- Normalize engineGroups containing "commons" to ["commons"] in writeAsset/updateAsset
- Enforce single-group constraint for group models in writeGroup
- Generate multi-group document IDs: model-asset-{sortedGroups}-{ModelName}
- Add 7 functional tests for multi-group scenarios
- Add group model rejection test for multiple engineGroups

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(models): use request.getArray() for engineGroups parameter validation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: gitignore .claude/ and openspec/ directories

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* change in the management of measurement models
@alexandrebouthinon
Copy link
Copy Markdown
Member

🎉 This PR is included in version 3.0.0-3-dev.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants