diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java index 4efcffc02f0..3479f25af3d 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandler.java @@ -21,10 +21,12 @@ import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommand; import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommandPayload; import io.gravitee.cockpit.api.command.v1.designer.DeployModelReply; +import io.gravitee.definition.model.DefinitionVersion; import io.gravitee.exchange.api.command.CommandHandler; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UserEntity; import io.gravitee.rest.api.model.api.ApiEntityResult; +import io.gravitee.rest.api.model.v4.api.ApiEntity; import io.gravitee.rest.api.service.EnvironmentService; import io.gravitee.rest.api.service.UserService; import io.gravitee.rest.api.service.cockpit.model.DeploymentMode; @@ -86,8 +88,15 @@ public Single handle(DeployModelCommand command) { executionContext.getEnvironmentId(), apiCrossId ); + if (optApiId.isPresent()) { final String apiId = optApiId.get(); + final ApiEntity api = apiSearchService.findById(executionContext, apiId); + + if (api.getDefinitionVersion() == DefinitionVersion.V4) { + return Single.just(new DeployModelReply(command.getId(), "API migrated from v2 to v4. Update not yet supported.")); + } + var message = permissionChecker.checkUpdatePermission( executionContext, user.getId(), diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java index 1751a067924..7274ad0608a 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/rest/api/service/cockpit/command/handler/DeployModelCommandHandlerTest.java @@ -27,6 +27,7 @@ import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommand; import io.gravitee.cockpit.api.command.v1.designer.DeployModelCommandPayload; import io.gravitee.cockpit.api.command.v1.designer.DeployModelReply; +import io.gravitee.definition.model.DefinitionVersion; import io.gravitee.exchange.api.command.CommandStatus; import io.gravitee.rest.api.model.EnvironmentEntity; import io.gravitee.rest.api.model.UserEntity; @@ -208,6 +209,34 @@ public void creates_an_API_PUBLISHED_mode() throws InterruptedException { obs.assertValue(reply -> reply.getCommandId().equals(command.getId()) && reply.getCommandStatus().equals(CommandStatus.SUCCEEDED)); } + @Test + public void should_return_error_when_updating_migrated_v4_api() throws InterruptedException { + DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); + + DeployModelCommand command = new DeployModelCommand(payload); + + String apiId = "api#id"; + when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findById(EXECUTION_CONTEXT, apiId)).thenReturn( + io.gravitee.rest.api.model.v4.api.ApiEntity.builder().definitionVersion(DefinitionVersion.V4).build() + ); + + UserEntity user = createUserEntity(payload); + when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); + + cut + .handle(command) + .test() + .await() + .assertNoErrors() + .assertValue( + reply -> + reply.getCommandId().equals(command.getId()) && + reply.getCommandStatus().equals(CommandStatus.ERROR) && + reply.getErrorDetails().equals("API migrated from v2 to v4. Update not yet supported.") + ); + } + @Test public void updates_an_API_DOCUMENTED() throws InterruptedException { DeployModelCommandPayload payload = createDeployPayload(DeployModelCommandPayload.DeploymentMode.API_DOCUMENTED); @@ -216,6 +245,9 @@ public void updates_an_API_DOCUMENTED() throws InterruptedException { String apiId = "api#id"; when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findById(EXECUTION_CONTEXT, apiId)).thenReturn( + io.gravitee.rest.api.model.v4.api.ApiEntity.builder().definitionVersion(DefinitionVersion.V2).build() + ); UserEntity user = createUserEntity(payload); when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); @@ -254,6 +286,9 @@ public void updates_an_API_MOCKED_mode() throws InterruptedException { String apiId = "api#id"; when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findById(EXECUTION_CONTEXT, apiId)).thenReturn( + io.gravitee.rest.api.model.v4.api.ApiEntity.builder().definitionVersion(DefinitionVersion.V2).build() + ); UserEntity user = createUserEntity(payload); when(userService.findBySource(any(), eq("cockpit"), eq(payload.userId()), eq(true))).thenReturn(user); @@ -292,6 +327,9 @@ public void updates_an_API_PUBLISHED_mode() throws InterruptedException { String apiId = "api#id"; when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findById(EXECUTION_CONTEXT, apiId)).thenReturn( + io.gravitee.rest.api.model.v4.api.ApiEntity.builder().definitionVersion(DefinitionVersion.V2).build() + ); UserEntity user = createUserEntity(payload); when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user); @@ -422,6 +460,9 @@ public void fails_to_update_due_to_permission_issues() throws InterruptedExcepti String apiId = "api#id"; when(apiSearchService.findIdByEnvironmentIdAndCrossId(ENVIRONMENT_ID, payload.modelId())).thenReturn(Optional.of(apiId)); + when(apiSearchService.findById(EXECUTION_CONTEXT, apiId)).thenReturn( + io.gravitee.rest.api.model.v4.api.ApiEntity.builder().definitionVersion(DefinitionVersion.V2).build() + ); UserEntity user = createUserEntity(payload); when(userService.findBySource(ORGANIZATION_ID, "cockpit", payload.userId(), true)).thenReturn(user);