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 @@ -101,6 +101,8 @@
import io.gravitee.apim.core.plugin.crud_service.PolicyPluginCrudService;
import io.gravitee.apim.core.plugin.domain_service.EndpointConnectorPluginDomainService;
import io.gravitee.apim.core.policy.domain_service.PolicyValidationDomainService;
import io.gravitee.apim.core.portal_page.domain_service.CreatePortalNavigationItemValidatorService;
import io.gravitee.apim.core.portal_page.use_case.CreatePortalNavigationItemUseCase;
import io.gravitee.apim.core.portal_page.use_case.GetPortalPageContentUseCase;
import io.gravitee.apim.core.portal_page.use_case.ListPortalNavigationItemsUseCase;
import io.gravitee.apim.core.promotion.service_provider.CockpitPromotionServiceProvider;
Expand Down Expand Up @@ -856,6 +858,16 @@ public CreatePromotionUseCase createPromotionUseCase() {
return mock(CreatePromotionUseCase.class);
}

@Bean
public CreatePortalNavigationItemUseCase createPortalNavigationItemUseCase() {
return mock(CreatePortalNavigationItemUseCase.class);
}

@Bean
public CreatePortalNavigationItemValidatorService createPortalNavigationItemValidatorService() {
return mock(CreatePortalNavigationItemValidatorService.class);
}

