Skip to content

Commit 2fdeab3

Browse files
committed
fix: set primary owner for v4 api export
1 parent e2b9da1 commit 2fdeab3

File tree

4 files changed

+163
-2
lines changed

4 files changed

+163
-2
lines changed

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/main/java/io/gravitee/rest/api/management/v2/rest/mapper/ImportExportApiMapper.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.gravitee.apim.core.api.model.import_definition.ApiExport;
1919
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
20+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
2021
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
2122
import io.gravitee.rest.api.management.v2.rest.model.ExportApiV4;
2223
import io.gravitee.rest.api.management.v2.rest.model.Member;
@@ -30,6 +31,7 @@
3031
import io.gravitee.rest.api.model.v4.nativeapi.NativeApiEntity;
3132
import io.gravitee.rest.api.model.v4.plan.GenericPlanEntity;
3233
import io.gravitee.rest.api.model.v4.plan.PlanEntity;
34+
import java.util.Optional;
3335
import java.util.Set;
3436
import org.mapstruct.Mapper;
3537
import org.mapstruct.Mapping;
@@ -58,6 +60,24 @@ default ApiExport buildApiExport(ExportApiV4 exportApiV4) {
5860
final ApiExport apiExport = ApiMapper.INSTANCE.toApiExport(exportApiV4.getApi());
5961
apiExport.setPicture(exportApiV4.getApiPicture());
6062
apiExport.setBackground(exportApiV4.getApiBackground());
63+
if (exportApiV4.getApi().getPrimaryOwner() != null) {
64+
Optional.of(exportApiV4)
65+
.map(ExportApiV4::getApi)
66+
.map(ApiV4::getPrimaryOwner)
67+
.ifPresent(po -> {
68+
PrimaryOwnerEntity.Type type = po.getType() != null
69+
? PrimaryOwnerEntity.Type.valueOf(po.getType().getValue())
70+
: PrimaryOwnerEntity.Type.USER;
71+
72+
PrimaryOwnerEntity primaryOwnerEntity = PrimaryOwnerEntity.builder()
73+
.id(po.getId())
74+
.email(po.getEmail())
75+
.displayName(po.getDisplayName())
76+
.type(type)
77+
.build();
78+
apiExport.setPrimaryOwner(primaryOwnerEntity);
79+
});
80+
}
6181
return apiExport;
6282
}
6383

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright © 2015 The Gravitee team (http://gravitee.io)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.gravitee.rest.api.management.v2.rest.mapper;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
21+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
22+
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
23+
import io.gravitee.rest.api.management.v2.rest.model.ExportApiV4;
24+
import io.gravitee.rest.api.management.v2.rest.model.MembershipMemberType;
25+
import io.gravitee.rest.api.management.v2.rest.model.PrimaryOwner;
26+
import org.junit.jupiter.api.Test;
27+
28+
class ImportExportApiMapperTest {
29+
30+
@Test
31+
void should_map_primary_owner_and_media_fields() {
32+
// Given
33+
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe").type(MembershipMemberType.USER);
34+
35+
var api = new ApiV4();
36+
api.setPrimaryOwner(po);
37+
38+
var exportApiV4 = new ExportApiV4();
39+
exportApiV4.setApi(api);
40+
exportApiV4.setApiPicture("picture-bytes");
41+
exportApiV4.setApiBackground("bg-bytes");
42+
43+
// When
44+
ImportDefinition importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
45+
46+
// Then
47+
var apiExport = importDefinition.getApiExport();
48+
assertThat(apiExport).isNotNull();
49+
assertThat(apiExport.getPicture()).isEqualTo("picture-bytes");
50+
assertThat(apiExport.getBackground()).isEqualTo("bg-bytes");
51+
assertThat(apiExport.getPrimaryOwner()).isNotNull();
52+
assertThat(apiExport.getPrimaryOwner().id()).isEqualTo("po-id");
53+
assertThat(apiExport.getPrimaryOwner().email()).isEqualTo("po@gravitee.io");
54+
assertThat(apiExport.getPrimaryOwner().displayName()).isEqualTo("John Doe");
55+
assertThat(apiExport.getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
56+
}
57+
58+
@Test
59+
void should_default_primary_owner_type_to_user_when_null() {
60+
// Given
61+
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe"); // no type set
62+
63+
var api = new ApiV4();
64+
api.setPrimaryOwner(po);
65+
66+
var exportApiV4 = new ExportApiV4();
67+
exportApiV4.setApi(api);
68+
69+
// When
70+
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
71+
72+
// Then
73+
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNotNull();
74+
assertThat(importDefinition.getApiExport().getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
75+
}
76+
77+
@Test
78+
void should_not_set_primary_owner_when_absent() {
79+
// Given
80+
var api = new ApiV4();
81+
// no primary owner
82+
var exportApiV4 = new ExportApiV4();
83+
exportApiV4.setApi(api);
84+
85+
// When
86+
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
87+
88+
// Then
89+
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNull();
90+
}
91+
}

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/api/domain_service/ImportDefinitionCreateDomainService.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.gravitee.apim.core.api.model.ApiWithFlows;
2323
import io.gravitee.apim.core.api.model.NewApiMetadata;
2424
import io.gravitee.apim.core.api.model.factory.ApiModelFactory;
25+
import io.gravitee.apim.core.api.model.import_definition.ApiExport;
2526
import io.gravitee.apim.core.api.model.import_definition.ApiMember;
2627
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
2728
import io.gravitee.apim.core.audit.model.AuditInfo;
@@ -31,6 +32,7 @@
3132
import io.gravitee.apim.core.documentation.model.Page;
3233
import io.gravitee.apim.core.media.model.Media;
3334
import io.gravitee.apim.core.membership.domain_service.ApiPrimaryOwnerFactory;
35+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
3436
import io.gravitee.apim.core.metadata.crud_service.MetadataCrudService;
3537
import io.gravitee.apim.core.metadata.model.Metadata;
3638
import io.gravitee.apim.core.metadata.model.MetadataId;
@@ -42,6 +44,7 @@
4244
import java.util.Date;
4345
import java.util.List;
4446
import java.util.Map;
47+
import java.util.Optional;
4548
import java.util.Set;
4649
import lombok.extern.slf4j.Slf4j;
4750

@@ -91,7 +94,15 @@ public ImportDefinitionCreateDomainService(
9194
public ApiWithFlows create(AuditInfo auditInfo, ImportDefinition importDefinition) {
9295
var environmentId = auditInfo.environmentId();
9396
var organizationId = auditInfo.organizationId();
94-
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(organizationId, environmentId, auditInfo.actor().userId());
97+
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(
98+
organizationId,
99+
environmentId,
100+
Optional.ofNullable(importDefinition)
101+
.map(ImportDefinition::getApiExport)
102+
.map(ApiExport::getPrimaryOwner)
103+
.map(PrimaryOwnerEntity::id)
104+
.orElse(auditInfo.actor().userId())
105+
);
95106
var apiWithIds = apiIdsCalculatorDomainService.recalculateApiDefinitionIds(environmentId, importDefinition);
96107

97108
var createdApi = createApiDomainService.create(

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/api/use_case/ImportApiDefinitionUseCaseTest.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ void setUp() {
142142
)
143143
);
144144
importDefinitionCreateDomainServiceTestInitializer.userCrudService.initWith(
145-
List.of(BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build())
145+
List.of(
146+
BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build(),
147+
BaseUserEntity.builder().id("NEW-USER-ID").firstname("Jane1").lastname("Doe1").email(USER_EMAIL).build()
148+
)
146149
);
147150
}
148151

@@ -257,6 +260,42 @@ void should_create_a_new_api_without_sub_entities_with_user_defined_id() {
257260
});
258261
}
259262

263+
@Test
264+
void should_create_a_new_api_with_primary_owner_as_in_definition() {
265+
var importDefinition = anImportDefinition();
266+
final String customId = "a-custom-id";
267+
importDefinition.getApiExport().setId(customId);
268+
269+
io.gravitee.apim.core.membership.model.PrimaryOwnerEntity primaryOwner = PrimaryOwnerEntity.builder()
270+
.id("NEW-USER-ID")
271+
.type(PrimaryOwnerEntity.Type.USER)
272+
.email(USER_EMAIL)
273+
.displayName("Jane1 Doe1")
274+
.build();
275+
importDefinition.getApiExport().setPrimaryOwner(primaryOwner);
276+
useCase.execute(new ImportApiDefinitionUseCase.Input(importDefinition, AUDIT_INFO));
277+
278+
var expected = expectedApi();
279+
expected.setId(customId);
280+
SoftAssertions.assertSoftly(soft -> {
281+
var createdApi = apiCrudService.get(customId);
282+
soft.assertThat(createdApi).isEqualTo(expected);
283+
soft.assertThat(createdApi.getCreatedAt()).isNotNull();
284+
soft.assertThat(createdApi.getUpdatedAt()).isNotNull();
285+
286+
soft
287+
.assertThat(importDefinitionCreateDomainServiceTestInitializer.indexer.storage())
288+
.containsExactly(
289+
new IndexableApi(
290+
expected,
291+
new PrimaryOwnerEntity("NEW-USER-ID", USER_EMAIL, "Jane1 Doe1", PrimaryOwnerEntity.Type.USER),
292+
Map.ofEntries(Map.entry("email-support", USER_EMAIL)),
293+
Collections.emptySet()
294+
)
295+
);
296+
});
297+
}
298+
260299
@Test
261300
void should_create_a_new_api_without_sub_entities() {
262301
// Given

0 commit comments

Comments
 (0)