Browse Source

Add Version control REST API methods to Rest Client. Remove redudant branch request parameter from some version control REST API methods.

pull/6857/head
Igor Kulikov 4 years ago
parent
commit
4b5e94e3cc
  1. 4
      application/src/main/java/org/thingsboard/server/controller/AssetController.java
  2. 4
      application/src/main/java/org/thingsboard/server/controller/DeviceController.java
  3. 4
      application/src/main/java/org/thingsboard/server/controller/EdgeController.java
  4. 22
      application/src/main/java/org/thingsboard/server/controller/EntitiesVersionControlController.java
  5. 2
      application/src/main/java/org/thingsboard/server/service/asset/AssetBulkImportService.java
  6. 2
      application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java
  7. 2
      application/src/main/java/org/thingsboard/server/service/edge/EdgeBulkImportService.java
  8. 3
      application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java
  9. 10
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java
  10. 119
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java
  11. 6
      application/src/main/java/org/thingsboard/server/service/sync/vc/EntitiesVersionControlService.java
  12. 4
      application/src/main/java/org/thingsboard/server/service/sync/vc/GitVersionControlQueueService.java
  13. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportColumnType.java
  14. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportRequest.java
  15. 2
      common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportResult.java
  16. 3
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/BranchInfo.java
  17. 1
      common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/VersionLoadRequest.java
  18. 6
      common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/GitRepository.java
  19. 266
      rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java
  20. 6
      ui-ngx/src/app/core/http/entities-version-control.service.ts
  21. 4
      ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts
  22. 6
      ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts
  23. 4
      ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts
  24. 3
      ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts
  25. 1
      ui-ngx/src/app/shared/models/vc.models.ts

4
application/src/main/java/org/thingsboard/server/controller/AssetController.java

@ -51,8 +51,8 @@ import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.asset.AssetBulkImportService; import org.thingsboard.server.service.asset.AssetBulkImportService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportRequest; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportResult; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.service.entitiy.asset.TbAssetService; import org.thingsboard.server.service.entitiy.asset.TbAssetService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Operation;

4
application/src/main/java/org/thingsboard/server/controller/DeviceController.java

@ -66,8 +66,8 @@ import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.device.DeviceBulkImportService; import org.thingsboard.server.service.device.DeviceBulkImportService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportRequest; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportResult; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.service.entitiy.device.TbDeviceService; import org.thingsboard.server.service.entitiy.device.TbDeviceService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Operation;

4
application/src/main/java/org/thingsboard/server/controller/EdgeController.java

@ -53,8 +53,8 @@ import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.edge.EdgeBulkImportService; import org.thingsboard.server.service.edge.EdgeBulkImportService;
import org.thingsboard.server.service.entitiy.edge.TbEdgeService; import org.thingsboard.server.service.entitiy.edge.TbEdgeService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportRequest; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportResult; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Operation;
import org.thingsboard.server.service.security.permission.Resource; import org.thingsboard.server.service.security.permission.Resource;

22
application/src/main/java/org/thingsboard/server/controller/EntitiesVersionControlController.java

