Skip to content
GroupsManager.java 2.79 KiB
Newer Older
package it.inaf.ia2.gms.manager;

import it.inaf.ia2.gms.exception.BadRequestException;
import it.inaf.ia2.gms.exception.UnauthorizedException;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.persistence.LoggingDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.service.GroupsService;
import org.springframework.stereotype.Service;

@Service
public class GroupsManager extends UserAwareComponent {

    private final GroupsService groupsService;
    private final PermissionsManager permissionsManager;
    private final LoggingDAO loggingDAO;

    public GroupsManager(GroupsService groupsService, PermissionsManager permissionsManager, LoggingDAO loggingDAO) {
        this.groupsService = groupsService;
        this.permissionsManager = permissionsManager;
        this.loggingDAO = loggingDAO;
    }

    public GroupEntity getRoot() {
        return getGroupById(GroupsService.ROOT);
    }

    public GroupEntity getGroupById(String groupId) {
        GroupEntity group = groupsService.getGroupById(groupId);
        verifyUserCanReadGroup(group);
        return group;
    }

Sonia Zorba's avatar
Sonia Zorba committed
    public GroupEntity getGroupByPath(String path) {
        GroupEntity group = groupsService.getGroupByPath(path);
        verifyUserCanReadGroup(group);
        return group;
    }

    public GroupEntity createGroup(GroupEntity parent, String childGroupName, boolean leaf) {

        if (parent.isLeaf()) {
            throw new BadRequestException("Unable to create a sub group inside a leaf group");
        }

        verifyUserCanManageGroup(parent);

        return groupsService.addGroup(parent, childGroupName, leaf, getCurrentUserId());
    }

    public GroupEntity updateGroup(String groupId, String newGroupName, boolean leaf) {

        GroupEntity group = groupsService.getGroupById(groupId);
        verifyUserCanManageGroup(group);

Sonia Zorba's avatar
Sonia Zorba committed
        return groupsService.updateGroup(group, newGroupName, leaf);
    }

    public GroupEntity deleteGroup(String groupId) {
        GroupEntity group = groupsService.getGroupById(groupId);
        verifyUserCanManageGroup(group);
        return groupsService.deleteGroup(group);
    }

    public void verifyUserCanReadGroup(GroupEntity group) {
        if (permissionsManager.getCurrentUserPermission(group) == null) {
            loggingDAO.logAction("Unauthorized group management request, group_id=" + group.getId());
            throw new UnauthorizedException("Missing permission to see this group");
        }
    }

    private void verifyUserCanManageGroup(GroupEntity group) {
        if (permissionsManager.getCurrentUserPermission(group) != Permission.ADMIN) {
            loggingDAO.logAction("Unauthorized group management request, group_id=" + group.getId());
            throw new UnauthorizedException("Missing admin permission");
        }
    }
}