Loading database/Dockerfile 0 → 100644 +2 −0 Original line number Diff line number Diff line FROM library/postgres:11 COPY ../gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/ gms/pom.xml +6 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,12 @@ <artifactId>h2</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.zonky.test</groupId> <artifactId>embedded-database-spring-test</artifactId> <version>1.5.0</version> <scope>test</scope> </dependency> </dependencies> <build> Loading gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java 0 → 100644 +101 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence; import it.inaf.ia2.gms.persistence.model.NewGroup; import java.sql.PreparedStatement; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class GroupsDAO { private final JdbcTemplate jdbcTemplate; @Autowired public GroupsDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public NewGroup createGroup(NewGroup group) { String sql = "INSERT INTO gms_group (id, name, path) VALUES (?, ?, ?)"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, group.getId()); ps.setString(2, group.getName()); ps.setObject(3, group.getPath(), Types.OTHER); return ps; }); return group; } public void deleteGroupById(String groupId) { String sql = "DELETE FROM gms_group WHERE id = ?"; jdbcTemplate.update(sql, groupId); } public List<NewGroup> listSubGroups(String path) { String sql = "SELECT id, name, path from gms_group WHERE path ~ ? ORDER BY name"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, getSubGroupsPath(path), Types.OTHER); return ps; }, resultSet -> { List<NewGroup> groups = new ArrayList<>(); while (resultSet.next()) { NewGroup group = new NewGroup(); group.setId(resultSet.getString("id")); group.setName(resultSet.getString("name")); group.setPath(resultSet.getString("path")); groups.add(group); } return groups; }); } private String getSubGroupsPath(String path) { if (!path.isEmpty()) { path += "."; } path += "*{1}"; return path; } public Map<String, Boolean> getHasChildrenMap(Set<String> groupIds) { String sql = "SELECT g.id, COUNT(s.*) > 0 AS has_children \n" + "FROM gms_group g\n" + "LEFT JOIN gms_group s ON s.path <@ g.path AND s.path <> g.path\n" + "WHERE g.id IN(" + String.join(",", groupIds.stream().map(g -> "?").collect(Collectors.toList())) + ") GROUP BY g.id"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); int i = 0; for (String groupId : groupIds) { ps.setString(++i, groupId); } return ps; }, resultSet -> { Map<String, Boolean> map = new HashMap<>(); while (resultSet.next()) { map.put(resultSet.getString("id"), resultSet.getBoolean("has_children")); } return map; }); } } gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java 0 → 100644 +72 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence; import it.inaf.ia2.gms.model.Permission; import it.inaf.ia2.gms.persistence.model.UserPermission; import java.sql.PreparedStatement; import java.sql.Types; import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class PermissionsDAO { private final JdbcTemplate jdbcTemplate; @Autowired public PermissionsDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public UserPermission createPermission(UserPermission userPermission) { String sql = "INSERT INTO gms_permission(group_id, user_id, permission) VALUES(?, ?, ?)"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userPermission.getGroupId()); ps.setString(2, userPermission.getUserId()); ps.setObject(3, userPermission.getPermission().toString(), Types.OTHER); return ps; }); return userPermission; } public List<UserPermission> findUserPermissions(String userId) { String sql = "SELECT group_id, permission FROM gms_permission WHERE user_id = ?"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userId); return ps; }, resultSet -> { List<UserPermission> permissions = new ArrayList<>(); while (resultSet.next()) { UserPermission permission = new UserPermission(); permission.setGroupId(resultSet.getString("group_id")); permission.setUserId(userId); permission.setPermission(Permission.valueOf(resultSet.getString("permission"))); permissions.add(permission); } return permissions; }); } public void deletePermission(UserPermission userPermission) { String sql = "DELETE FROM gms_permission WHERE group_id = ? AND user_id = ? AND permission = ?"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userPermission.getGroupId()); ps.setString(2, userPermission.getUserId()); ps.setObject(3, userPermission.getPermission().toString(), Types.OTHER); return ps; }); } } gms/src/main/java/it/inaf/ia2/gms/persistence/model/UserPermission.java 0 → 100644 +34 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence.model; import it.inaf.ia2.gms.model.Permission; public class UserPermission { private String userId; private String groupId; private Permission permission; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getGroupId() { return groupId; } public void setGroupId(String groupId) { this.groupId = groupId; } public Permission getPermission() { return permission; } public void setPermission(Permission permission) { this.permission = permission; } } Loading
database/Dockerfile 0 → 100644 +2 −0 Original line number Diff line number Diff line FROM library/postgres:11 COPY ../gms/src/main/resources/sql/init.sql /docker-entrypoint-initdb.d/
gms/pom.xml +6 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,12 @@ <artifactId>h2</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.zonky.test</groupId> <artifactId>embedded-database-spring-test</artifactId> <version>1.5.0</version> <scope>test</scope> </dependency> </dependencies> <build> Loading
gms/src/main/java/it/inaf/ia2/gms/persistence/GroupsDAO.java 0 → 100644 +101 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence; import it.inaf.ia2.gms.persistence.model.NewGroup; import java.sql.PreparedStatement; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class GroupsDAO { private final JdbcTemplate jdbcTemplate; @Autowired public GroupsDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public NewGroup createGroup(NewGroup group) { String sql = "INSERT INTO gms_group (id, name, path) VALUES (?, ?, ?)"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, group.getId()); ps.setString(2, group.getName()); ps.setObject(3, group.getPath(), Types.OTHER); return ps; }); return group; } public void deleteGroupById(String groupId) { String sql = "DELETE FROM gms_group WHERE id = ?"; jdbcTemplate.update(sql, groupId); } public List<NewGroup> listSubGroups(String path) { String sql = "SELECT id, name, path from gms_group WHERE path ~ ? ORDER BY name"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, getSubGroupsPath(path), Types.OTHER); return ps; }, resultSet -> { List<NewGroup> groups = new ArrayList<>(); while (resultSet.next()) { NewGroup group = new NewGroup(); group.setId(resultSet.getString("id")); group.setName(resultSet.getString("name")); group.setPath(resultSet.getString("path")); groups.add(group); } return groups; }); } private String getSubGroupsPath(String path) { if (!path.isEmpty()) { path += "."; } path += "*{1}"; return path; } public Map<String, Boolean> getHasChildrenMap(Set<String> groupIds) { String sql = "SELECT g.id, COUNT(s.*) > 0 AS has_children \n" + "FROM gms_group g\n" + "LEFT JOIN gms_group s ON s.path <@ g.path AND s.path <> g.path\n" + "WHERE g.id IN(" + String.join(",", groupIds.stream().map(g -> "?").collect(Collectors.toList())) + ") GROUP BY g.id"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); int i = 0; for (String groupId : groupIds) { ps.setString(++i, groupId); } return ps; }, resultSet -> { Map<String, Boolean> map = new HashMap<>(); while (resultSet.next()) { map.put(resultSet.getString("id"), resultSet.getBoolean("has_children")); } return map; }); } }
gms/src/main/java/it/inaf/ia2/gms/persistence/PermissionsDAO.java 0 → 100644 +72 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence; import it.inaf.ia2.gms.model.Permission; import it.inaf.ia2.gms.persistence.model.UserPermission; import java.sql.PreparedStatement; import java.sql.Types; import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class PermissionsDAO { private final JdbcTemplate jdbcTemplate; @Autowired public PermissionsDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public UserPermission createPermission(UserPermission userPermission) { String sql = "INSERT INTO gms_permission(group_id, user_id, permission) VALUES(?, ?, ?)"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userPermission.getGroupId()); ps.setString(2, userPermission.getUserId()); ps.setObject(3, userPermission.getPermission().toString(), Types.OTHER); return ps; }); return userPermission; } public List<UserPermission> findUserPermissions(String userId) { String sql = "SELECT group_id, permission FROM gms_permission WHERE user_id = ?"; return jdbcTemplate.query(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userId); return ps; }, resultSet -> { List<UserPermission> permissions = new ArrayList<>(); while (resultSet.next()) { UserPermission permission = new UserPermission(); permission.setGroupId(resultSet.getString("group_id")); permission.setUserId(userId); permission.setPermission(Permission.valueOf(resultSet.getString("permission"))); permissions.add(permission); } return permissions; }); } public void deletePermission(UserPermission userPermission) { String sql = "DELETE FROM gms_permission WHERE group_id = ? AND user_id = ? AND permission = ?"; jdbcTemplate.update(conn -> { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, userPermission.getGroupId()); ps.setString(2, userPermission.getUserId()); ps.setObject(3, userPermission.getPermission().toString(), Types.OTHER); return ps; }); } }
gms/src/main/java/it/inaf/ia2/gms/persistence/model/UserPermission.java 0 → 100644 +34 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.persistence.model; import it.inaf.ia2.gms.model.Permission; public class UserPermission { private String userId; private String groupId; private Permission permission; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getGroupId() { return groupId; } public void setGroupId(String groupId) { this.groupId = groupId; } public Permission getPermission() { return permission; } public void setPermission(Permission permission) { this.permission = permission; } }