Skip to content
This repository has been archived by the owner on Jul 29, 2021. It is now read-only.

Commit

Permalink
feat(oauth2): Manage OAuth2 and JWT plan security type
Browse files Browse the repository at this point in the history
  • Loading branch information
brasseld authored and NicolasGeraud committed Jan 25, 2018
1 parent 8876f2a commit 6fdfc10
Show file tree
Hide file tree
Showing 10 changed files with 205 additions and 22 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Expand Up @@ -32,8 +32,8 @@
<name>Gravitee.io APIM - Repository - MongoDB</name>

<properties>
<gravitee-repository.version>1.12.0</gravitee-repository.version>
<gravitee-repository-test.version>1.12.0</gravitee-repository-test.version>
<gravitee-repository.version>1.13.0-SNAPSHOT</gravitee-repository.version>
<gravitee-repository-test.version>1.13.0-SNAPSHOT</gravitee-repository-test.version>
<embed.mongo.version>1.50.5</embed.mongo.version>
<mongo.version>3.4.2</mongo.version>
<spring.data.mongodb.version>1.7.2.RELEASE</spring.data.mongodb.version>
Expand Down
Expand Up @@ -78,6 +78,7 @@ public Application update(Application application) throws TechnicalException {
applicationMongo.setType(application.getType());
applicationMongo.setGroups(application.getGroups());
applicationMongo.setStatus(application.getStatus().toString());
applicationMongo.setClientId(application.getClientId());

ApplicationMongo applicationMongoUpdated = internalApplicationRepo.save(applicationMongo);
return mapApplication(applicationMongoUpdated);
Expand Down Expand Up @@ -108,6 +109,12 @@ public Set<Application> findByName(String partialName) throws TechnicalException
return mapApplications(internalApplicationRepo.findByName(partialName));
}

@Override
public Optional<Application> findByClientId(String clientId) throws TechnicalException {
Optional<ApplicationMongo> applicationMongo = internalApplicationRepo.findByClientId(clientId);
return Optional.ofNullable(mapApplication(applicationMongo.orElse(null)));
}