@Bean
public ListPortalNavigationItemsUseCase listPortalNavigationItemsUseCase() {
return mock(ListPortalNavigationItemsUseCase.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.ThrowableMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.UnrecognizedPropertyExceptionMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.ValidationExceptionMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.domain.ConflictDomainExceptionMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.domain.NotAllowedDomainExceptionMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.domain.NotFoundDomainExceptionMapper;
import io.gravitee.rest.api.management.v2.rest.exceptionMapper.domain.TechnicalDomainExceptionMapper;
Expand Down Expand Up @@ -106,6 +107,7 @@ public GraviteeManagementV2Application() {
register(TechnicalDomainExceptionMapper.class);
register(NotAllowedDomainExceptionMapper.class);
register(NotFoundDomainExceptionMapper.class);
register(ConflictDomainExceptionMapper.class);

register(CommaSeparatedQueryParamConverterProvider.class);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* 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.exceptionMapper.domain;

import io.gravitee.apim.core.exception.ConflictDomainException;
import io.gravitee.rest.api.management.v2.rest.model.Error;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.Map;

public class ConflictDomainExceptionMapper extends AbstractDomainExceptionMapper<ConflictDomainException> {

@Override
public Response toResponse(ConflictDomainException exception) {
return Response.status(Response.Status.CONFLICT)
.type(MediaType.APPLICATION_JSON_TYPE)
.entity(conflictDomainError(exception))
.build();
}

private Error conflictDomainError(ConflictDomainException exception) {
return new Error()
.httpStatus(Response.Status.CONFLICT.getStatusCode())
.message(exception.getMessage())
.parameters(exception.getId() != null ? Map.of("id", exception.getId()) : null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ private Error notFoundDomainError(NotFoundDomainException nfe) {
return new Error()
.httpStatus(Response.Status.NOT_FOUND.getStatusCode())
.message(nfe.getMessage())
.parameters(Map.of("id", nfe.getId()));
.parameters(nfe.getId() != null ? Map.of("id", nfe.getId()) : null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* 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 io.gravitee.apim.core.exception.TechnicalDomainException;
import io.gravitee.apim.core.portal_page.model.PortalNavigationItemId;
import io.gravitee.rest.api.management.v2.rest.model.BaseCreatePortalNavigationItem;
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationFolder;
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationLink;
import io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationPage;
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationItem;
import java.util.List;
import java.util.UUID;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PortalNavigationItemsMapper {
PortalNavigationItemsMapper INSTANCE = Mappers.getMapper(PortalNavigationItemsMapper.class);

@Mapping(target = "type", constant = "PAGE")
@Mapping(
target = "configuration",
expression = "java(new io.gravitee.rest.api.management.v2.rest.model.PortalNavigationPageAllOfConfiguration().portalPageContentId(page.getPortalPageContentId().id()))"
)
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationPage map(
io.gravitee.apim.core.portal_page.model.PortalNavigationPage page
);

@Mapping(target = "type", constant = "FOLDER")
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationFolder map(
io.gravitee.apim.core.portal_page.model.PortalNavigationFolder folder
);

@Mapping(target = "type", constant = "LINK")
@Mapping(
target = "configuration",
expression = "java(new io.gravitee.rest.api.management.v2.rest.model.PortalNavigationLinkAllOfConfiguration().url(link.getUrl()))"
)
io.gravitee.rest.api.management.v2.rest.model.PortalNavigationLink map(
io.gravitee.apim.core.portal_page.model.PortalNavigationLink link
);

default List<PortalNavigationItem> map(List<io.gravitee.apim.core.portal_page.model.PortalNavigationItem> items) {
return items.stream().map(this::map).toList();
}

default PortalNavigationItem map(io.gravitee.apim.core.portal_page.model.PortalNavigationItem portalNavigationItem) {
return switch (portalNavigationItem) {
case io.gravitee.apim.core.portal_page.model.PortalNavigationFolder folder -> new PortalNavigationItem(map(folder));
case io.gravitee.apim.core.portal_page.model.PortalNavigationPage page -> new PortalNavigationItem(map(page));
case io.gravitee.apim.core.portal_page.model.PortalNavigationLink link -> new PortalNavigationItem(map(link));
};
}

@Mapping(
target = "contentId",
expression = "java(page.getContentId() == null ? null : io.gravitee.apim.core.portal_page.model.PortalPageContentId.of(page.getContentId().toString()))"
)
io.gravitee.apim.core.portal_page.model.CreatePortalNavigationItem map(
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationPage page
);

io.gravitee.apim.core.portal_page.model.CreatePortalNavigationItem map(
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationFolder folder
);

@Mapping(target = "url", expression = "java(link.getUrl().toString())")
io.gravitee.apim.core.portal_page.model.CreatePortalNavigationItem map(
io.gravitee.rest.api.management.v2.rest.model.CreatePortalNavigationLink link
);

default io.gravitee.apim.core.portal_page.model.CreatePortalNavigationItem map(
BaseCreatePortalNavigationItem createPortalNavigationItem
) {
return switch (createPortalNavigationItem) {
case CreatePortalNavigationFolder folder -> map(folder);
case CreatePortalNavigationPage page -> map(page);
case CreatePortalNavigationLink link -> map(link);
default -> throw new TechnicalDomainException(
String.format("Unknown PortalNavigationItem class %s", createPortalNavigationItem.getClass().getSimpleName())
);
};
}

default PortalNavigationItemId map(UUID id) {
return id == null ? null : PortalNavigationItemId.of(id.toString());
}

default String map(io.gravitee.apim.core.portal_page.model.PortalNavigationItemId id) {
return id != null ? id.json() : null;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@

import io.gravitee.apim.core.portal_page.model.PortalArea;
import io.gravitee.apim.core.portal_page.model.PortalNavigationItemId;
import io.gravitee.apim.core.portal_page.use_case.CreatePortalNavigationItemUseCase;
import io.gravitee.apim.core.portal_page.use_case.ListPortalNavigationItemsUseCase;
import io.gravitee.common.http.MediaType;
import io.gravitee.rest.api.management.v2.rest.mapper.PortalNavigationMapper;
import io.gravitee.rest.api.management.v2.rest.mapper.PortalNavigationItemsMapper;
import io.gravitee.rest.api.management.v2.rest.model.BaseCreatePortalNavigationItem;
import io.gravitee.rest.api.management.v2.rest.model.PortalNavigationItemsResponse;
import io.gravitee.rest.api.management.v2.rest.resource.AbstractResource;
import io.gravitee.rest.api.model.permissions.RolePermission;
Expand All @@ -28,20 +30,32 @@
import io.gravitee.rest.api.rest.annotation.Permissions;
import io.gravitee.rest.api.service.common.GraviteeContext;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;

/**
* @author GraviteeSource Team
*/
@Slf4j
public class PortalNavigationItemsResource extends AbstractResource {

@Inject
private CreatePortalNavigationItemUseCase createPortalNavigationItemUseCase;

@Inject
private ListPortalNavigationItemsUseCase listPortalNavigationItemsUseCase;

private final PortalNavigationItemsMapper mapper = PortalNavigationItemsMapper.INSTANCE;

@GET
@Produces(MediaType.APPLICATION_JSON)
@Permissions({ @Permission(value = RolePermission.ENVIRONMENT_DOCUMENTATION, acls = RolePermissionAction.READ) })
Expand All @@ -59,6 +73,24 @@ public PortalNavigationItemsResponse getPortalNavigationItems(
)
);

return new PortalNavigationItemsResponse().items(PortalNavigationMapper.INSTANCE.map(result.items()));
return new PortalNavigationItemsResponse().items(mapper.map(result.items()));
}

@POST
@Permissions({ @Permission(value = RolePermission.ENVIRONMENT_DOCUMENTATION, acls = { RolePermissionAction.UPDATE }) })
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createPortalNavigationItem(@Valid @NotNull final BaseCreatePortalNavigationItem createPortalNavigationItem) {
final var executionContext = GraviteeContext.getExecutionContext();

final var output = createPortalNavigationItemUseCase.execute(
new CreatePortalNavigationItemUseCase.Input(
executionContext.getOrganizationId(),
executionContext.getEnvironmentId(),
mapper.map(createPortalNavigationItem)
)
);

return Response.created(this.getLocationHeader(output.item().getId().toString())).entity(mapper.map(output.item())).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public InstancesResource getInstancesResource() {
}

@Path("/portal-navigation-items")
public PortalNavigationItemsResource getPortalNavigationItemResource() {
public PortalNavigationItemsResource getPortalNavigationItemsResource() {
return resourceContext.getResource(PortalNavigationItemsResource.class);
}

Expand Down
Loading