Skip to content

Commit

Permalink
feat: rework export service
Browse files Browse the repository at this point in the history
APIM-8200
  • Loading branch information
michel-barret committed Jan 20, 2025
1 parent 5c1d3e3 commit 6ed90e9
Show file tree
Hide file tree
Showing 32 changed files with 937 additions and 142 deletions.
2 changes: 1 addition & 1 deletion gravitee-apim-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -736,4 +736,4 @@

</dependencies>
</dependencyManagement>
</project>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
import io.gravitee.definition.model.v4.flow.step.Step;
import jakarta.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
Expand Down Expand Up @@ -55,9 +55,12 @@ public abstract class AbstractFlow implements Serializable {

@JsonIgnore
protected List<Plugin> computePlugins(List<Step> step) {
return Optional
return Stream
.ofNullable(step)
.map(r -> r.stream().filter(Step::isEnabled).map(Step::getPlugins).flatMap(List::stream).collect(Collectors.toList()))
.orElse(List.of());
.flatMap(Collection::stream)
.filter(Step::isEnabled)
.map(Step::getPlugins)
.flatMap(List::stream)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public interface MembershipRepository extends FindAllRepository<Membership> {
*/
List<String> deleteByReferenceIdAndReferenceType(String referenceId, MembershipReferenceType referenceType) throws TechnicalException;

List<Membership> findByReferenceIdAndReferenceType(String referenceId, MembershipReferenceType referenceType) throws TechnicalException;

/**
* find membership by id.
* @param membershipId the membership id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,15 @@ public List<String> deleteByReferenceIdAndReferenceType(String referenceId, Memb
LOGGER.debug("JdbcMembershipRepository.deleteByReferenceIdAndReferenceType({}, {})", referenceId, referenceType);
try {
List<String> rows = jdbcTemplate.queryForList(
"select id from " + this.tableName + " where reference_type = ?" + " and reference_id = ?",
"select id from " + this.tableName + " where reference_type = ? and reference_id = ?",
String.class,
referenceType.name(),
referenceId
);

if (!rows.isEmpty()) {
jdbcTemplate.update(
"delete from " + this.tableName + " where reference_type = ?" + " and reference_id = ?",
"delete from " + this.tableName + " where reference_type = ? and reference_id = ?",
referenceType.name(),
referenceId
);
Expand All @@ -98,6 +98,21 @@ public List<String> deleteByReferenceIdAndReferenceType(String referenceId, Memb
}
}

@Override
public List<Membership> findByReferenceIdAndReferenceType(String referenceId, MembershipReferenceType referenceType)
throws TechnicalException {
LOGGER.debug("JdbcMembershipRepository.deleteByReferenceIdAndReferenceType({}, {})", referenceId, referenceType);
try {
return jdbcTemplate.query(
getOrm().getSelectAllSql() + " where reference_type = " + referenceType.name() + " and reference_id = " + referenceId,
getOrm().getRowMapper()
);
} catch (final Exception ex) {
LOGGER.error("Failed to delete memberships for refId: {}/{}", referenceId, referenceType, ex);
throw new TechnicalException("Failed to delete memberships by reference", ex);
}
}

@Override
public Set<Membership> findByIds(Set<String> membershipIds) throws TechnicalException {
LOGGER.debug("JdbcMembershipRepository.findByIds({})", membershipIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package io.gravitee.repository.mongodb.management;

import static io.gravitee.repository.mongodb.utils.CollectionUtils.stream;

import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.MembershipRepository;
import io.gravitee.repository.management.model.Membership;
Expand Down Expand Up @@ -117,6 +119,18 @@ public List<String> deleteByReferenceIdAndReferenceType(String referenceId, Memb
}
}

@Override
public List<Membership> findByReferenceIdAndReferenceType(String referenceId, MembershipReferenceType referenceType)
throws TechnicalException {
logger.debug("Find memberships by reference [{}/{}]", referenceId, referenceType);
try {
return stream(internalMembershipRepo.findByMemberIdAndMemberType(referenceId, referenceType.name())).map(this::map).toList();
} catch (Exception ex) {
logger.error("Failed to delete memberships by ref: {}/{}", referenceId, referenceType, ex);
throw new TechnicalException("Failed to delete memberships by ref");
}
}

@Override
public Optional<Membership> findById(String membershipId) throws TechnicalException {
logger.debug("Find membership by ID [{}]", membershipId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,18 @@
package io.gravitee.apim.core.api.domain_service;

import io.gravitee.apim.core.api.model.import_definition.GraviteeDefinition;
import io.gravitee.apim.core.api.model.import_definition.ImportDefinition;
import io.gravitee.apim.core.audit.model.AuditInfo;
import java.util.Collection;

public interface ApiExportDomainService {
GraviteeDefinition export(String apiId, AuditInfo auditInfo);
enum Excludable {
GROUPS,
PLANS,
MEMBERS,
PAGES_MEDIA,
METADATA,
SHARED_CONFIGURATION,
}

GraviteeDefinition export(String apiId, AuditInfo auditInfo, Collection<ApiExportDomainService.Excludable> excludeAdditionalData);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
/*
* 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.apim.core.api.model.import_definition;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.gravitee.common.component.Lifecycle;
import io.gravitee.definition.model.DefinitionVersion;
import io.gravitee.definition.model.ResponseTemplate;
import io.gravitee.definition.model.v4.ApiType;
import io.gravitee.definition.model.v4.analytics.Analytics;
import io.gravitee.definition.model.v4.endpointgroup.EndpointGroup;
import io.gravitee.definition.model.v4.flow.Flow;
import io.gravitee.definition.model.v4.flow.execution.FlowExecution;
import io.gravitee.definition.model.v4.listener.Listener;
import io.gravitee.definition.model.v4.nativeapi.NativeEndpointGroup;
import io.gravitee.definition.model.v4.nativeapi.NativeFlow;
import io.gravitee.definition.model.v4.nativeapi.NativeListener;
import io.gravitee.definition.model.v4.property.Property;
import io.gravitee.definition.model.v4.resource.Resource;
import io.gravitee.definition.model.v4.service.ApiServices;
import io.gravitee.rest.api.model.PrimaryOwnerEntity;
import io.gravitee.rest.api.model.Visibility;
import io.gravitee.rest.api.model.WorkflowState;
import io.gravitee.rest.api.model.api.ApiLifecycleState;
import io.gravitee.rest.api.model.context.OriginContext;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.Builder;

public sealed interface ApiDescriptor {
String id();
String crossId();
String name();
String apiVersion();
DefinitionVersion definitionVersion();
ApiType type();
String description();
Instant deployedAt();
Instant createdAt();
Instant updatedAt();
boolean disableMembershipNotifications();
Map<String, Object> metadata();
Set<String> groups();
Lifecycle.State state();
Visibility visibility();
List<String> labels();
ApiLifecycleState lifecycleState();
Set<String> tags();
PrimaryOwnerEntity primaryOwner();
Set<String> categories();
OriginContext originContext();
WorkflowState workflowState();
String picture();
String background();

@Builder
record ApiDescriptorV4(
String id,
String crossId,
String name,
String apiVersion,
ApiType type,
String description,
Instant deployedAt,
Instant createdAt,
Instant updatedAt,
boolean disableMembershipNotifications,
Map<String, Object> metadata,
Set<String> groups,
Lifecycle.State state,
Visibility visibility,
List<String> labels,
ApiLifecycleState lifecycleState,
Set<String> tags,
PrimaryOwnerEntity primaryOwner,
Set<String> categories,
OriginContext originContext,
WorkflowState workflowState,
String picture,
String background,
List<Listener> listeners,
List<EndpointGroup> endpointGroups,
Analytics analytics,
FlowExecution flowExecution,
List<Flow> flows,
Map<String, Map<String, ResponseTemplate>> responseTemplates,
List<Property> properties,
List<Resource> resources,
ApiServices services,
boolean failover
)
implements ApiDescriptor {
@JsonProperty("definitionVersion")
@Override
public DefinitionVersion definitionVersion() {
return DefinitionVersion.V4;
}
}

@Builder
record ApiDescriptorNative(
String id,
String crossId,
String name,
String apiVersion,
String description,
Instant deployedAt,
Instant createdAt,
Instant updatedAt,
boolean disableMembershipNotifications,
Map<String, Object> metadata,
Set<String> groups,
Lifecycle.State state,
Visibility visibility,
List<String> labels,
ApiLifecycleState lifecycleState,
Set<String> tags,
PrimaryOwnerEntity primaryOwner,
Set<String> categories,
OriginContext originContext,
WorkflowState workflowState,
String picture,
String background,
List<NativeListener> listeners,
List<NativeEndpointGroup> endpointGroups,
List<NativeFlow> flows,
List<Property> properties,
List<Resource> resources
)
implements ApiDescriptor {
@JsonProperty("definitionVersion")
@Override
public DefinitionVersion definitionVersion() {
return DefinitionVersion.V4;
}

@JsonProperty("type")
@Override
public ApiType type() {
return ApiType.NATIVE;
}
}

@Builder
record ApiDescriptorFederated(
String id,
String crossId,
String name,
String apiVersion,
ApiType type,
String description,
Instant deployedAt,
Instant createdAt,
Instant updatedAt,
boolean disableMembershipNotifications,
Map<String, Object> metadata,
Set<String> groups,
Lifecycle.State state,
Visibility visibility,
List<String> labels,
ApiLifecycleState lifecycleState,
Set<String> tags,
PrimaryOwnerEntity primaryOwner,
Set<String> categories,
OriginContext originContext,
WorkflowState workflowState,
String picture,
String background
)
implements ApiDescriptor {
@JsonProperty("definitionVersion")
@Override
public DefinitionVersion definitionVersion() {
return DefinitionVersion.FEDERATED;
}
}
}
Loading

0 comments on commit 6ed90e9

Please sign in to comment.