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

Commit

Permalink
feat(group): manage group permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasGeraud committed Oct 17, 2016
1 parent b3c9e63 commit 5c70ce4
Show file tree
Hide file tree
Showing 12 changed files with 411 additions and 16 deletions.
Expand Up @@ -27,7 +27,8 @@
import java.util.stream.Collectors;

/**
* @author David BRASSELY (brasseld at gmail.com)
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
@Component
Expand Down Expand Up @@ -59,6 +60,14 @@ public Set<Api> findByIds(List<String> ids) throws TechnicalException {
.collect(Collectors.toSet());
}

@Override
public Set<Api> findByGroups(List<String> groupIds) throws TechnicalException {
return apiRedisRepository.findByGroups(groupIds)
.stream()
.map(this::convert)
.collect(Collectors.toSet());
}

@Override
public Optional<Api> findById(String apiId) throws TechnicalException {
RedisApi redisApi = this.apiRedisRepository.find(apiId);
Expand Down Expand Up @@ -102,6 +111,7 @@ private Api convert(RedisApi redisApi) {
api.setVisibility(Visibility.valueOf(redisApi.getVisibility()));
api.setLifecycleState(LifecycleState.valueOf(redisApi.getLifecycleState()));
api.setPicture(redisApi.getPicture());
api.setGroup(redisApi.getGroup());

return api;
}
Expand All @@ -124,6 +134,7 @@ private RedisApi convert(Api api) {
redisApi.setVisibility(api.getVisibility().name());
redisApi.setLifecycleState(api.getLifecycleState().name());
redisApi.setPicture(api.getPicture());
redisApi.setGroup(api.getGroup());

return redisApi;
}
Expand Down
Expand Up @@ -27,7 +27,8 @@
import java.util.stream.Collectors;

/**
* @author David BRASSELY (brasseld at gmail.com)
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
@Component
Expand All @@ -52,6 +53,14 @@ public Set<Application> findByIds(List<String> ids) throws TechnicalException {
.collect(Collectors.toSet());
}

@Override
public Set<Application> findByGroups(List<String> groupIds) throws TechnicalException {
return applicationRedisRepository.findByGroups(groupIds)
.stream()
.map(this::convert)
.collect(Collectors.toSet());
}

@Override
public Optional<Application> findById(String applicationId) throws TechnicalException {
RedisApplication redisApplication = this.applicationRedisRepository.find(applicationId);
Expand Down Expand Up @@ -96,6 +105,7 @@ private Application convert(RedisApplication redisApplication) {
application.setUpdatedAt(new Date(redisApplication.getUpdatedAt()));
application.setDescription(redisApplication.getDescription());
application.setType(redisApplication.getType());
application.setGroup(redisApplication.getGroup());
return application;
}

Expand All @@ -108,6 +118,7 @@ private RedisApplication convert(Application application) {
redisApplication.setUpdatedAt(application.getUpdatedAt().getTime());
redisApplication.setDescription(application.getDescription());
redisApplication.setType(application.getType());
redisApplication.setGroup(application.getGroup());

return redisApplication;
}
Expand Down
@@ -0,0 +1,107 @@
/**
* 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.redis.management;

import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.GroupRepository;
import io.gravitee.repository.management.model.Group;
import io.gravitee.repository.redis.management.internal.GroupRedisRepository;
import io.gravitee.repository.redis.management.model.RedisGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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

/**
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
@Component
public class RedisGroupRepository implements GroupRepository{

@Autowired
private GroupRedisRepository internalRepository;

@Override
public Optional<Group> findById(String groupId) throws TechnicalException {
return Optional.ofNullable(convert(internalRepository.find(groupId)));
}

@Override
public Group create(Group item) throws TechnicalException {
if (item != null && item.getAdministrators() == null) {
item.setAdministrators(Collections.emptyList());
}
return convert(internalRepository.saveOrUpdate(convert(item)));
}

@Override
public Group update(Group item) throws TechnicalException {
return convert(internalRepository.saveOrUpdate(convert(item)));
}

@Override
public void delete(String groupId) throws TechnicalException {
internalRepository.delete(groupId);
}

@Override
public Set<Group> findByType(Group.Type type) throws TechnicalException {
return internalRepository.findByType(type.name())
.stream()
.map(this::convert)
.collect(Collectors.toSet());
}

@Override
public Set<Group> findAll() throws TechnicalException {
return internalRepository.findAll()
.stream()
.map(this::convert)
.collect(Collectors.toSet());
}

private Group convert(RedisGroup redisGroup) {
if (redisGroup==null) {
return null;
}
Group group = new Group();
group.setId(redisGroup.getId());
group.setName(redisGroup.getName());
group.setType(Group.Type.valueOf(redisGroup.getType()));
group.setCreatedAt(redisGroup.getCreatedAt());
group.setUpdatedAt(redisGroup.getUpdatedAt());
group.setAdministrators(redisGroup.getAdminstrators());
return group;
}

private RedisGroup convert(Group group) {
if (group==null) {
return null;
}
RedisGroup redisGroup = new RedisGroup();
redisGroup.setId(group.getId());
redisGroup.setName(group.getName());
redisGroup.setType(group.getType().name());
redisGroup.setCreatedAt(group.getCreatedAt());
redisGroup.setUpdatedAt(group.getUpdatedAt());
redisGroup.setAdminstrators(group.getAdministrators());
return redisGroup;
}
}
Expand Up @@ -21,7 +21,8 @@
import java.util.Set;

/**
* @author David BRASSELY (brasseld at gmail.com)
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
public interface ApiRedisRepository {
Expand All @@ -34,6 +35,8 @@ public interface ApiRedisRepository {

Set<RedisApi> findByVisibility(String visibility);

Set<RedisApi> findByGroups(List<String> groupIds);

RedisApi saveOrUpdate(RedisApi api);

void delete(String api);
Expand Down
Expand Up @@ -33,6 +33,8 @@ public interface ApplicationRedisRepository {

Set<RedisApplication> findAll();

Set<RedisApplication> findByGroups(List<String> groupIds);

RedisApplication saveOrUpdate(RedisApplication application);

void delete(String application);
Expand Down
@@ -0,0 +1,38 @@
/**
* 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.redis.management.internal;

import io.gravitee.repository.redis.management.model.RedisGroup;

import java.util.Set;

/**
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
public interface GroupRedisRepository {


RedisGroup find(String groupId);

Set<RedisGroup> findByType(String type);

Set<RedisGroup> findAll();

RedisGroup saveOrUpdate(RedisGroup group);

void delete(String groupId);
}
Expand Up @@ -22,14 +22,12 @@
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author David BRASSELY (brasseld at gmail.com)
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
@Component
Expand Down Expand Up @@ -74,16 +72,35 @@ public Set<RedisApi> findByVisibility(String visibility) {
.collect(Collectors.toSet());
}

@Override
public Set<RedisApi> findByGroups(List<String> groups) {
Set<Object> keys = new HashSet<>();
groups.forEach(group ->keys.addAll(redisTemplate.opsForSet().members(REDIS_KEY + ":group:" + group)));
List<Object> apiObjects = redisTemplate.opsForHash().multiGet(REDIS_KEY, keys);

return apiObjects.stream()
.map(event -> convert(event, RedisApi.class))
.collect(Collectors.toSet());
}

@Override
public RedisApi saveOrUpdate(RedisApi api) {
RedisApi oldApi = find(api.getId());
redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
redisTemplate.opsForHash().put(REDIS_KEY, api.getId(), api);
redisTemplate.opsForSet().add(REDIS_KEY + ":visibility:" + api.getVisibility(), api.getId());

if (oldApi != null) {
redisTemplate.opsForSet().remove(REDIS_KEY + ":visibility:" + oldApi.getVisibility(), api.getId());
if(oldApi.getGroup() != null) {
redisTemplate.opsForSet().remove(REDIS_KEY + ":group:" + oldApi.getGroup(), api.getId());
}
}

redisTemplate.opsForSet().add(REDIS_KEY + ":visibility:" + api.getVisibility(), api.getId());
if(api.getGroup() != null) {
redisTemplate.opsForSet().add(REDIS_KEY + ":group:" + api.getGroup(), api.getId());
}

return null;
Expand Down
Expand Up @@ -19,14 +19,12 @@
import io.gravitee.repository.redis.management.model.RedisApplication;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author David BRASSELY (brasseld at gmail.com)
* @author David BRASSELY (david.brassely at graviteesource.com)
* @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
* @author GraviteeSource Team
*/
@Component
Expand Down Expand Up @@ -64,9 +62,24 @@ public Set<RedisApplication> findAll() {
@Override
public RedisApplication saveOrUpdate(RedisApplication application) {
redisTemplate.opsForHash().put(REDIS_KEY, application.getId(), application);
if(application.getGroup() != null) {
redisTemplate.opsForSet().add(REDIS_KEY + ":group:" + application.getGroup(), application.getId());
}
return application;
}


@Override
public Set<RedisApplication> findByGroups(List<String> groups) {
Set<Object> keys = new HashSet<>();
groups.forEach(group->keys.addAll(redisTemplate.opsForSet().members(REDIS_KEY + ":group:" + group)));
List<Object> apiObjects = redisTemplate.opsForHash().multiGet(REDIS_KEY, keys);

return apiObjects.stream()
.map(event -> convert(event, RedisApplication.class))
.collect(Collectors.toSet());
}

@Override
public void delete(String application) {
redisTemplate.opsForHash().delete(REDIS_KEY, application);
Expand Down

0 comments on commit 5c70ce4

Please sign in to comment.