@Override
public void delete(String applicationId) throws TechnicalException {
internalApplicationRepo.delete(applicationId);
Expand Down
Expand Up @@ -15,18 +15,20 @@
*/
package io.gravitee.repository.mongodb.management;

import io.gravitee.common.data.domain.Page;
import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.SubscriptionRepository;
import io.gravitee.repository.management.api.search.Pageable;
import io.gravitee.repository.management.api.search.SubscriptionCriteria;
import io.gravitee.repository.management.model.Subscription;
import io.gravitee.repository.mongodb.management.internal.model.SubscriptionMongo;
import io.gravitee.repository.mongodb.management.internal.plan.SubscriptionMongoRepository;
import io.gravitee.repository.mongodb.management.mapper.GraviteeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
* @author David BRASSELY (david.brassely at graviteesource.com)
Expand All @@ -42,19 +44,18 @@ public class MongoSubscriptionRepository implements SubscriptionRepository {
private SubscriptionMongoRepository internalSubscriptionRepository;

@Override
public Set<Subscription> findByPlan(String plan) throws TechnicalException {
return internalSubscriptionRepository.findByPlan(plan)
.stream()
.map(this::map)
.collect(Collectors.toSet());
public Page<Subscription> search(SubscriptionCriteria criteria, Pageable pageable) throws TechnicalException {
Page<SubscriptionMongo> subscriptionsMongo = internalSubscriptionRepository.search(criteria, pageable);

List<Subscription> content = mapper.collection2list(subscriptionsMongo.getContent(), SubscriptionMongo.class, Subscription.class);
return new Page<>(content, subscriptionsMongo.getPageNumber(), (int) subscriptionsMongo.getPageElements(), subscriptionsMongo.getTotalElements());
}

@Override
public Set<Subscription> findByApplication(String application) throws TechnicalException {
return internalSubscriptionRepository.findByApplication(application)
.stream()
.map(this::map)
.collect(Collectors.toSet());
public List<Subscription> search(SubscriptionCriteria criteria) throws TechnicalException {
Page<SubscriptionMongo> subscriptionsMongo = internalSubscriptionRepository.search(criteria, null);

return mapper.collection2list(subscriptionsMongo.getContent(), SubscriptionMongo.class, Subscription.class);
}

@Override
Expand Down
Expand Up @@ -22,6 +22,7 @@
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
Expand All @@ -44,6 +45,9 @@ public interface ApplicationMongoRepository extends MongoRepository<ApplicationM
@Query("{ name: { $regex: ?0, $options: 'i'}}")
Set<ApplicationMongo> findByName(String name);

@Query("{ clientId: ?0 }")
Optional<ApplicationMongo> findByClientId(String clientId);

@Query("{ status: {$in: ?0} }")
List<ApplicationMongo> findAll(List<ApplicationStatus> statuses);
}
Expand Down
Expand Up @@ -19,8 +19,6 @@
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;

Expand Down Expand Up @@ -48,6 +46,8 @@ public class ApplicationMongo extends Auditable {

private String status;

private String clientId;

public String getId() {
return id;
}
Expand Down Expand Up @@ -96,6 +96,14 @@ public void setStatus(String status) {
this.status = status;
}

public String getClientId() {
return clientId;
}

public void setClientId(String clientId) {
this.clientId = clientId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
Expand Up @@ -73,6 +73,8 @@ public class PlanMongo extends Auditable {

private List<String> excludedGroups;

private String securityDefinition;

public String getId() {
return id;
}
Expand Down Expand Up @@ -185,6 +187,14 @@ public void setExcludedGroups(List<String> excludedGroups) {
this.excludedGroups = excludedGroups;
}

public String getSecurityDefinition() {
return securityDefinition;
}

public void setSecurityDefinition(String securityDefinition) {
this.securityDefinition = securityDefinition;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
Expand Up @@ -34,6 +34,11 @@ public class SubscriptionMongo extends Auditable {
@Id
private String id;

/**
* The subscribed {@link io.gravitee.repository.management.model.Api}.
*/
private String api;

/**
* The subscribed {@link Plan}.
*/
Expand All @@ -44,6 +49,11 @@ public class SubscriptionMongo extends Auditable {
*/
private String application;

/**
* The clientId linked to the subscription
*/
private String clientId;

/**
* PENDING, ACCEPTED, REJECTED
*/
Expand Down Expand Up @@ -84,6 +94,14 @@ public void setId(String id) {
this.id = id;
}

public String getApi() {
return api;
}

public void setApi(String api) {
this.api = api;
}

public String getPlan() {
return plan;
}
Expand Down Expand Up @@ -164,6 +182,14 @@ public void setClosedAt(Date closedAt) {
this.closedAt = closedAt;
}

public String getClientId() {
return clientId;
}

public void setClientId(String clientId) {
this.clientId = clientId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
Expand Up @@ -19,16 +19,11 @@
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author GraviteeSource Team
*/
@Repository
public interface SubscriptionMongoRepository extends MongoRepository<SubscriptionMongo, String> {

List<SubscriptionMongo> findByPlan(String plan);
public interface SubscriptionMongoRepository extends MongoRepository<SubscriptionMongo, String>, SubscriptionMongoRepositoryCustom {

List<SubscriptionMongo> findByApplication(String application);
}
@@ -0,0 +1,32 @@
/**
* Copyright (C) 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.repository.mongodb.management.internal.plan;

import io.gravitee.common.data.domain.Page;
import io.gravitee.repository.management.api.search.Pageable;
import io.gravitee.repository.management.api.search.SubscriptionCriteria;
import io.gravitee.repository.mongodb.management.internal.model.SubscriptionMongo;
import org.springframework.stereotype.Repository;

/**
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author GraviteeSource Team
*/
@Repository
public interface SubscriptionMongoRepositoryCustom {

Page<SubscriptionMongo> search(SubscriptionCriteria criteria, Pageable pageable);
}
@@ -0,0 +1,100 @@
/**
* Copyright (C) 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.repository.mongodb.management.internal.plan;

import io.gravitee.common.data.domain.Page;
import io.gravitee.repository.management.api.search.Pageable;
import io.gravitee.repository.management.api.search.SubscriptionCriteria;
import io.gravitee.repository.mongodb.management.internal.model.SubscriptionMongo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.Date;
import java.util.List;

/**
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author GraviteeSource Team
*/
public class SubscriptionMongoRepositoryImpl implements SubscriptionMongoRepositoryCustom {

@Autowired
private MongoTemplate mongoTemplate;

@Override
public Page<SubscriptionMongo> search(SubscriptionCriteria criteria, Pageable pageable) {
Query query = new Query();

if (criteria.getClientId() != null) {
query.addCriteria(Criteria.where("clientId").is(criteria.getClientId()));
}

if (criteria.getApis() != null && ! criteria.getApis().isEmpty()) {
if (criteria.getApis().size() == 1) {
query.addCriteria(Criteria.where("api").is(criteria.getApis().iterator().next()));
} else {
query.addCriteria(Criteria.where("api").in(criteria.getApis()));
}
}

if (criteria.getPlans() != null && ! criteria.getPlans().isEmpty()) {
if (criteria.getPlans().size() == 1) {
query.addCriteria(Criteria.where("plan").is(criteria.getPlans().iterator().next()));
} else {
query.addCriteria(Criteria.where("plan").in(criteria.getPlans()));
}
}

if (criteria.getStatuses() != null && ! criteria.getStatuses().isEmpty()) {
if (criteria.getStatuses().size() == 1) {
query.addCriteria(Criteria.where("status").is(criteria.getStatuses().iterator().next()));
} else {
query.addCriteria(Criteria.where("status").in(criteria.getStatuses()));
}
}

if (criteria.getApplications() != null && ! criteria.getApplications().isEmpty()) {
if (criteria.getApplications().size() == 1) {
query.addCriteria(Criteria.where("application").is(criteria.getApplications().iterator().next()));
} else {
query.addCriteria(Criteria.where("application").in(criteria.getApplications()));
}
}

if (criteria.getFrom() != 0 && criteria.getTo() != 0) {
query.addCriteria(Criteria.where("updatedAt").gte(new Date(criteria.getFrom())).lt(new Date(criteria.getTo())));
}

// set sort by created at
query.with(new Sort(Sort.Direction.DESC, "createdAt"));

// set pageable
if (pageable != null) {
query.with(new PageRequest(pageable.pageNumber(), pageable.pageSize()));
}

List<SubscriptionMongo> subscriptions = mongoTemplate.find(query, SubscriptionMongo.class);
long total = mongoTemplate.count(query, SubscriptionMongo.class);

return new Page<>(
subscriptions, (pageable != null) ? pageable.pageNumber() : 0,
(pageable != null) ? pageable.pageSize() : 0, total);
}
}

0 comments on commit 6fdfc10

Please sign in to comment.