Skip to content

Commit 2b74b59

Browse files
nive1980mergify[bot]
authored andcommitted
fix: set primary owner for v4 api export
(cherry picked from commit 5832b96) # Conflicts: # 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 # gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/test/java/io/gravitee/rest/api/management/v2/rest/mapper/ImportExportApiMapperTest.java # gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/api/domain_service/import_definition/ImportDefinitionCreateDomainService.java
1 parent 1e1fa9f commit 2b74b59

File tree

4 files changed

+164
-2
lines changed

4 files changed

+164
-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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.gravitee.apim.core.api.model.import_definition.ApiExport;
2323
import io.gravitee.apim.core.api.model.import_definition.GraviteeDefinition;
2424
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
25+
<<<<<<< HEAD
2526
import io.gravitee.apim.core.plan.model.PlanWithFlows;
2627
import io.gravitee.definition.jackson.datatype.GraviteeMapper;
2728
import io.gravitee.definition.model.ResponseTemplate;
@@ -31,6 +32,9 @@
3132
import io.gravitee.definition.model.v4.listener.tcp.TcpListener;
3233
import io.gravitee.definition.model.v4.nativeapi.NativeListener;
3334
import io.gravitee.definition.model.v4.nativeapi.kafka.KafkaListener;
35+
=======
36+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
37+
>>>>>>> 5832b9666c (fix: set primary owner for v4 api export)
3438
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
3539
import io.gravitee.rest.api.management.v2.rest.model.BaseOriginContext;
3640
import io.gravitee.rest.api.management.v2.rest.model.EndpointV4;
@@ -40,10 +44,20 @@
4044
import io.gravitee.rest.api.management.v2.rest.model.Metadata;
4145
import io.gravitee.rest.api.model.ApiMetadataEntity;
4246
import io.gravitee.rest.api.model.MemberEntity;
47+
<<<<<<< HEAD
4348
import io.gravitee.rest.api.model.context.OriginContext;
4449
import io.gravitee.rest.api.service.exceptions.TechnicalManagementException;
4550
import jakarta.annotation.Nullable;
4651
import java.util.Map;
52+
=======
53+
import io.gravitee.rest.api.model.v4.api.ApiEntity;
54+
import io.gravitee.rest.api.model.v4.api.ExportApiEntity;
55+
import io.gravitee.rest.api.model.v4.api.GenericApiEntity;
56+
import io.gravitee.rest.api.model.v4.nativeapi.NativeApiEntity;
57+
import io.gravitee.rest.api.model.v4.plan.GenericPlanEntity;
58+
import io.gravitee.rest.api.model.v4.plan.PlanEntity;
59+
import java.util.Optional;
60+
>>>>>>> 5832b9666c (fix: set primary owner for v4 api export)
4761
import java.util.Set;
4862
import java.util.stream.Collectors;
4963
import lombok.SneakyThrows;
@@ -185,6 +199,22 @@ default ApiExport buildApiExport(ExportApiV4 exportApiV4) {
185199
final ApiExport apiExport = ApiMapper.INSTANCE.toApiExport(exportApiV4.getApi());
186200
apiExport.setPicture(exportApiV4.getApiPicture());
187201
apiExport.setBackground(exportApiV4.getApiBackground());
202+
Optional.ofNullable(exportApiV4)
203+
.map(ExportApiV4::getApi)
204+
.map(ApiV4::getPrimaryOwner)
205+
.ifPresent(po -> {
206+
var type = Optional.ofNullable(po.getType())
207+
.map(t -> PrimaryOwnerEntity.Type.valueOf(t.getValue()))
208+
.orElse(PrimaryOwnerEntity.Type.USER);
209+
210+
PrimaryOwnerEntity primaryOwnerEntity = PrimaryOwnerEntity.builder()
211+
.id(po.getId())
212+
.email(po.getEmail())
213+
.displayName(po.getDisplayName())
214+
.type(type)
215+
.build();
216+
apiExport.setPrimaryOwner(primaryOwnerEntity);
217+
});
188218
return apiExport;
189219
}
190220

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/test/java/io/gravitee/rest/api/management/v2/rest/mapper/ImportExportApiMapperTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.gravitee.rest.api.management.v2.rest.mapper;
1717

