Skip to content

Commit 010786c

Browse files
committed
feat: fix after rebase. add tests.
https://gravitee.atlassian.net/browse/APIM-11696
1 parent cb36559 commit 010786c

File tree

14 files changed

+473
-339
lines changed

14 files changed

+473
-339
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/PortalNavigationItemsMapper.java

Lines changed: 73 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -18,104 +18,106 @@
1818
import io.gravitee.apim.core.exception.TechnicalDomainException;
1919
import io.gravitee.apim.core.portal_page.model.PortalArea;
2020
import io.gravitee.apim.core.portal_page.model.PortalNavigationItemId;
21-
import io.gravitee.apim.core.portal_page.model.PortalPageContentId;
22-
import io.gravitee.rest.api.management.v2.rest.model.BaseCreatePortalNavigationItem;
23-
import io.gravitee.rest.api.management.v2.rest.model.BasePortalNavigationItem;
2421
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationFolder;
22+
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationItem;
2523
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationLink;
2624
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationPage;
27-
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationFolder;
28-
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationLink;
29-
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationPage;
25+
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationItem;
26+
import java.util.List;
27+
import java.util.UUID;
3028
import org.mapstruct.Mapper;
29+
import org.mapstruct.Mapping;
3130
import org.mapstruct.factory.Mappers;
3231

