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 (#7)
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasGeraud authored and tcompiegne committed Oct 18, 2016
1 parent b3c9e63 commit 272120f
Show file tree
Hide file tree
Showing 12 changed files with 412 additions and 16 deletions.
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 All @@ -73,6 +82,7 @@ public Application update(Application application) throws TechnicalException {
redisApplication.setDescription(application.getDescription());
redisApplication.setUpdatedAt(application.getUpdatedAt().getTime());
redisApplication.setType(application.getType());
redisApplication.setGroup(application.getGroup());

applicationRedisRepository.saveOrUpdate(redisApplication);
return convert(redisApplication);
Expand All @@ -96,6 +106,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 +119,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
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Loading

0 comments on commit 272120f

Please sign in to comment.