18+
<<<<<<< HEAD
1819
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
1920
import static org.mockito.Mockito.mock;
2021
import static org.mockito.Mockito.when;
@@ -75,5 +76,82 @@ void shouldUseCorsMappperForHttpListener() {
7576
assertThat(result.getCors().getExposeHeaders()).isEqualTo(expectedCors.getExposeHeaders());
7677
assertThat(result.getCors().getMaxAge()).isEqualTo(expectedCors.getMaxAge());
7778
assertThat(result.getCors().getRunPolicies()).isEqualTo(expectedCors.getRunPolicies());
79+
=======
80+
import static org.assertj.core.api.Assertions.assertThat;
81+
82+
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
83+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
84+
import io.gravitee.rest.api.management.v2.rest.model.ApiV4;
85+
import io.gravitee.rest.api.management.v2.rest.model.ExportApiV4;
86+
import io.gravitee.rest.api.management.v2.rest.model.MembershipMemberType;
87+
import io.gravitee.rest.api.management.v2.rest.model.PrimaryOwner;
88+
import org.junit.jupiter.api.DisplayNameGeneration;
89+
import org.junit.jupiter.api.DisplayNameGenerator;
90+
import org.junit.jupiter.api.Test;
91+
92+
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
93+
class ImportExportApiMapperTest {
94+
95+
@Test
96+
void should_map_primary_owner_and_media_fields() {
97+
// Given
98+
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe").type(MembershipMemberType.USER);
99+
100+
var api = new ApiV4();
101+
api.setPrimaryOwner(po);
102+
103+
var exportApiV4 = new ExportApiV4();
104+
exportApiV4.setApi(api);
105+
exportApiV4.setApiPicture("picture-bytes");
106+
exportApiV4.setApiBackground("bg-bytes");
107+
108+
// When
109+
ImportDefinition importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
110+
111+
// Then
112+
var apiExport = importDefinition.getApiExport();
113+
assertThat(apiExport).isNotNull();
114+
assertThat(apiExport.getPicture()).isEqualTo("picture-bytes");
115+
assertThat(apiExport.getBackground()).isEqualTo("bg-bytes");
116+
assertThat(apiExport.getPrimaryOwner()).isNotNull();
117+
assertThat(apiExport.getPrimaryOwner().id()).isEqualTo("po-id");
118+
assertThat(apiExport.getPrimaryOwner().email()).isEqualTo("po@gravitee.io");
119+
assertThat(apiExport.getPrimaryOwner().displayName()).isEqualTo("John Doe");
120+
assertThat(apiExport.getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
121+
}
122+
123+
@Test
124+
void should_default_primary_owner_type_to_user_when_null() {
125+
// Given
126+
var po = new PrimaryOwner().id("po-id").email("po@gravitee.io").displayName("John Doe"); // no type set
127+
128+
var api = new ApiV4();
129+
api.setPrimaryOwner(po);
130+
131+
var exportApiV4 = new ExportApiV4();
132+
exportApiV4.setApi(api);
133+
134+
// When
135+
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
136+
137+
// Then
138+
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNotNull();
139+
assertThat(importDefinition.getApiExport().getPrimaryOwner().type()).isEqualTo(PrimaryOwnerEntity.Type.USER);
140+
}
141+
142+
@Test
143+
void should_not_set_primary_owner_when_absent() {
144+
// Given
145+
var api = new ApiV4();
146+
// no primary owner
147+
var exportApiV4 = new ExportApiV4();
148+
exportApiV4.setApi(api);
149+
150+
// When
151+
var importDefinition = ImportExportApiMapper.INSTANCE.toImportDefinition(exportApiV4);
152+
153+
// Then
154+
assertThat(importDefinition.getApiExport().getPrimaryOwner()).isNull();
155+
>>>>>>> 5832b9666c (fix: set primary owner for v4 api export)
78156
}
79157
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.gravitee.apim.core.api.model.ApiWithFlows;
2727
import io.gravitee.apim.core.api.model.NewApiMetadata;
2828
import io.gravitee.apim.core.api.model.factory.ApiModelFactory;
29+
import io.gravitee.apim.core.api.model.import_definition.ApiExport;
2930
import io.gravitee.apim.core.api.model.import_definition.ApiMember;
3031
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
3132
import io.gravitee.apim.core.api.model.import_definition.ImportDefinitionSubEntityProcessor;
@@ -36,6 +37,7 @@
3637
import io.gravitee.apim.core.documentation.model.Page;
3738
import io.gravitee.apim.core.media.model.Media;
3839
import io.gravitee.apim.core.membership.domain_service.ApiPrimaryOwnerFactory;
40+
import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity;
3941
import io.gravitee.apim.core.metadata.crud_service.MetadataCrudService;
4042
import io.gravitee.apim.core.metadata.model.Metadata;
4143
import io.gravitee.apim.core.metadata.model.MetadataId;
@@ -46,6 +48,11 @@
4648
import io.gravitee.rest.api.service.common.UuidString;
4749
import java.util.Date;
4850
import java.util.List;
51+
<<<<<<< HEAD:gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/api/domain_service/import_definition/ImportDefinitionCreateDomainService.java
52+
=======
53+
import java.util.Map;
54+
import java.util.Optional;
55+
>>>>>>> 5832b9666c (fix: set primary owner for v4 api export):gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/api/domain_service/ImportDefinitionCreateDomainService.java
4956
import java.util.Set;
5057
import lombok.extern.slf4j.Slf4j;
5158

@@ -95,7 +102,15 @@ public ImportDefinitionCreateDomainService(
95102
public ApiWithFlows create(AuditInfo auditInfo, ImportDefinition importDefinition) {
96103
var environmentId = auditInfo.environmentId();
97104
var organizationId = auditInfo.organizationId();
98-
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(organizationId, environmentId, auditInfo.actor().userId());
105+
var primaryOwner = apiPrimaryOwnerFactory.createForNewApi(
106+
organizationId,
107+
environmentId,
108+
Optional.ofNullable(importDefinition)
109+
.map(ImportDefinition::getApiExport)
110+
.map(ApiExport::getPrimaryOwner)
111+
.map(PrimaryOwnerEntity::id)
112+
.orElse(auditInfo.actor().userId())
113+
);
99114
var apiWithIds = apiIdsCalculatorDomainService.recalculateApiDefinitionIds(environmentId, importDefinition);
100115

101116
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
@@ -145,7 +145,10 @@ void setUp() {
145145
)
146146
);
147147
importDefinitionCreateDomainServiceTestInitializer.userCrudService.initWith(
148-
List.of(BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build())
148+
List.of(
149+
BaseUserEntity.builder().id(USER_ID).firstname("Jane").lastname("Doe").email(USER_EMAIL).build(),
150+
BaseUserEntity.builder().id("NEW-USER-ID").firstname("Jane1").lastname("Doe1").email(USER_EMAIL).build()
151+
)
149152
);
150153
}
151154

@@ -247,6 +250,42 @@ void should_create_a_new_api_without_sub_entities_with_user_defined_id() {
247250
});
248251
}
249252

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

0 commit comments

Comments
 (0)