@ -310,15 +310,13 @@ public class EntitiesVersionControlController extends BaseController {
"Each entity item in the result has `externalId` property. " + "Each entity item in the result has `externalId` property. " +
"Entities order will be the same as in the repository." + "Entities order will be the same as in the repository." +
TENANT_AUTHORITY_PARAGRAPH) TENANT_AUTHORITY_PARAGRAPH)
@GetMapping(value = "/entity/{entityType}/{versionId}", params = {"branch"}) @GetMapping(value = "/entity/{entityType}/{versionId}")
public DeferredResult<List<VersionedEntityInfo>> listEntitiesAtVersion(@ApiParam(value = ENTITY_TYPE_PARAM_DESCRIPTION, required = true) public DeferredResult<List<VersionedEntityInfo>> listEntitiesAtVersion(@ApiParam(value = ENTITY_TYPE_PARAM_DESCRIPTION, required = true)
@PathVariable EntityType entityType, @PathVariable EntityType entityType,
@ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true) @ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true)
@PathVariable String versionId, @PathVariable String versionId) throws Exception {
@ApiParam(value = BRANCH_PARAM_DESCRIPTION, required = true)
@RequestParam String branch) throws Exception {
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ); accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ);
return wrapFuture(versionControlService.listEntitiesAtVersion(getTenantId(), branch, versionId, entityType)); return wrapFuture(versionControlService.listEntitiesAtVersion(getTenantId(), versionId, entityType));
} }
@ApiOperation(value = "List all entities at version (listAllEntitiesAtVersion)", notes = "" + @ApiOperation(value = "List all entities at version (listAllEntitiesAtVersion)", notes = "" +
@ -326,13 +324,11 @@ public class EntitiesVersionControlController extends BaseController {
"Response type is the same as for listAllEntitiesAtVersion API method. \n" + "Response type is the same as for listAllEntitiesAtVersion API method. \n" +
"Returned entities order will be the same as in the repository." + "Returned entities order will be the same as in the repository." +
TENANT_AUTHORITY_PARAGRAPH) TENANT_AUTHORITY_PARAGRAPH)
@GetMapping(value = "/entity/{versionId}", params = {"branch"}) @GetMapping(value = "/entity/{versionId}")
public DeferredResult<List<VersionedEntityInfo>> listAllEntitiesAtVersion(@ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true) public DeferredResult<List<VersionedEntityInfo>> listAllEntitiesAtVersion(@ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true)
@PathVariable String versionId, @PathVariable String versionId) throws Exception {
@ApiParam(value = BRANCH_PARAM_DESCRIPTION, required = true)
@RequestParam String branch) throws Exception {
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ); accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ);
return wrapFuture(versionControlService.listAllEntitiesAtVersion(getTenantId(), branch, versionId)); return wrapFuture(versionControlService.listAllEntitiesAtVersion(getTenantId(), versionId));
} }
@ApiOperation(value = "Get entity data info (getEntityDataInfo)", notes = "" + @ApiOperation(value = "Get entity data info (getEntityDataInfo)", notes = "" +
@ -357,18 +353,16 @@ public class EntitiesVersionControlController extends BaseController {
"Returns an object with current entity data and the one at a specific version. " + "Returns an object with current entity data and the one at a specific version. " +
"Entity data structure is the same as stored in a repository. " + "Entity data structure is the same as stored in a repository. " +
TENANT_AUTHORITY_PARAGRAPH) TENANT_AUTHORITY_PARAGRAPH)
@GetMapping(value = "/diff/{entityType}/{internalEntityUuid}", params = {"branch", "versionId"}) @GetMapping(value = "/diff/{entityType}/{internalEntityUuid}", params = {"versionId"})
public DeferredResult<EntityDataDiff> compareEntityDataToVersion(@ApiParam(value = ENTITY_TYPE_PARAM_DESCRIPTION, required = true) public DeferredResult<EntityDataDiff> compareEntityDataToVersion(@ApiParam(value = ENTITY_TYPE_PARAM_DESCRIPTION, required = true)
@PathVariable EntityType entityType, @PathVariable EntityType entityType,
@ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true) @ApiParam(value = ENTITY_ID_PARAM_DESCRIPTION, required = true)
@PathVariable UUID internalEntityUuid, @PathVariable UUID internalEntityUuid,
@ApiParam(value = BRANCH_PARAM_DESCRIPTION)
@RequestParam String branch,
@ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true) @ApiParam(value = VERSION_ID_PARAM_DESCRIPTION, required = true)
@RequestParam String versionId) throws Exception { @RequestParam String versionId) throws Exception {
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ); accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ);
EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, internalEntityUuid); EntityId entityId = EntityIdFactory.getByTypeAndUuid(entityType, internalEntityUuid);
return wrapFuture(versionControlService.compareEntityDataToVersion(getCurrentUser(), branch, entityId, versionId)); return wrapFuture(versionControlService.compareEntityDataToVersion(getCurrentUser(), entityId, versionId));
} }
@ApiOperation(value = "Load entities version (loadEntitiesVersion)", notes = "" + @ApiOperation(value = "Load entities version (loadEntitiesVersion)", notes = "" +

2
application/src/main/java/org/thingsboard/server/service/asset/AssetBulkImportService.java

@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService; import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportColumnType; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumnType;
import org.thingsboard.server.service.entitiy.asset.TbAssetService; import org.thingsboard.server.service.entitiy.asset.TbAssetService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;

2
application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java

@ -50,7 +50,7 @@ import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService; import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportColumnType; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumnType;
import org.thingsboard.server.service.entitiy.device.TbDeviceService; import org.thingsboard.server.service.entitiy.device.TbDeviceService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;

2
application/src/main/java/org/thingsboard/server/service/edge/EdgeBulkImportService.java

@ -29,7 +29,7 @@ import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService; import org.thingsboard.server.service.sync.ie.importing.csv.AbstractBulkImportService;
import org.thingsboard.server.service.sync.ie.importing.csv.BulkImportColumnType; import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumnType;
import org.thingsboard.server.service.entitiy.edge.TbEdgeService; import org.thingsboard.server.service.entitiy.edge.TbEdgeService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;

3
application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java

@ -39,6 +39,9 @@ import org.thingsboard.server.common.data.kv.AttributeKvEntry;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
import org.thingsboard.server.common.data.kv.DataType; import org.thingsboard.server.common.data.kv.DataType;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumnType;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.common.transport.adaptor.JsonConverter; import org.thingsboard.server.common.transport.adaptor.JsonConverter;
import org.thingsboard.server.controller.BaseController; import org.thingsboard.server.controller.BaseController;

10
application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java

@ -241,13 +241,13 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
} }
@Override @Override
public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId, EntityType entityType) throws Exception { public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId, EntityType entityType) throws Exception {
return gitServiceQueue.listEntitiesAtVersion(tenantId, branch, versionId, entityType); return gitServiceQueue.listEntitiesAtVersion(tenantId, versionId, entityType);
} }
@Override @Override
public ListenableFuture<List<VersionedEntityInfo>> listAllEntitiesAtVersion(TenantId tenantId, String branch, String versionId) throws Exception { public ListenableFuture<List<VersionedEntityInfo>> listAllEntitiesAtVersion(TenantId tenantId, String versionId) throws Exception {
return gitServiceQueue.listEntitiesAtVersion(tenantId, branch, versionId); return gitServiceQueue.listEntitiesAtVersion(tenantId, versionId);
} }
@SuppressWarnings({"UnstableApiUsage", "rawtypes"}) @SuppressWarnings({"UnstableApiUsage", "rawtypes"})
@ -451,7 +451,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
} }
@Override @Override
public ListenableFuture<EntityDataDiff> compareEntityDataToVersion(User user, String branch, EntityId entityId, String versionId) throws Exception { public ListenableFuture<EntityDataDiff> compareEntityDataToVersion(User user, EntityId entityId, String versionId) throws Exception {
HasId<EntityId> entity = exportableEntitiesService.findEntityByTenantIdAndId(user.getTenantId(), entityId); HasId<EntityId> entity = exportableEntitiesService.findEntityByTenantIdAndId(user.getTenantId(), entityId);
if (!(entity instanceof ExportableEntity)) throw new IllegalArgumentException("Unsupported entity type"); if (!(entity instanceof ExportableEntity)) throw new IllegalArgumentException("Unsupported entity type");

119
application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java

@ -245,7 +245,7 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
} }
@Override @Override
public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId, EntityType entityType) { public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId, EntityType entityType) {
return listEntitiesAtVersion(tenantId, ListEntitiesRequestMsg.newBuilder() return listEntitiesAtVersion(tenantId, ListEntitiesRequestMsg.newBuilder()
.setVersionId(versionId) .setVersionId(versionId)
.setEntityType(entityType.name()) .setEntityType(entityType.name())
@ -253,7 +253,7 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
} }
@Override @Override
public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId) { public ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId) {
return listEntitiesAtVersion(tenantId, ListEntitiesRequestMsg.newBuilder() return listEntitiesAtVersion(tenantId, ListEntitiesRequestMsg.newBuilder()
.setVersionId(versionId) .setVersionId(versionId)
.build()); .build());
@ -385,66 +385,71 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu
if (!StringUtils.isEmpty(vcResponseMsg.getError())) { if (!StringUtils.isEmpty(vcResponseMsg.getError())) {
future.setException(new RuntimeException(vcResponseMsg.getError())); future.setException(new RuntimeException(vcResponseMsg.getError()));
} else { } else {
if (vcResponseMsg.hasGenericResponse()) { try {
future.set(null); if (vcResponseMsg.hasGenericResponse()) {
} else if (vcResponseMsg.hasCommitResponse()) { future.set(null);
var commitResponse = vcResponseMsg.getCommitResponse(); } else if (vcResponseMsg.hasCommitResponse()) {
var commitResult = new VersionCreationResult(); var commitResponse = vcResponseMsg.getCommitResponse();
if (commitResponse.getTs() > 0) { var commitResult = new VersionCreationResult();
commitResult.setVersion(new EntityVersion(commitResponse.getTs(), commitResponse.getCommitId(), commitResponse.getName(), commitResponse.getAuthor())); if (commitResponse.getTs() > 0) {
} commitResult.setVersion(new EntityVersion(commitResponse.getTs(), commitResponse.getCommitId(), commitResponse.getName(), commitResponse.getAuthor()));
commitResult.setAdded(commitResponse.getAdded()); }
commitResult.setRemoved(commitResponse.getRemoved()); commitResult.setAdded(commitResponse.getAdded());
commitResult.setModified(commitResponse.getModified()); commitResult.setRemoved(commitResponse.getRemoved());
commitResult.setDone(true); commitResult.setModified(commitResponse.getModified());
((CommitGitRequest) request).getFuture().set(commitResult); commitResult.setDone(true);
} else if (vcResponseMsg.hasListBranchesResponse()) { ((CommitGitRequest) request).getFuture().set(commitResult);
var listBranchesResponse = vcResponseMsg.getListBranchesResponse(); } else if (vcResponseMsg.hasListBranchesResponse()) {
((ListBranchesGitRequest) request).getFuture().set(listBranchesResponse.getBranchesList().stream().map(this::getBranchInfo).collect(Collectors.toList())); var listBranchesResponse = vcResponseMsg.getListBranchesResponse();
} else if (vcResponseMsg.hasListEntitiesResponse()) { ((ListBranchesGitRequest) request).getFuture().set(listBranchesResponse.getBranchesList().stream().map(this::getBranchInfo).collect(Collectors.toList()));
var listEntitiesResponse = vcResponseMsg.getListEntitiesResponse(); } else if (vcResponseMsg.hasListEntitiesResponse()) {
((ListEntitiesGitRequest) request).getFuture().set( var listEntitiesResponse = vcResponseMsg.getListEntitiesResponse();
listEntitiesResponse.getEntitiesList().stream().map(this::getVersionedEntityInfo).collect(Collectors.toList())); ((ListEntitiesGitRequest) request).getFuture().set(
} else if (vcResponseMsg.hasListVersionsResponse()) { listEntitiesResponse.getEntitiesList().stream().map(this::getVersionedEntityInfo).collect(Collectors.toList()));
var listVersionsResponse = vcResponseMsg.getListVersionsResponse(); } else if (vcResponseMsg.hasListVersionsResponse()) {
((ListVersionsGitRequest) request).getFuture().set(toPageData(listVersionsResponse)); var listVersionsResponse = vcResponseMsg.getListVersionsResponse();
} else if (vcResponseMsg.hasEntityContentResponse()) { ((ListVersionsGitRequest) request).getFuture().set(toPageData(listVersionsResponse));
TransportProtos.EntityContentResponseMsg responseMsg = vcResponseMsg.getEntityContentResponse(); } else if (vcResponseMsg.hasEntityContentResponse()) {
log.trace("[{}] received chunk {} for 'getEntity'", responseMsg.getChunkedMsgId(), responseMsg.getChunkIndex()); TransportProtos.EntityContentResponseMsg responseMsg = vcResponseMsg.getEntityContentResponse();
var joined = joinChunks(requestId, responseMsg, 1); log.trace("[{}] received chunk {} for 'getEntity'", responseMsg.getChunkedMsgId(), responseMsg.getChunkIndex());
if (joined.isPresent()) { var joined = joinChunks(requestId, responseMsg, 1);
log.trace("[{}] collected all chunks for 'getEntity'", responseMsg.getChunkedMsgId());
((EntityContentGitRequest) request).getFuture().set(joined.get().get(0));
} else {
completed = false;
}
} else if (vcResponseMsg.hasEntitiesContentResponse()) {
TransportProtos.EntitiesContentResponseMsg responseMsg = vcResponseMsg.getEntitiesContentResponse();
TransportProtos.EntityContentResponseMsg item = responseMsg.getItem();
if (responseMsg.getItemsCount() > 0) {
var joined = joinChunks(requestId, item, responseMsg.getItemsCount());
if (joined.isPresent()) { if (joined.isPresent()) {
((EntitiesContentGitRequest) request).getFuture().set(joined.get()); log.trace("[{}] collected all chunks for 'getEntity'", responseMsg.getChunkedMsgId());
((EntityContentGitRequest) request).getFuture().set(joined.get().get(0));
} else { } else {
completed = false; completed = false;
} }
} else { } else if (vcResponseMsg.hasEntitiesContentResponse()) {
((EntitiesContentGitRequest) request).getFuture().set(Collections.emptyList()); TransportProtos.EntitiesContentResponseMsg responseMsg = vcResponseMsg.getEntitiesContentResponse();
TransportProtos.EntityContentResponseMsg item = responseMsg.getItem();
if (responseMsg.getItemsCount() > 0) {
var joined = joinChunks(requestId, item, responseMsg.getItemsCount());
if (joined.isPresent()) {
((EntitiesContentGitRequest) request).getFuture().set(joined.get());
} else {
completed = false;
}
} else {
((EntitiesContentGitRequest) request).getFuture().set(Collections.emptyList());
}
} else if (vcResponseMsg.hasVersionsDiffResponse()) {
TransportProtos.VersionsDiffResponseMsg diffResponse = vcResponseMsg.getVersionsDiffResponse();
List<EntityVersionsDiff> entityVersionsDiffList = diffResponse.getDiffList().stream()
.map(diff -> EntityVersionsDiff.builder()
.externalId(EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(diff.getEntityType()),
new UUID(diff.getEntityIdMSB(), diff.getEntityIdLSB())))
.entityDataAtVersion1(StringUtils.isNotEmpty(diff.getEntityDataAtVersion1()) ?
toData(diff.getEntityDataAtVersion1()) : null)
.entityDataAtVersion2(StringUtils.isNotEmpty(diff.getEntityDataAtVersion2()) ?
toData(diff.getEntityDataAtVersion2()) : null)
.rawDiff(diff.getRawDiff())
.build())
.collect(Collectors.toList());
((VersionsDiffGitRequest) request).getFuture().set(entityVersionsDiffList);
} }
} else if (vcResponseMsg.hasVersionsDiffResponse()) { } catch (Exception e) {
TransportProtos.VersionsDiffResponseMsg diffResponse = vcResponseMsg.getVersionsDiffResponse(); future.setException(e);
List<EntityVersionsDiff> entityVersionsDiffList = diffResponse.getDiffList().stream() throw e;
.map(diff -> EntityVersionsDiff.builder()
.externalId(EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(diff.getEntityType()),
new UUID(diff.getEntityIdMSB(), diff.getEntityIdLSB())))
.entityDataAtVersion1(StringUtils.isNotEmpty(diff.getEntityDataAtVersion1()) ?
toData(diff.getEntityDataAtVersion1()) : null)
.entityDataAtVersion2(StringUtils.isNotEmpty(diff.getEntityDataAtVersion2()) ?
toData(diff.getEntityDataAtVersion2()) : null)
.rawDiff(diff.getRawDiff())
.build())
.collect(Collectors.toList());
((VersionsDiffGitRequest) request).getFuture().set(entityVersionsDiffList);
} }
} }
if (completed) { if (completed) {

6
application/src/main/java/org/thingsboard/server/service/sync/vc/EntitiesVersionControlService.java

@ -49,15 +49,15 @@ public interface EntitiesVersionControlService {
ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, PageLink pageLink) throws Exception; ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, PageLink pageLink) throws Exception;
ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId, EntityType entityType) throws Exception; ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId, EntityType entityType) throws Exception;
ListenableFuture<List<VersionedEntityInfo>> listAllEntitiesAtVersion(TenantId tenantId, String branch, String versionId) throws Exception; ListenableFuture<List<VersionedEntityInfo>> listAllEntitiesAtVersion(TenantId tenantId, String versionId) throws Exception;
UUID loadEntitiesVersion(User user, VersionLoadRequest request) throws Exception; UUID loadEntitiesVersion(User user, VersionLoadRequest request) throws Exception;
VersionLoadResult getVersionLoadStatus(User user, UUID requestId) throws ThingsboardException; VersionLoadResult getVersionLoadStatus(User user, UUID requestId) throws ThingsboardException;
ListenableFuture<EntityDataDiff> compareEntityDataToVersion(User user, String branch, EntityId entityId, String versionId) throws Exception; ListenableFuture<EntityDataDiff> compareEntityDataToVersion(User user, EntityId entityId, String versionId) throws Exception;
ListenableFuture<List<BranchInfo>> listBranches(TenantId tenantId) throws Exception; ListenableFuture<List<BranchInfo>> listBranches(TenantId tenantId) throws Exception;

