Skip to content

getVersions Content API #8632#11733

Open
rymsha wants to merge 2 commits intomasterfrom
8632-getversions-content-js-api
Open

getVersions Content API #8632#11733
rymsha wants to merge 2 commits intomasterfrom
8632-getversions-content-js-api

Conversation

@rymsha
Copy link
Contributor

@rymsha rymsha commented Feb 9, 2026

No description provided.

@rymsha rymsha linked an issue Feb 9, 2026 that may be closed by this pull request
@rymsha rymsha requested a review from Copilot February 9, 2026 17:29
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a new getVersions API (with cursor-based pagination) for nodes and content, and refactors internal version representations to separate stored node data from version metadata.

Changes:

  • Introduces cursor-based pagination for node versions (GetNodeVersionsCommand, VersionCursorHelper, GetNodeVersionsResult/Params).
  • Adds Content API getVersions (TypeScript + Java handler/mapper + example/test) built on node version retrieval.
  • Replaces NodeVersionMetadata/NodeVersionMetadatas usages with NodeVersion/NodeVersions and introduces NodeStoreVersion for storage-layer node blobs.

Reviewed changes

Copilot reviewed 98 out of 99 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/GetActiveVersionHandlerTest.java Updates tests to new NodeVersion type
modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/FindVersionsHandlerTest.java Aligns lib-node test to getVersions/cursor
modules/lib/lib-node/src/main/resources/lib/xp/node.ts Updates findVersions params to cursor paging
modules/lib/lib-node/src/main/resources/lib/xp/examples/node/findVersions.js Updates example to new paging params
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/NodeVersionsQueryResultMapper.java Maps GetNodeVersionsResult + cursor
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/NodeVersionMapper.java Mapper now consumes NodeVersion
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/NodeHandler.java Switches handler to cursor-based params
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/GetActiveVersionHandler.java Uses NodeVersion for active versions
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/FindVersionsHandlerParams.java Replaces start paging with cursor
modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/FindVersionsHandler.java Uses nodeService.getVersions + cursor
modules/lib/lib-content/src/test/java/com/enonic/xp/lib/content/GetVersionsHandlerTest.java Adds lib-content script-based test for getVersions
modules/lib/lib-content/src/main/resources/lib/xp/examples/content/getVersions.js Adds content.getVersions example
modules/lib/lib-content/src/main/resources/lib/xp/content.ts Adds getVersions TS API + types
modules/lib/lib-content/src/main/java/com/enonic/xp/lib/content/mapper/ContentVersionsMapper.java Maps GetContentVersionsResult to JS object
modules/lib/lib-content/src/main/java/com/enonic/xp/lib/content/QueryContentHandler.java Adjusts query paging parameter application
modules/lib/lib-content/src/main/java/com/enonic/xp/lib/content/GetVersionsHandler.java Adds server-side handler for content.getVersions
modules/lib/lib-content/src/main/java/com/enonic/xp/lib/content/GetChildContentHandler.java Refactors paging/sort param handling
modules/lib/lib-content/src/main/java/com/enonic/xp/lib/content/BaseContextHandler.java Removes valueOrDefault helper
modules/itest/itest-core/src/test/java/com/enonic/xp/core/repo/vacuum/versiontable/VersionTableVacuumTaskTest.java Updates itest to getVersions API and types
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/NodeServiceImplTest.java Updates itest to new versions API/types
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/MoveNodeCommandTest.java Updates assertions to NodeVersions
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/GetNodeVersionsCommandTest.java Adds integration tests for cursor paging
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/GetActiveNodeVersionsCommandTest.java Migrates to NodeVersion + improves assertion
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/FindNodeVersionsCommandTest.java Updates to NodeVersions naming/type
modules/itest/itest-core/src/test/java/com/enonic/xp/core/node/ApplyNodePermissionsCommandTest.java Adjusts version iteration type
modules/itest/itest-core/src/test/java/com/enonic/xp/core/dump/DumpServiceImplTest.java Updates dump tests to getVersions + NodeStoreVersion
modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_versions.java Updates content versions tests to new params/result
modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_versionAttributes.java Updates content versions retrieval calls
modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_publish.java Updates content versions retrieval calls
modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_archive.java Updates content versions retrieval calls
modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentServiceTest.java Updates helper to new params/result
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/vacuum/segment/SegmentVacuumTaskTest.java Updates mocks for NodeVersions
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/vacuum/blob/AbstractBlobVacuumTaskTest.java Updates query result construction to NodeVersions
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImplTest.java Updates to NodeVersion metadata + NodeStoreVersion
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/repository/RepositoryServiceActivatorTest.java Updates stored metadata type
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/json/NodeVersionJsonDumpSerializerTest.java Updates serialization tests to NodeStoreVersion
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/dao/NodeVersionServiceImplTest.java Updates DAO tests to NodeStoreVersion
modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/dump/upgrade/htmlarea/HtmlAreaNodeDataUpgraderTest.java Updates upgrader tests to NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/version/search/NodeVersionQueryResultFactory.java Collects search hits into NodeVersions
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/version/VersionStorageDocFactory.java Stores NodeVersion metadata instead of old type
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/version/VersionServiceImpl.java Updates VersionService signatures/types
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/version/VersionService.java Updates interface to NodeVersion metadata
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/version/NodeVersionFactory.java Produces NodeVersion metadata
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/vacuum/versiontable/VersionTableVacuumCommand.java Migrates version iteration to NodeVersions
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/vacuum/segment/SegmentVacuumCommand.java Adjusts query ordering for recent versions check
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreNodeVersionParams.java Switches stored version payload to NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeVersionData.java Record now contains NodeVersion metadata
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java Separates store blob (NodeStoreVersion) from metadata (NodeVersion)
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java Updates service return types
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/json/NodeVersionJsonSerializer.java Serializes/deserializes NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/json/NodeVersionDataJson.java JSON model converts to/from NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/json/AccessControlJson.java Access control JSON now uses NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/dao/NodeVersionServiceImpl.java DAO interface updated to NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/dao/NodeVersionService.java DAO interface updated to NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/VersionCursorHelper.java Adds cursor encode/decode utility
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java Uses NodeStoreVersion + NodeFactory for Node building
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java Adds getVersions(GetNodeVersionsParams) implementation
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/LoadNodeVersionCommand.java Imports versions via Node instead of loose fields
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeVersionsCommand.java New cursor-based node versions retrieval command
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareStatusResolver.java Updates version metadata retrieval type
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/index/ReindexExecutor.java Uses NodeStoreVersion from storage layer
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/obsoletemodel/pre4/Pre4NodeVersionJson.java Uses NodeStoreVersion for old dump model
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/htmlarea/HtmlAreaNodeDataUpgrader.java Uses NodeStoreVersion in upgrader
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/htmlarea/HtmlAreaDumpUpgrader.java Uses NodeStoreVersion in dump upgrader
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/flattenedpage/FlattenedPageDumpUpgrader.java Uses NodeStoreVersion in upgrader
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/RepositoryIdDumpUpgrader.java Uses NodeStoreVersion for rewritten blobs
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/upgrade/IndexConfigUpgrader.java Uses NodeStoreVersion when inspecting node data
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/reader/VersionEntryProcessor.java Imports versions by constructing a Node
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/reader/DumpReader.java Reader now returns NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/reader/BranchEntryProcessor.java Updates to NodeStoreVersion retrieval
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/reader/AbstractEntryProcessor.java Updates binary import helper param type
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/reader/AbstractDumpReader.java Reader now returns NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/VersionMetaFactory.java Uses NodeVersion metadata
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/RepoDumper.java Dumps version metadata with new types
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/NodeFactory.java Centralizes building Node from NodeStoreVersion
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeStoreVersion.java New storage-layer node version representation
modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeBranchEntry.java Uses NodeVersion metadata in builder
modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentVersionsCommand.java New content versions retrieval command
modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/FindContentVersionsCommand.java Removed old offset-based command
modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentServiceImpl.java Switches to GetContentVersions* API
modules/core/core-api/src/test/java/com/enonic/xp/content/GetContentVersionsResultTest.java Updates test to new result type
modules/core/core-api/src/test/java/com/enonic/xp/content/GetContentVersionsParamsTest.java Adds tests for cursor params
modules/core/core-api/src/test/java/com/enonic/xp/content/FindContentVersionsParamsTest.java Removes obsolete params test
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeVersions.java New immutable list type for node versions
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeVersionQueryResult.java Switches payload to NodeVersions
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeVersionMetadatas.java Removed obsolete list type
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeVersionMetadata.java Removed obsolete metadata type
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeVersion.java Redefined as version metadata
modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java Adds getVersions and adjusts nullability
modules/core/core-api/src/main/java/com/enonic/xp/node/Node.java Removes builder-from-NodeVersion helper
modules/core/core-api/src/main/java/com/enonic/xp/node/ImportNodeVersionParams.java Imports now done via Node aggregate
modules/core/core-api/src/main/java/com/enonic/xp/node/GetNodeVersionsResult.java New result type with cursor
modules/core/core-api/src/main/java/com/enonic/xp/node/GetNodeVersionsParams.java Adds cursor param; removes offset paging
modules/core/core-api/src/main/java/com/enonic/xp/node/GetActiveNodeVersionsResult.java Updates map value to NodeVersion
modules/core/core-api/src/main/java/com/enonic/xp/content/GetContentVersionsResult.java Renames result type and adds cursor
modules/core/core-api/src/main/java/com/enonic/xp/content/GetContentVersionsParams.java New params type with cursor
modules/core/core-api/src/main/java/com/enonic/xp/content/FindContentVersionsParams.java Removed obsolete offset-based params
modules/core/core-api/src/main/java/com/enonic/xp/content/ContentService.java Switches to GetContentVersions* API
Files not reviewed (1)
  • modules/lib/package-lock.json: Language not supported

