From b565d5cb2ea548f3cb77ca0e9d842815398f412c Mon Sep 17 00:00:00 2001 From: "Ansari, Mujammil" Date: Wed, 20 May 2026 20:42:32 +0530 Subject: [PATCH] Add sharedVersion field in Tag model - Store shared tags in a single DynamoDB transaction Signed-off-by: Ansari, Mujammil --- .../here/xyz/hub/config/TagConfigClient.java | 1 + .../config/dynamo/DynamoTagConfigClient.java | 20 +++++++++++++++++++ .../hub/config/jdbc/JDBCTagConfigClient.java | 5 +++++ .../java/com/here/xyz/hub/rest/TagApi.java | 9 +++++++-- .../java/com/here/xyz/models/hub/Tag.java | 16 +++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/TagConfigClient.java b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/TagConfigClient.java index 85ad925bc5..7505dc1b6d 100644 --- a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/TagConfigClient.java +++ b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/TagConfigClient.java @@ -53,6 +53,7 @@ public static TagConfigClient getInstance() { public abstract Future> getAllTags(Marker marker); public abstract Future storeTag(Marker marker, Tag tag); + public abstract Future storeSharedTags(Marker marker, List sharedTags); public abstract Future deleteTag(Marker marker, String id, String spaceId); diff --git a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/dynamo/DynamoTagConfigClient.java b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/dynamo/DynamoTagConfigClient.java index 64897ae8da..8d90078da5 100644 --- a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/dynamo/DynamoTagConfigClient.java +++ b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/dynamo/DynamoTagConfigClient.java @@ -20,6 +20,7 @@ package com.here.xyz.hub.config.dynamo; import com.amazonaws.services.dynamodbv2.document.Item; +import com.amazonaws.services.dynamodbv2.document.ItemUtils; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes; import com.amazonaws.services.dynamodbv2.document.spec.DeleteItemSpec; @@ -28,7 +29,10 @@ import com.amazonaws.services.dynamodbv2.model.ExecuteStatementRequest; import com.amazonaws.services.dynamodbv2.model.ExecuteTransactionRequest; import com.amazonaws.services.dynamodbv2.model.ParameterizedStatement; +import com.amazonaws.services.dynamodbv2.model.Put; import com.amazonaws.services.dynamodbv2.model.ReturnValue; +import com.amazonaws.services.dynamodbv2.model.TransactWriteItem; +import com.amazonaws.services.dynamodbv2.model.TransactWriteItemsRequest; import com.here.xyz.XyzSerializable; import com.here.xyz.hub.config.TagConfigClient; import com.here.xyz.models.hub.Ref; @@ -185,6 +189,21 @@ public Future storeTag(Marker marker, Tag tag) { }); } + @Override + public Future storeSharedTags(Marker marker, List sharedTags) { + return dynamoClient.executeQueryAsync(() -> { + List transactWriteItems = sharedTags.stream() + .map(tag -> new TransactWriteItem().withPut(new Put() + .withTableName(tagTable.getTableName()) + .withItem(ItemUtils.fromSimpleMap(XyzSerializable.toMap(tag, Static.class))))) + .toList(); + + dynamoClient.client.transactWriteItems(new TransactWriteItemsRequest() + .withTransactItems(transactWriteItems)); + return null; + }); + } + @Override public Future deleteTag(Marker marker, String id, String spaceId) { return dynamoClient.executeQueryAsync(() -> { @@ -234,6 +253,7 @@ private static List tagDataToTags(List> items) .withId(tagData.get("id").getS()) .withSpaceId(tagData.get("spaceId").getS()) .withVersion(version) + .withSharedVersion(tagData.get("sharedVersion") != null ? Long.parseLong(tagData.get("sharedVersion").getN()) : null) .withVersionRef(Ref.fromBranchId(branchId, version)) .withSystem(tagData.get("system") != null ? tagData.get("system").getBOOL() : false) .withDescription(tagData.get("description") != null ? tagData.get("description").getS() : "") diff --git a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/jdbc/JDBCTagConfigClient.java b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/jdbc/JDBCTagConfigClient.java index b9901f5c38..61d8ceca6b 100644 --- a/xyz-hub-service/src/main/java/com/here/xyz/hub/config/jdbc/JDBCTagConfigClient.java +++ b/xyz-hub-service/src/main/java/com/here/xyz/hub/config/jdbc/JDBCTagConfigClient.java @@ -121,6 +121,11 @@ public Future storeTag(Marker marker, Tag tag) { return client.write(query).mapEmpty(); } + @Override + public Future storeSharedTags(Marker marker, List sharedTags) { + return Future.all(sharedTags.stream().map(tag -> storeTag(marker, tag)).toList()).mapEmpty(); + } + @Override public Future deleteTag(Marker marker, String id, String spaceId) { final SQLQuery query = client.getQuery("DELETE FROM ${schema}.${table} WHERE id = #{tagId} AND space = #{spaceId}") diff --git a/xyz-hub-service/src/main/java/com/here/xyz/hub/rest/TagApi.java b/xyz-hub-service/src/main/java/com/here/xyz/hub/rest/TagApi.java index 1a1a48195e..62291811f5 100644 --- a/xyz-hub-service/src/main/java/com/here/xyz/hub/rest/TagApi.java +++ b/xyz-hub-service/src/main/java/com/here/xyz/hub/rest/TagApi.java @@ -156,9 +156,14 @@ public static Future createTag(Marker marker, String spaceId, String tagId, return createTag(marker, spaceId, tagId, new Ref(HEAD), true, "", author, Core.currentTimeMillis()); } - // TODO auth public static Future createTag(Marker marker, String spaceId, String tagId, Ref versionRef, boolean system, String description, String author, long createdAt) { + return createTag(marker, spaceId, tagId, versionRef, system, description, author, createdAt, false); + } + + // TODO auth + public static Future createTag(Marker marker, String spaceId, String tagId, Ref versionRef, boolean system, + String description, String author, long createdAt, boolean dryRun) { if (spaceId == null) { return Future.failedFuture(new ValidationException("Invalid parameter")); } @@ -186,7 +191,7 @@ public static Future createTag(Marker marker, String spaceId, String tagId, .withDescription(description) .withAuthor(author) .withCreatedAt(createdAt); - return Service.tagConfigClient.storeTag(marker, tag).map(v -> tag); + return dryRun ? Future.succeededFuture(tag) : Service.tagConfigClient.storeTag(marker, tag).map(v -> tag); }); } diff --git a/xyz-models/src/main/java/com/here/xyz/models/hub/Tag.java b/xyz-models/src/main/java/com/here/xyz/models/hub/Tag.java index c6d6ecaef5..6ec1d6a086 100644 --- a/xyz-models/src/main/java/com/here/xyz/models/hub/Tag.java +++ b/xyz-models/src/main/java/com/here/xyz/models/hub/Tag.java @@ -60,6 +60,9 @@ public class Tag implements XyzSerializable { @JsonView({Public.class}) private Ref versionRef; + @JsonView(Static.class) + private Long sharedVersion; + /** * The indicator that this tag is a system tag, which is not allowed to be deleted or modified by users. */ @@ -146,6 +149,19 @@ public Tag withVersionRef(Ref versionRef) { return this; } + public Long getSharedVersion() { + return sharedVersion; + } + + public void setSharedVersion(Long sharedVersion) { + this.sharedVersion = sharedVersion; + } + + public Tag withSharedVersion(Long sharedVersion) { + setSharedVersion(sharedVersion); + return this; + } + public boolean isSystem() { return system; }