4
application/src/main/java/org/thingsboard/server/service/sync/vc/GitVersionControlQueueService.java

@ -52,9 +52,9 @@ public interface GitVersionControlQueueService {
ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityId entityId, PageLink pageLink); ListenableFuture<PageData<EntityVersion>> listVersions(TenantId tenantId, String branch, EntityId entityId, PageLink pageLink);
ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId, EntityType entityType); ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId, EntityType entityType);
ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String branch, String versionId); ListenableFuture<List<VersionedEntityInfo>> listEntitiesAtVersion(TenantId tenantId, String versionId);
ListenableFuture<List<BranchInfo>> listBranches(TenantId tenantId); ListenableFuture<List<BranchInfo>> listBranches(TenantId tenantId);

2
application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/BulkImportColumnType.java → common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportColumnType.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.server.service.sync.ie.importing.csv; package org.thingsboard.server.common.data.sync.ie.importing.csv;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;

2
application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/BulkImportRequest.java → common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportRequest.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.server.service.sync.ie.importing.csv; package org.thingsboard.server.common.data.sync.ie.importing.csv;
import lombok.Data; import lombok.Data;

2
application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/BulkImportResult.java → common/data/src/main/java/org/thingsboard/server/common/data/sync/ie/importing/csv/BulkImportResult.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.server.service.sync.ie.importing.csv; package org.thingsboard.server.common.data.sync.ie.importing.csv;
import lombok.Data; import lombok.Data;

