Skip to content
GroupsTreeBuilder.java 2.93 KiB
Newer Older
package it.inaf.ia2.gms.service;

import it.inaf.ia2.gms.model.GroupNode;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.gms.model.response.PaginatedData;
import it.inaf.ia2.gms.model.request.PaginatedModelRequest;
import it.inaf.ia2.gms.model.request.SearchFilterRequest;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Returns to the user only the groups he or she is allowed to see.
 */
@Component
public class GroupsTreeBuilder {

    private final GroupsDAO groupsDAO;
    private final PermissionsDAO permissionsDAO;

    @Autowired
    public GroupsTreeBuilder(GroupsDAO groupsDAO, PermissionsDAO permissionsDAO) {
        this.groupsDAO = groupsDAO;
        this.permissionsDAO = permissionsDAO;
    }

    public <T extends PaginatedModelRequest & SearchFilterRequest> PaginatedData<GroupNode> listSubGroups(GroupEntity parentGroup, T request, String userId) {

        // All the sub groups of given parent
        List<GroupEntity> allGroups = groupsDAO.getDirectSubGroups(parentGroup.getPath(), request.getSearchFilter());

        // Select only the groups visible to the user
        List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(userId);
        List<GroupNode> userGroups = filterOnPermissions(allGroups, permissions);

        PaginatedData<GroupNode> paginatedGroups = new PaginatedData<>(userGroups,
                request.getPaginatorPage(), request.getPaginatorPageSize());

        fillHasChildrenFlags(paginatedGroups.getItems());

        return paginatedGroups;
    }

    private List<GroupNode> filterOnPermissions(List<GroupEntity> allGroups, List<PermissionEntity> permissions) {

        List<GroupNode> nodes = new ArrayList<>();

        for (GroupEntity group : allGroups) {

            PermissionUtils.getGroupPermission(group, permissions).ifPresent(permission -> {

                GroupNode node = new GroupNode();
                node.setGroupId(group.getId());
                node.setGroupName(group.getName());
                node.setPermission(permission);
                nodes.add(node);
            });
        }

        // Sort by group name
        nodes.sort((n1, n2) -> n1.getGroupName().compareTo(n2.getGroupName()));
        return nodes;
    }

    private void fillHasChildrenFlags(List<GroupNode> groups) {

        Set<String> groupIds = groups.stream().map(g -> g.getGroupId()).collect(Collectors.toSet());

        Map<String, Boolean> hasChildrenMap = groupsDAO.getHasChildrenMap(groupIds);

        for (GroupNode group : groups) {
            group.setHasChildren(hasChildrenMap.get(group.getGroupId()));
        }
    }
}