Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import io.gravitee.apim.core.api.model.import_definition.ApiExport;
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
import io.gravitee.rest.api.management.v2.rest.model.ExportApiV4;
import io.gravitee.rest.api.management.v2.rest.model.Member;
Expand All @@ -30,6 +31,7 @@
import io.gravitee.rest.api.model.v4.nativeapi.NativeApiEntity;
import io.gravitee.rest.api.model.v4.plan.GenericPlanEntity;
import io.gravitee.rest.api.model.v4.plan.PlanEntity;
import java.util.Optional;
import java.util.Set;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand Down Expand Up @@ -58,6 +60,22 @@ default ApiExport buildApiExport(ExportApiV4 exportApiV4) {
final ApiExport apiExport = ApiMapper.INSTANCE.toApiExport(exportApiV4.getApi());
apiExport.setPicture(exportApiV4.getApiPicture());
apiExport.setBackground(exportApiV4.getApiBackground());
Optional.ofNullable(exportApiV4)
.map(ExportApiV4::getApi)
.map(ApiV4::getPrimaryOwner)
.ifPresent(po -> {
var type = Optional.ofNullable(po.getType())
.map(t -> PrimaryOwnerEntity.Type.valueOf(t.getValue()))
.orElse(PrimaryOwnerEntity.Type.USER);

PrimaryOwnerEntity primaryOwnerEntity = PrimaryOwnerEntity.builder()
.id(po.getId())
.email(po.getEmail())
.displayName(po.getDisplayName())
.type(type)
.build();
apiExport.setPrimaryOwner(primaryOwnerEntity);
});
return apiExport;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Copyright © 2015 The Gravitee team (http://gravitee.io)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.gravitee.rest.api.management.v2.rest.mapper;

import static org.assertj.core.api.Assertions.assertThat;

import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
import io.gravitee.rest.api.management.v2.rest.model.ExportApiV4;
import io.gravitee.rest.api.management.v2.rest.model.MembershipMemberType;
import io.gravitee.rest.api.management.v2.rest.model.PrimaryOwner;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class ImportExportApiMapperTest {

@Test
void should_map_primary_owner_and_media_fields() {
// Given
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe").type(MembershipMemberType.USER);

var api = new ApiV4();
api.setPrimaryOwner(po);

var exportApiV4 = new ExportApiV4();
exportApiV4.setApi(api);
exportApiV4.setApiPicture("picture-bytes");
exportApiV4.setApiBackground("bg-bytes");

// When
ImportDefinition importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);

// Then
var apiExport = importDefinition.getApiExport();
assertThat(apiExport).isNotNull();
assertThat(apiExport.getPicture()).isEqualTo("picture-bytes");
assertThat(apiExport.getBackground()).isEqualTo("bg-bytes");
assertThat(apiExport.getPrimaryOwner()).isNotNull();
assertThat(apiExport.getPrimaryOwner().id()).isEqualTo("po-id");
assertThat(apiExport.getPrimaryOwner().email()).isEqualTo("po@gravitee.io");
assertThat(apiExport.getPrimaryOwner().displayName()).isEqualTo("John Doe");
assertThat(apiExport.getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
}

@Test
void should_default_primary_owner_type_to_user_when_null() {
// Given
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe"); // no type set

var api = new ApiV4();
api.setPrimaryOwner(po);

var exportApiV4 = new ExportApiV4();
exportApiV4.setApi(api);

// When
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);

// Then
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNotNull();
assertThat(importDefinition.getApiExport().getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
}

@Test
void should_not_set_primary_owner_when_absent() {
// Given
var api = new ApiV4();
// no primary owner
var exportApiV4 = new ExportApiV4();
exportApiV4.setApi(api);

// When
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);

// Then
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNull();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.gravitee.apim.core.api.model.ApiWithFlows;
import io.gravitee.apim.core.api.model.NewApiMetadata;
import io.gravitee.apim.core.api.model.factory.ApiModelFactory;
import io.gravitee.apim.core.api.model.import_definition.ApiExport;
import io.gravitee.apim.core.api.model.import_definition.ApiMember;
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
import io.gravitee.apim.core.audit.model.AuditInfo;
Expand All @@ -31,6 +32,7 @@
import io.gravitee.apim.core.documentation.model.Page;
import io.gravitee.apim.core.media.model.Media;
import io.gravitee.apim.core.membership.domain_service.ApiPrimaryOwnerFactory;
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
import io.gravitee.apim.core.metadata.crud_service.MetadataCrudService;
import io.gravitee.apim.core.metadata.model.Metadata;
import io.gravitee.apim.core.metadata.model.MetadataId;
Expand All @@ -42,6 +44,7 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;

Expand Down Expand Up @@ -91,7 +94,15 @@ public ImportDefinitionCreateDomainService(
public ApiWithFlows create(AuditInfo auditInfo, ImportDefinition importDefinition) {
var environmentId = auditInfo.environmentId();
var organizationId = auditInfo.organizationId();
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(organizationId, environmentId, auditInfo.actor().userId());
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(
organizationId,
environmentId,
Optional.ofNullable(importDefinition)
.map(ImportDefinition::getApiExport)
.map(ApiExport::getPrimaryOwner)
.map(PrimaryOwnerEntity::id)
.orElse(auditInfo.actor().userId())
);
var apiWithIds = apiIdsCalculatorDomainService.recalculateApiDefinitionIds(environmentId, importDefinition);

var createdApi = createApiDomainService.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,10 @@ void setUp() {
)
);
importDefinitionCreateDomainServiceTestInitializer.userCrudService.initWith(
List.of(BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build())
List.of(
BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build(),
BaseUserEntity.builder().id("NEW-USER-ID").firstname("Jane1").lastname("Doe1").email(USER_EMAIL).build()
)
);
}

Expand Down Expand Up @@ -257,6 +260,42 @@ void should_create_a_new_api_without_sub_entities_with_user_defined_id() {
});
}

@Test
void should_create_a_new_api_with_primary_owner_as_in_definition() {
var importDefinition = anImportDefinition();
final String customId = "a-custom-id";
importDefinition.getApiExport().setId(customId);

io.gravitee.apim.core.membership.model.PrimaryOwnerEntity primaryOwner = PrimaryOwnerEntity.builder()
.id("NEW-USER-ID")
.type(PrimaryOwnerEntity.Type.USER)
.email(USER_EMAIL)
.displayName("Jane1 Doe1")
.build();
importDefinition.getApiExport().setPrimaryOwner(primaryOwner);
useCase.execute(new ImportApiDefinitionUseCase.Input(importDefinition, AUDIT_INFO));

var expected = expectedApi();
expected.setId(customId);
SoftAssertions.assertSoftly(soft -> {
var createdApi = apiCrudService.get(customId);
soft.assertThat(createdApi).isEqualTo(expected);
soft.assertThat(createdApi.getCreatedAt()).isNotNull();
soft.assertThat(createdApi.getUpdatedAt()).isNotNull();

soft
.assertThat(importDefinitionCreateDomainServiceTestInitializer.indexer.storage())
.containsExactly(
new IndexableApi(
expected,
new PrimaryOwnerEntity("NEW-USER-ID", USER_EMAIL, "Jane1 Doe1", PrimaryOwnerEntity.Type.USER),
Map.ofEntries(Map.entry("email-support", USER_EMAIL)),
Collections.emptySet()
)
);
});
}

@Test
void should_create_a_new_api_without_sub_entities() {
// Given
Expand Down