3332
@Mapper
3433
public interface PortalNavigationItemsMapper {
3534
PortalNavigationItemsMapper INSTANCE = Mappers.getMapper(PortalNavigationItemsMapper.class);
3635

37-
default BasePortalNavigationItem map(io.gravitee.apim.core.portal_page.model.PortalNavigationItem portalNavigationItem) {
38-
final var id = portalNavigationItem.getId().toString();
39-
final var title = portalNavigationItem.getTitle();
40-
final var area = BasePortalNavigationItem.AreaEnum.fromValue(portalNavigationItem.getArea().name());
41-
final var order = portalNavigationItem.getOrder();
42-
final var parentId = mapParentId(portalNavigationItem.getParentId());
36+
@Mapping(target = "type", constant = "PAGE")
37+
@Mapping(
38+
target = "configuration",
39+
expression = "java(new io.gravitee.rest.api.management.v2.rest.model.PortalNavigationPageAllOfConfiguration().portalPageContentId(page.getPortalPageContentId().id()))"
40+
)
41+
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationPage map(
42+
io.gravitee.apim.core.portal_page.model.PortalNavigationPage page
43+
);
4344

45+
@Mapping(target = "type", constant = "FOLDER")
46+
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationFolder map(
47+
io.gravitee.apim.core.portal_page.model.PortalNavigationFolder folder
48+
);
49+
50+
@Mapping(target = "type", constant = "LINK")
51+
@Mapping(
52+
target = "configuration",
53+
expression = "java(new io.gravitee.rest.api.management.v2.rest.model.PortalNavigationLinkAllOfConfiguration().url(link.getUrl()))"
54+
)
55+
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationLink map(
56+
io.gravitee.apim.core.portal_page.model.PortalNavigationLink link
57+
);
58+
59+
@Mapping(target = "id", expression = "java(PortalNavigationItemId.random())")
60+
io.gravitee.apim.core.portal_page.model.PortalNavigationFolder map(
61+
String organizationId,
62+
String environmentId,
63+
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationFolder folder
64+
);
65+
66+
@Mapping(target = "id", expression = "java(PortalNavigationItemId.random())")
67+
@Mapping(target = "portalPageContentId", expression = "java(PortalPageContentId.of(page.getContentId().toString()))")
68+
io.gravitee.apim.core.portal_page.model.PortalNavigationPage map(
69+
String organizationId,
70+
String environmentId,
71+
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationPage page
72+
);
73+
74+
@Mapping(target = "id", expression = "java(PortalNavigationItemId.random())")
75+
io.gravitee.apim.core.portal_page.model.PortalNavigationLink map(
76+
String organizationId,
77+
String environmentId,
78+
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationLink link
79+
);
80+
81+
default List<PortalNavigationItem> map(List<io.gravitee.apim.core.portal_page.model.PortalNavigationItem> items) {
82+
return items.stream().map(this::map).toList();
83+
}
84+
85+
default PortalNavigationItem map(io.gravitee.apim.core.portal_page.model.PortalNavigationItem portalNavigationItem) {
4486
return switch (portalNavigationItem) {
45-
case io.gravitee.apim.core.portal_page.model.PortalNavigationFolder ignored -> new PortalNavigationFolder()
46-
.id(id)
47-
.title(title)
48-
.area(area)
49-
.order(order)
50-
.parentId(parentId);
51-
case io.gravitee.apim.core.portal_page.model.PortalNavigationPage page -> new PortalNavigationPage()
52-
.contentId(page.getPortalPageContentId().toString())
53-
.id(id)
54-
.title(title)
55-
.area(area)
56-
.order(order)
57-
.parentId(parentId);
58-
case io.gravitee.apim.core.portal_page.model.PortalNavigationLink link -> new PortalNavigationLink()
59-
.url(link.getHref())
60-
.id(id)
61-
.title(title)
62-
.area(area)
63-
.order(order)
64-
.parentId(parentId);
87+
case io.gravitee.apim.core.portal_page.model.PortalNavigationFolder folder -> new PortalNavigationItem(map(folder));
88+
case io.gravitee.apim.core.portal_page.model.PortalNavigationPage page -> new PortalNavigationItem(map(page));
89+
case io.gravitee.apim.core.portal_page.model.PortalNavigationLink link -> new PortalNavigationItem(map(link));
6590
};
6691
}
6792

6893
default io.gravitee.apim.core.portal_page.model.PortalNavigationItem map(
6994
String organizationId,
7095
String environmentId,
71-
BaseCreatePortalNavigationItem createPortalNavigationItem
96+
CreatePortalNavigationItem createPortalNavigationItem
7297
) {
73-
final var id = PortalNavigationItemId.random();
74-
final var title = createPortalNavigationItem.getTitle();
75-
final var area = PortalArea.valueOf(createPortalNavigationItem.getArea().getValue());
76-
final var order = createPortalNavigationItem.getOrder() == null ? Integer.MAX_VALUE : createPortalNavigationItem.getOrder();
77-
78-
final var item = switch (createPortalNavigationItem) {
79-
case CreatePortalNavigationFolder ignored -> new io.gravitee.apim.core.portal_page.model.PortalNavigationFolder(
80-
id,
81-
organizationId,
82-
environmentId,
83-
title,
84-
area,
85-
order
86-
);
87-
case CreatePortalNavigationPage page -> new io.gravitee.apim.core.portal_page.model.PortalNavigationPage(
88-
id,
89-
organizationId,
90-
environmentId,
91-
title,
92-
area,
93-
order,
94-
PortalPageContentId.of(page.getContentId())
95-
);
96-
case CreatePortalNavigationLink link -> new io.gravitee.apim.core.portal_page.model.PortalNavigationLink(
97-
id,
98-
organizationId,
99-
environmentId,
100-
title,
101-
area,
102-
order,
103-
link.getUrl()
104-
);
98+
return switch (createPortalNavigationItem.getActualInstance()) {
99+
case CreatePortalNavigationFolder folder -> map(organizationId, environmentId, folder);
100+
case CreatePortalNavigationPage page -> map(organizationId, environmentId, page);
101+
case CreatePortalNavigationLink link -> map(organizationId, environmentId, link);
105102
default -> throw new TechnicalDomainException(
106103
String.format("Unknown PortalNavigationItem class %s", createPortalNavigationItem.getClass().getSimpleName())
107104
);
108105
};
109-
item.setParentId(mapParentId(createPortalNavigationItem.getParentId()));
106+
}
107+
108+
default Integer map(Integer order) {
109+
return order == null ? Integer.MAX_VALUE : order;
110+
}
110111

111-
return item;
112+
default PortalNavigationItemId map(UUID id) {
113+
return id == null ? null : PortalNavigationItemId.of(id.toString());
112114
}
113115

114-
private PortalNavigationItemId mapParentId(String parentId) {
115-
return parentId == null ? null : PortalNavigationItemId.of(parentId);
116+
default String map(io.gravitee.apim.core.portal_page.model.PortalNavigationItemId id) {
117+
return id != null ? id.json() : null;
116118
}
117119

118-
private String mapParentId(PortalNavigationItemId parentId) {
119-
return parentId == null ? null : parentId.toString();
120+
default PortalArea map(io.gravitee.rest.api.management.v2.rest.model.PortalArea area) {
121+
return PortalArea.valueOf(area.name());
120122
}
121123
}

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/PortalNavigationMapper.java

Lines changed: 0 additions & 66 deletions
This file was deleted.

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/resource/environment/PortalNavigationItemsResource.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
import io.gravitee.apim.core.portal_page.use_case.ListPortalNavigationItemsUseCase;
2222
import io.gravitee.common.http.MediaType;
2323
import io.gravitee.rest.api.management.v2.rest.mapper.PortalNavigationItemsMapper;
24-
import io.gravitee.rest.api.management.v2.rest.mapper.PortalNavigationMapper;
25-
import io.gravitee.rest.api.management.v2.rest.model.BaseCreatePortalNavigationItem;
24+
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationItem;
2625
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationItemsResponse;
2726
import io.gravitee.rest.api.management.v2.rest.resource.AbstractResource;
2827
import io.gravitee.rest.api.model.permissions.RolePermission;
@@ -40,8 +39,8 @@
4039
import jakarta.ws.rs.Produces;
4140
import jakarta.ws.rs.QueryParam;
4241
import jakarta.ws.rs.core.Response;
43-
import lombok.extern.slf4j.Slf4j;
4442
import java.util.Optional;
43+
import lombok.extern.slf4j.Slf4j;
4544

4645
/**
4746
* @author GraviteeSource Team
@@ -61,33 +60,33 @@ public class PortalNavigationItemsResource extends AbstractResource {
6160
@Produces(MediaType.APPLICATION_JSON)
6261
@Permissions({ @Permission(value = RolePermission.ENVIRONMENT_DOCUMENTATION, acls = RolePermissionAction.READ) })
6362
public PortalNavigationItemsResponse getPortalNavigationItems(
64-
@QueryParam("area") PortalArea area,
65-
@QueryParam("parentId") String parentId,
66-
@QueryParam("loadChildren") @DefaultValue("true") boolean loadChildren
63+
@QueryParam("area") PortalArea area,
64+
@QueryParam("parentId") String parentId,
65+
@QueryParam("loadChildren") @DefaultValue("true") boolean loadChildren
6766
) {
6867
var result = listPortalNavigationItemsUseCase.execute(
69-
new ListPortalNavigationItemsUseCase.Input(
70-
GraviteeContext.getCurrentEnvironment(),
71-
area,
72-
Optional.ofNullable(parentId).map(PortalNavigationItemId::of),
73-
loadChildren
74-
)
68+
new ListPortalNavigationItemsUseCase.Input(
69+
GraviteeContext.getCurrentEnvironment(),
70+
area,
71+
Optional.ofNullable(parentId).map(PortalNavigationItemId::of),
72+
loadChildren
73+
)
7574
);
7675

77-
return new PortalNavigationItemsResponse().items(PortalNavigationMapper.INSTANCE.map(result.items()));
76+
return new PortalNavigationItemsResponse().items(mapper.map(result.items()));
7877
}
7978

8079
@POST
81-
@Permissions({ @Permission(value = RolePermission.ENVIRONMENT_PAGE, acls = { RolePermissionAction.UPDATE }) })
80+
@Permissions({ @Permission(value = RolePermission.ENVIRONMENT_DOCUMENTATION, acls = { RolePermissionAction.UPDATE }) })
8281
@Consumes(MediaType.APPLICATION_JSON)
8382
@Produces(MediaType.APPLICATION_JSON)
84-
public Response createPortalNavigationItem(@Valid @NotNull final BaseCreatePortalNavigationItem createPortalNavigationItem) {
83+
public Response createPortalNavigationItem(@Valid @NotNull final CreatePortalNavigationItem createPortalNavigationItem) {
8584
final var executionContext = GraviteeContext.getExecutionContext();
8685

8786
final var output = createPortalNavigationItemUseCase.execute(
88-
new CreatePortalNavigationItemUseCase.Input(
89-
mapper.map(executionContext.getOrganizationId(), executionContext.getEnvironmentId(), createPortalNavigationItem)
90-
)
87+
new CreatePortalNavigationItemUseCase.Input(
88+
mapper.map(executionContext.getOrganizationId(), executionContext.getEnvironmentId(), createPortalNavigationItem)
89+
)
9190
);
9291

9392
return Response.created(this.getLocationHeader(output.item().getId().toString())).entity(mapper.map(output.item())).build();

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/resource/installation/EnvironmentResource.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,6 @@ public PortalMenuLinksResource getPortalMenuLinksResource() {
7474
return resourceContext.getResource(PortalMenuLinksResource.class);
7575
}
7676

77-
@Path("/portal-navigation-items")
78-
public PortalNavigationItemsResource getPortalNavigationItemsResource() {
79-
return resourceContext.getResource(PortalNavigationItemsResource.class);
80-
}
81-
8277
@Path("/ui/themes")
8378
public ThemesResource getThemesResource() {
8479
return resourceContext.getResource(ThemesResource.class);
@@ -120,7 +115,7 @@ public InstancesResource getInstancesResource() {
120115
}
121116

122117
@Path("/portal-navigation-items")
123-
public PortalNavigationItemsResource getPortalNavigationItemResource() {
118+
public PortalNavigationItemsResource getPortalNavigationItemsResource() {
124119
return resourceContext.getResource(PortalNavigationItemsResource.class);
125120
}
126121

gravitee-apim-rest-api/gravitee-apim-rest-api-management-v2/gravitee-apim-rest-api-management-v2-rest/src/main/resources/openapi/openapi-environments.yaml

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -863,15 +863,15 @@ paths:
863863
content:
864864
application/json:
865865
schema:
866-
$ref: "#/components/schemas/BaseCreatePortalNavigationItem"
866+
$ref: "#/components/schemas/CreatePortalNavigationItem"
867867
required: true
868868
responses:
869869
"201":
870870
description: Portal navigation item created
871871
content:
872872
application/json:
873873
schema:
874-
$ref: "#/components/schemas/BasePortalNavigationItem"
874+
$ref: "#/components/schemas/PortalNavigationItem"
875875
default:
876876
$ref: "#/components/responses/Error"
877877

@@ -1787,6 +1787,7 @@ components:
17871787

17881788
BaseCreatePortalNavigationItem:
17891789
type: object
1790+
description: Base portal navigation item
17901791
properties:
17911792
title:
17921793
type: string
@@ -1798,10 +1799,11 @@ components:
17981799
order:
17991800
type: integer
18001801
minimum: 0
1801-
description: The order of the navigation item (zero-based)
1802+
description: The order of the navigation item, from 0 to MAX + 1, where MAX is the maximum existing order within the target parent. If not provided or greater than MAX, the new item is appended to the end of the target parent.
18021803
example: 2
18031804
parentId:
18041805
type: string
1806+
format: uuid
18051807
description: The parent ID of the navigation item, if not provided item is created at root
18061808
example: 00f8c9e7-78fc-4907-b8c9-e778fc790750
18071809
discriminator:
@@ -1842,6 +1844,17 @@ components:
18421844
description: The URL for the link
18431845
example: https://example.com
18441846
required: [url]
1847+
CreatePortalNavigationItem:
1848+
oneOf:
1849+
- $ref: "#/components/schemas/CreatePortalNavigationPage"
1850+
- $ref: "#/components/schemas/CreatePortalNavigationFolder"
1851+
- $ref: "#/components/schemas/CreatePortalNavigationLink"
1852+
discriminator:
1853+
propertyName: type
1854+
mapping:
1855+
PAGE: "#/components/schemas/CreatePortalNavigationPage"
1856+
FOLDER: "#/components/schemas/CreatePortalNavigationFolder"
1857+
LINK: "#/components/schemas/CreatePortalNavigationLink"
18451858

18461859
parameters:
18471860
pageParam:

0 commit comments

Comments
 (0)