3
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/BranchInfo.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.common.data.sync.vc; package org.thingsboard.server.common.data.sync.vc;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import java.util.Objects; import java.util.Objects;
@ -22,6 +23,8 @@ import java.util.Objects;
@Data @Data
public class BranchInfo { public class BranchInfo {
private final String name; private final String name;
@JsonProperty("default")
private final boolean isDefault; private final boolean isDefault;
@Override @Override

1
common/data/src/main/java/org/thingsboard/server/common/data/sync/vc/request/load/VersionLoadRequest.java

@ -29,7 +29,6 @@ import static com.fasterxml.jackson.annotation.JsonSubTypes.Type;
@Data @Data
public abstract class VersionLoadRequest { public abstract class VersionLoadRequest {
private String branch;
private String versionId; private String versionId;
public abstract VersionLoadRequestType getType(); public abstract VersionLoadRequestType getType();

6
common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/GitRepository.java

@ -354,7 +354,11 @@ public class GitRepository {
} }
private ObjectId resolve(String rev) throws IOException { private ObjectId resolve(String rev) throws IOException {
return git.getRepository().resolve(rev); ObjectId result = git.getRepository().resolve(rev);
if (result == null) {
throw new IllegalArgumentException("Failed to parse git revision string: \"" + rev + "\"");
}
return result;
} }
private <C extends GitCommand<T>, T> T execute(C command) throws GitAPIException { private <C extends GitCommand<T>, T> T execute(C command) throws GitAPIException {

266
rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java

@ -51,6 +51,7 @@ import org.thingsboard.server.common.data.DeviceProfileInfo;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.EntityViewInfo; import org.thingsboard.server.common.data.EntityViewInfo;
import org.thingsboard.server.common.data.Event; import org.thingsboard.server.common.data.Event;
@ -77,6 +78,7 @@ import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.device.DeviceSearchQuery; import org.thingsboard.server.common.data.device.DeviceSearchQuery;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.edge.EdgeInfo;
import org.thingsboard.server.common.data.edge.EdgeSearchQuery; import org.thingsboard.server.common.data.edge.EdgeSearchQuery;
import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery;
import org.thingsboard.server.common.data.id.AlarmId; import org.thingsboard.server.common.data.id.AlarmId;
@ -134,6 +136,19 @@ import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.common.data.security.model.SecuritySettings; import org.thingsboard.server.common.data.security.model.SecuritySettings;
import org.thingsboard.server.common.data.security.model.UserPasswordPolicy; import org.thingsboard.server.common.data.security.model.UserPasswordPolicy;
import org.thingsboard.server.common.data.sms.config.TestSmsRequest; import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.common.data.sync.vc.AutoCommitSettings;
import org.thingsboard.server.common.data.sync.vc.BranchInfo;
import org.thingsboard.server.common.data.sync.vc.EntityDataDiff;
import org.thingsboard.server.common.data.sync.vc.EntityDataInfo;
import org.thingsboard.server.common.data.sync.vc.EntityVersion;
import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
import org.thingsboard.server.common.data.sync.vc.VersionCreationResult;
import org.thingsboard.server.common.data.sync.vc.VersionLoadResult;
import org.thingsboard.server.common.data.sync.vc.VersionedEntityInfo;
import org.thingsboard.server.common.data.sync.vc.request.create.VersionCreateRequest;
import org.thingsboard.server.common.data.sync.vc.request.load.VersionLoadRequest;
import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
import org.thingsboard.server.common.data.widget.WidgetTypeInfo; import org.thingsboard.server.common.data.widget.WidgetTypeInfo;
@ -147,11 +162,12 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.springframework.util.StringUtils.isEmpty; import static org.thingsboard.server.common.data.StringUtils.isEmpty;
/** /**
* @author Andrew Shvayka * @author Andrew Shvayka
@ -267,6 +283,60 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
return restTemplate.postForEntity(baseURL + "/api/admin/securitySettings", securitySettings, SecuritySettings.class).getBody(); return restTemplate.postForEntity(baseURL + "/api/admin/securitySettings", securitySettings, SecuritySettings.class).getBody();
} }
public Optional<RepositorySettings> getRepositorySettings() {
try {
ResponseEntity<RepositorySettings> repositorySettings = restTemplate.getForEntity(baseURL + "/api/admin/repositorySettings", RepositorySettings.class);
return Optional.ofNullable(repositorySettings.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public Boolean repositorySettingsExists() {
return restTemplate.getForEntity(baseURL + "/api/admin/repositorySettings/exists", Boolean.class).getBody();
}
public RepositorySettings saveRepositorySettings(RepositorySettings repositorySettings) {
return restTemplate.postForEntity(baseURL + "/api/admin/repositorySettings", repositorySettings, RepositorySettings.class).getBody();
}
public void deleteRepositorySettings() {
restTemplate.delete(baseURL + "/api/admin/repositorySettings");
}
public void checkRepositoryAccess(RepositorySettings repositorySettings) {
restTemplate.postForLocation(baseURL + "/api/admin/repositorySettings/checkAccess", repositorySettings);
}
public Optional<AutoCommitSettings> getAutoCommitSettings() {
try {
ResponseEntity<AutoCommitSettings> autoCommitSettings = restTemplate.getForEntity(baseURL + "/api/admin/autoCommitSettings", AutoCommitSettings.class);
return Optional.ofNullable(autoCommitSettings.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public Boolean autoCommitSettingsExists() {
return restTemplate.getForEntity(baseURL + "/api/admin/autoCommitSettings/exists", Boolean.class).getBody();
}
public AutoCommitSettings saveAutoCommitSettings(AutoCommitSettings autoCommitSettings) {
return restTemplate.postForEntity(baseURL + "/api/admin/autoCommitSettings", autoCommitSettings, AutoCommitSettings.class).getBody();
}
public void deleteAutoCommitSettings() {
restTemplate.delete(baseURL + "/api/admin/autoCommitSettings");
}
public Optional<UpdateMessage> checkUpdates() { public Optional<UpdateMessage> checkUpdates() {
try { try {
ResponseEntity<UpdateMessage> updateMsg = restTemplate.getForEntity(baseURL + "/api/admin/updates", UpdateMessage.class); ResponseEntity<UpdateMessage> updateMsg = restTemplate.getForEntity(baseURL + "/api/admin/updates", UpdateMessage.class);
@ -550,6 +620,15 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
}).getBody(); }).getBody();
} }
public BulkImportResult<Asset> processAssetsBulkImport(BulkImportRequest request) {
return restTemplate.exchange(
baseURL + "/api/asset/bulk_import",
HttpMethod.POST,
new HttpEntity<>(request),
new ParameterizedTypeReference<BulkImportResult<Asset>>() {
}).getBody();
}
@Deprecated @Deprecated
public Optional<Asset> findAsset(String name) { public Optional<Asset> findAsset(String name) {
Map<String, String> params = new HashMap<String, String>(); Map<String, String> params = new HashMap<String, String>();
@ -1251,7 +1330,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
HttpEntity.EMPTY, Device.class, tenantId, deviceId).getBody(); HttpEntity.EMPTY, Device.class, tenantId, deviceId).getBody();
} }
public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(OtaPackageType otaPackageType, DeviceProfileId deviceProfileId) { public Long countByDeviceProfileAndEmptyOtaPackage(OtaPackageType otaPackageType, DeviceProfileId deviceProfileId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("otaPackageType", otaPackageType.name()); params.put("otaPackageType", otaPackageType.name());
params.put("deviceProfileId", deviceProfileId.getId().toString()); params.put("deviceProfileId", deviceProfileId.getId().toString());
@ -1266,6 +1345,15 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
).getBody(); ).getBody();
} }
public BulkImportResult<Device> processDevicesBulkImport(BulkImportRequest request) {
return restTemplate.exchange(
baseURL + "/api/device/bulk_import",
HttpMethod.POST,
new HttpEntity<>(request),
new ParameterizedTypeReference<BulkImportResult<Device>>() {
}).getBody();
}
@Deprecated @Deprecated
public Device createDevice(String name, String type) { public Device createDevice(String name, String type) {
Device device = new Device(); Device device = new Device();
@ -2499,6 +2587,10 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
} }
} }
public Boolean isEdgesSupportEnabled() {
return restTemplate.getForEntity(baseURL + "/api/edges/enabled", Boolean.class).getBody();
}
public Edge saveEdge(Edge edge) { public Edge saveEdge(Edge edge) {
return restTemplate.postForEntity(baseURL + "/api/edge", edge, Edge.class).getBody(); return restTemplate.postForEntity(baseURL + "/api/edge", edge, Edge.class).getBody();
} }
@ -2520,6 +2612,19 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
} }
} }
public Optional<EdgeInfo> getEdgeInfoById(EdgeId edgeId) {
try {
ResponseEntity<EdgeInfo> edge = restTemplate.getForEntity(baseURL + "/api/edge/info/{edgeId}", EdgeInfo.class, edgeId.getId());
return Optional.ofNullable(edge.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public Optional<Edge> assignEdgeToCustomer(CustomerId customerId, EdgeId edgeId) { public Optional<Edge> assignEdgeToCustomer(CustomerId customerId, EdgeId edgeId) {
try { try {
ResponseEntity<Edge> edge = restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/edge/{edgeId}", null, Edge.class, customerId.getId(), edgeId.getId()); ResponseEntity<Edge> edge = restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/edge/{edgeId}", null, Edge.class, customerId.getId(), edgeId.getId());
@ -2546,7 +2651,7 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
} }
} }
public Optional<Edge> setRootRuleChain(EdgeId edgeId, RuleChainId ruleChainId) { public Optional<Edge> setEdgeRootRuleChain(EdgeId edgeId, RuleChainId ruleChainId) {
try { try {
ResponseEntity<Edge> ruleChain = restTemplate.postForEntity(baseURL + "/api/edge/{edgeId}/{ruleChainId}/root", null, Edge.class, edgeId.getId(), ruleChainId.getId()); ResponseEntity<Edge> ruleChain = restTemplate.postForEntity(baseURL + "/api/edge/{edgeId}/{ruleChainId}/root", null, Edge.class, edgeId.getId(), ruleChainId.getId());
return Optional.ofNullable(ruleChain.getBody()); return Optional.ofNullable(ruleChain.getBody());
@ -2827,6 +2932,17 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
}, params).getBody(); }, params).getBody();
} }
public PageData<EdgeInfo> getTenantEdgeInfos(String type, PageLink pageLink) {
Map<String, String> params = new HashMap<>();
params.put("type", type);
addPageLinkToParam(params, pageLink);
return restTemplate.exchange(
baseURL + "/api/tenant/edgeInfos?type={type}&" + getUrlParams(pageLink),
HttpMethod.GET, HttpEntity.EMPTY,
new ParameterizedTypeReference<PageData<EdgeInfo>>() {
}, params).getBody();
}
public Optional<Edge> getTenantEdge(String edgeName) { public Optional<Edge> getTenantEdge(String edgeName) {
try { try {
ResponseEntity<Edge> edge = restTemplate.getForEntity(baseURL + "/api/tenant/edges?edgeName={edgeName}", Edge.class, edgeName); ResponseEntity<Edge> edge = restTemplate.getForEntity(baseURL + "/api/tenant/edges?edgeName={edgeName}", Edge.class, edgeName);
@ -2852,6 +2968,18 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
}, params).getBody(); }, params).getBody();
} }
public PageData<EdgeInfo> getCustomerEdgeInfos(CustomerId customerId, PageLink pageLink, String edgeType) {
Map<String, String> params = new HashMap<>();
params.put("customerId", customerId.getId().toString());
params.put("type", edgeType);
addPageLinkToParam(params, pageLink);
return restTemplate.exchange(
baseURL + "/api/customer/{customerId}/edgeInfos?type={type}&" + getUrlParams(pageLink),
HttpMethod.GET, HttpEntity.EMPTY,
new ParameterizedTypeReference<PageData<EdgeInfo>>() {
}, params).getBody();
}
public List<Edge> getEdgesByIds(List<EdgeId> edgeIds) { public List<Edge> getEdgesByIds(List<EdgeId> edgeIds) {
return restTemplate.exchange(baseURL + "/api/edges?edgeIds={edgeIds}", return restTemplate.exchange(baseURL + "/api/edges?edgeIds={edgeIds}",
HttpMethod.GET, HttpMethod.GET,
@ -2896,6 +3024,138 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params); restTemplate.postForEntity(baseURL + "/api/edge/sync/{edgeId}", null, EdgeId.class, params);
} }
public String findMissingToRelatedRuleChains(EdgeId edgeId) {
return restTemplate.getForEntity(baseURL + "/api/edge/missingToRelatedRuleChains/{edgeId}", String.class, edgeId.getId()).getBody();
}
public BulkImportResult<Edge> processEdgesBulkImport(BulkImportRequest request) {
return restTemplate.exchange(
baseURL + "/api/edge/bulk_import",
HttpMethod.POST,
new HttpEntity<>(request),
new ParameterizedTypeReference<BulkImportResult<Edge>>() {
}).getBody();
}
public UUID saveEntitiesVersion(VersionCreateRequest request) {
return restTemplate.postForEntity(baseURL + "/api/entities/vc/version", request, UUID.class).getBody();
}
public Optional<VersionCreationResult> getVersionCreateRequestStatus(UUID requestId) {
try {
ResponseEntity<VersionCreationResult> versionCreateResult = restTemplate.getForEntity(baseURL + "/api/entities/vc/version/{requestId}/status", VersionCreationResult.class, requestId);
return Optional.ofNullable(versionCreateResult.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public PageData<EntityVersion> listEntityVersions(EntityId externalEntityId, String branch, PageLink pageLink) {
Map<String, String> params = new HashMap<>();
params.put("entityType", externalEntityId.getEntityType().name());
params.put("externalEntityUuid", externalEntityId.getId().toString());
params.put("branch", branch);
addPageLinkToParam(params, pageLink);
return restTemplate.exchange(
baseURL + "/api/entities/vc/version/{entityType}/{externalEntityUuid}?branch={branch}&" + getUrlParams(pageLink),
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<PageData<EntityVersion>>() {
},
params).getBody();
}
public PageData<EntityVersion> listEntityTypeVersions(EntityType entityType, String branch, PageLink pageLink) {
Map<String, String> params = new HashMap<>();
params.put("entityType", entityType.name());
params.put("branch", branch);
addPageLinkToParam(params, pageLink);
return restTemplate.exchange(
baseURL + "/api/entities/vc/version/{entityType}?branch={branch}&" + getUrlParams(pageLink),
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<PageData<EntityVersion>>() {
},
params).getBody();
}
public PageData<EntityVersion> listVersions(String branch, PageLink pageLink) {
Map<String, String> params = new HashMap<>();
params.put("branch", branch);
addPageLinkToParam(params, pageLink);
return restTemplate.exchange(
baseURL + "/api/entities/vc/version?branch={branch}&" + getUrlParams(pageLink),
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<PageData<EntityVersion>>() {
},
params).getBody();
}
public List<VersionedEntityInfo> listEntitiesAtVersion(EntityType entityType, String versionId) {
Map<String, String> params = new HashMap<>();
params.put("entityType", entityType.name());
params.put("versionId", versionId);
return restTemplate.exchange(
baseURL + "/api/entities/vc/entity/{entityType}/{versionId}",
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<List<VersionedEntityInfo>>() {
},
params).getBody();
}
public List<VersionedEntityInfo> listAllEntitiesAtVersion(String versionId) {
Map<String, String> params = new HashMap<>();
params.put("versionId", versionId);
return restTemplate.exchange(
baseURL + "/api/entities/vc/entity/{versionId}",
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<List<VersionedEntityInfo>>() {
},
params).getBody();
}
public EntityDataInfo getEntityDataInfo(EntityId externalEntityId, String versionId) {
return restTemplate.getForEntity(baseURL + "/api/entities/vc/info/{versionId}/{entityType}/{externalEntityUuid}",
EntityDataInfo.class, versionId, externalEntityId.getEntityType(), externalEntityId.getId()).getBody();
}
public EntityDataDiff compareEntityDataToVersion(EntityId internalEntityId, String versionId) {
return restTemplate.getForEntity(baseURL + "/api/entities/vc/diff/{entityType}/{internalEntityUuid}?versionId={versionId}",
EntityDataDiff.class, internalEntityId.getEntityType(), internalEntityId.getId(), versionId).getBody();
}
public UUID loadEntitiesVersion(VersionLoadRequest request) {
return restTemplate.postForEntity(baseURL + "/api/entities/vc/entity", request, UUID.class).getBody();
}
public Optional<VersionLoadResult> getVersionLoadRequestStatus(UUID requestId) {
try {
ResponseEntity<VersionLoadResult> versionLoadResult = restTemplate.getForEntity(baseURL + "/api/entities/vc/entity/{requestId}/status", VersionLoadResult.class, requestId);
return Optional.ofNullable(versionLoadResult.getBody());
} catch (HttpClientErrorException exception) {
if (exception.getStatusCode() == HttpStatus.NOT_FOUND) {
return Optional.empty();
} else {
throw exception;
}
}
}
public List<BranchInfo> listBranches() {
return restTemplate.exchange(
baseURL + "/api/entities/vc/branches",
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<List<BranchInfo>>() {
}).getBody();
}
public ResponseEntity<Resource> downloadResource(TbResourceId resourceId) { public ResponseEntity<Resource> downloadResource(TbResourceId resourceId) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("resourceId", resourceId.getId().toString()); params.put("resourceId", resourceId.getId().toString());

6
ui-ngx/src/app/core/http/entities-version-control.service.ts

@ -158,12 +158,10 @@ export class EntitiesVersionControlService {
defaultHttpOptionsFromConfig({...config, ...{ignoreLoading: true}})); defaultHttpOptionsFromConfig({...config, ...{ignoreLoading: true}}));
} }
public compareEntityDataToVersion(branch: string, public compareEntityDataToVersion(entityId: EntityId,
entityId: EntityId,
versionId: string, versionId: string,
config?: RequestConfig): Observable<EntityDataDiff> { config?: RequestConfig): Observable<EntityDataDiff> {
const encodedBranch = encodeURIComponent(branch); return this.http.get<EntityDataDiff>(`/api/entities/vc/diff/${entityId.entityType}/${entityId.id}?versionId=${versionId}`,
return this.http.get<EntityDataDiff>(`/api/entities/vc/diff/${entityId.entityType}/${entityId.id}?branch=${encodedBranch}&versionId=${versionId}`,
defaultHttpOptionsFromConfig(config)); defaultHttpOptionsFromConfig(config));
} }

4
ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts

@ -41,9 +41,6 @@ import { parseHttpErrorMessage } from '@core/utils';
}) })
export class ComplexVersionLoadComponent extends PageComponent implements OnInit, OnDestroy { export class ComplexVersionLoadComponent extends PageComponent implements OnInit, OnDestroy {
@Input()
branch: string;
@Input() @Input()
versionName: string; versionName: string;
@ -117,7 +114,6 @@ export class ComplexVersionLoadComponent extends PageComponent implements OnInit
restore(): void { restore(): void {
const request: EntityTypeVersionLoadRequest = { const request: EntityTypeVersionLoadRequest = {
branch: this.branch,
versionId: this.versionId, versionId: this.versionId,
entityTypes: this.loadVersionFormGroup.get('entityTypes').value, entityTypes: this.loadVersionFormGroup.get('entityTypes').value,
type: VersionLoadRequestType.ENTITY_TYPE type: VersionLoadRequestType.ENTITY_TYPE

6
ui-ngx/src/app/modules/home/components/vc/entity-version-diff.component.ts

@ -59,9 +59,6 @@ export class EntityVersionDiffComponent extends PageComponent implements OnInit,
@ViewChild('diffViewer', {static: true}) @ViewChild('diffViewer', {static: true})
diffViewerElmRef: ElementRef<HTMLElement>; diffViewerElmRef: ElementRef<HTMLElement>;
@Input()
branch: string;
@Input() @Input()
versionName: string; versionName: string;
@ -108,7 +105,7 @@ export class EntityVersionDiffComponent extends PageComponent implements OnInit,
ngOnInit(): void { ngOnInit(): void {
this.entitiesVersionControlService this.entitiesVersionControlService
.compareEntityDataToVersion(this.branch, this.entityId, this.versionId).subscribe((diffData) => { .compareEntityDataToVersion(this.entityId, this.versionId).subscribe((diffData) => {
const leftContent = entityExportDataToJsonString(diffData.currentVersion); const leftContent = entityExportDataToJsonString(diffData.currentVersion);
const rightContent = entityExportDataToJsonString(diffData.otherVersion); const rightContent = entityExportDataToJsonString(diffData.otherVersion);
const leftLines = leftContent.split('\n').length; const leftLines = leftContent.split('\n').length;
@ -310,7 +307,6 @@ export class EntityVersionDiffComponent extends PageComponent implements OnInit,
const restoreVersionPopover = this.popoverService.displayPopover(trigger, this.renderer, const restoreVersionPopover = this.popoverService.displayPopover(trigger, this.renderer,
this.viewContainerRef, EntityVersionRestoreComponent, 'leftTop', true, null, this.viewContainerRef, EntityVersionRestoreComponent, 'leftTop', true, null,
{ {
branch: this.branch,
versionName: this.versionName, versionName: this.versionName,
versionId: this.versionId, versionId: this.versionId,
externalEntityId: this.externalEntityId, externalEntityId: this.externalEntityId,

4
ui-ngx/src/app/modules/home/components/vc/entity-version-restore.component.ts

@ -41,9 +41,6 @@ import { parseHttpErrorMessage } from '@core/utils';
}) })
export class EntityVersionRestoreComponent extends PageComponent implements OnInit, OnDestroy { export class EntityVersionRestoreComponent extends PageComponent implements OnInit, OnDestroy {
@Input()
branch: string;
@Input() @Input()
versionName: string; versionName: string;
@ -108,7 +105,6 @@ export class EntityVersionRestoreComponent extends PageComponent implements OnIn
restore(): void { restore(): void {
const request: SingleEntityVersionLoadRequest = { const request: SingleEntityVersionLoadRequest = {
branch: this.branch,
versionId: this.versionId, versionId: this.versionId,
externalEntityId: this.externalEntityId, externalEntityId: this.externalEntityId,
config: { config: {

3
ui-ngx/src/app/modules/home/components/vc/entity-versions-table.component.ts

@ -260,7 +260,6 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
const diffVersionPopover = this.popoverService.displayPopover(trigger, this.renderer, const diffVersionPopover = this.popoverService.displayPopover(trigger, this.renderer,
this.viewContainerRef, EntityVersionDiffComponent, 'leftTop', true, null, this.viewContainerRef, EntityVersionDiffComponent, 'leftTop', true, null,
{ {
branch: this.branch,
versionName: entityVersion.name, versionName: entityVersion.name,
versionId: entityVersion.id, versionId: entityVersion.id,
entityId: this.entityId, entityId: this.entityId,
@ -284,7 +283,6 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
const restoreVersionPopover = this.popoverService.displayPopover(trigger, this.renderer, const restoreVersionPopover = this.popoverService.displayPopover(trigger, this.renderer,
this.viewContainerRef, EntityVersionRestoreComponent, 'leftTop', true, null, this.viewContainerRef, EntityVersionRestoreComponent, 'leftTop', true, null,
{ {
branch: this.branch,
versionName: entityVersion.name, versionName: entityVersion.name,
versionId: entityVersion.id, versionId: entityVersion.id,
externalEntityId: this.externalEntityIdValue, externalEntityId: this.externalEntityIdValue,
@ -310,7 +308,6 @@ export class EntityVersionsTableComponent extends PageComponent implements OnIni
const restoreEntitiesVersionPopover = this.popoverService.displayPopover(trigger, this.renderer, const restoreEntitiesVersionPopover = this.popoverService.displayPopover(trigger, this.renderer,
this.viewContainerRef, ComplexVersionLoadComponent, 'leftTop', true, null, this.viewContainerRef, ComplexVersionLoadComponent, 'leftTop', true, null,
{ {
branch: this.branch,
versionName: entityVersion.name, versionName: entityVersion.name,
versionId: entityVersion.id, versionId: entityVersion.id,
onClose: (result: VersionLoadResult | null) => { onClose: (result: VersionLoadResult | null) => {

1
ui-ngx/src/app/shared/models/vc.models.ts

@ -113,7 +113,6 @@ export enum VersionLoadRequestType {
} }
export interface VersionLoadRequest { export interface VersionLoadRequest {
branch: string;
versionId: string; versionId: string;
type: VersionLoadRequestType; type: VersionLoadRequestType;
} }

Loading…
Cancel
Save