Comment on lines +36 to +38
catch ( IOException e )
{
throw new UncheckedIOException( "Failed to decode cursor", e );
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

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

Base64.getDecoder().decode(cursor) can throw IllegalArgumentException, and missing/invalid JSON fields can cause NullPointerException/DateTimeParseException. These currently bypass the intended "Failed to decode cursor" message. Consider catching RuntimeException cases here and rethrowing an IllegalArgumentException with a clear message (and the original cause) so callers get a consistent, actionable error.

Suggested change
catch ( IOException e )
{
throw new UncheckedIOException( "Failed to decode cursor", e );
catch ( IOException | RuntimeException e )
{
throw new IllegalArgumentException( "Failed to decode cursor", e );

Copilot uses AI. Check for mistakes.
}

/**
* Retrieves the collection node versions.
Copy link

Copilot AI Feb 9, 2026

Choose a reason for hiding this comment

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

Fix grammar in JavaDoc: "Retrieves the collection node versions." → "Retrieves the collection of node versions."

Suggested change
* Retrieves the collection node versions.
* Retrieves the collection of node versions.

Copilot uses AI. Check for mistakes.
@codecov
Copy link

codecov bot commented Feb 9, 2026

Codecov Report

❌ Patch coverage is 91.68443% with 39 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.73%. Comparing base (3622c3d) to head (584eb44).

Files with missing lines Patch % Lines
...c/xp/lib/content/mapper/ContentVersionsMapper.java 66.66% 9 Missing and 1 partial ⚠️
.../com/enonic/xp/lib/content/GetVersionsHandler.java 56.25% 4 Missing and 3 partials ⚠️
.../src/main/java/com/enonic/xp/node/NodeVersion.java 83.87% 1 Missing and 4 partials ⚠️
.../enonic/xp/repo/impl/node/VersionCursorHelper.java 73.33% 4 Missing ⚠️
...src/main/java/com/enonic/xp/node/NodeVersions.java 87.50% 2 Missing ⚠️
...p/core/impl/content/GetContentVersionsCommand.java 95.91% 0 Missing and 2 partials ⚠️
.../enonic/xp/lib/content/GetChildContentHandler.java 75.00% 0 Missing and 2 partials ⚠️
...va/com/enonic/xp/lib/node/FindVersionsHandler.java 75.00% 1 Missing and 1 partial ⚠️
.../repo/impl/dump/reader/AbstractEntryProcessor.java 50.00% 1 Missing ⚠️
...xp/repo/impl/dump/reader/BranchEntryProcessor.java 50.00% 1 Missing ⚠️
... and 3 more
Additional details and impacted files
@@             Coverage Diff              @@
##             master   #11733      +/-   ##
============================================
+ Coverage     86.71%   86.73%   +0.02%     
- Complexity    19704    19714      +10     
============================================
  Files          2540     2545       +5     
  Lines         66737    66771      +34     
  Branches       5343     5337       -6     
============================================
+ Hits          57874    57917      +43     
+ Misses         6273     6269       -4     
+ Partials       2590     2585       -5     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

getVersions Content API

1 participant