AssignmentManager.java

  1. /*
  2.  * The coLAB project
  3.  * Copyright (C) 2021-2024 AlbaSim, MEI, HEIG-VD, HES-SO
  4.  *
  5.  * Licensed under the MIT License
  6.  */
  7. package ch.colabproject.colab.api.controller.team;

  8. import ch.colabproject.colab.api.controller.card.CardManager;
  9. import ch.colabproject.colab.api.controller.project.ProjectManager;
  10. import ch.colabproject.colab.api.model.card.Card;
  11. import ch.colabproject.colab.api.model.team.TeamMember;
  12. import ch.colabproject.colab.api.model.team.acl.Assignment;
  13. import ch.colabproject.colab.api.model.team.acl.InvolvementLevel;
  14. import ch.colabproject.colab.api.persistence.jpa.team.acl.AssignmentDao;
  15. import ch.colabproject.colab.generator.model.exceptions.HttpErrorMessage;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;

  18. import javax.ejb.LocalBean;
  19. import javax.ejb.Stateless;
  20. import javax.inject.Inject;
  21. import java.util.List;
  22. import java.util.Objects;
  23. import java.util.stream.Collectors;

  24. /**
  25.  * Some logic to manage assignments of team members on cards
  26.  *
  27.  * @author sandra
  28.  */
  29. @Stateless
  30. @LocalBean
  31. public class AssignmentManager {

  32.     /** logger */
  33.     private static final Logger logger = LoggerFactory.getLogger(AssignmentManager.class);

  34.     /** Assignments persistence */
  35.     @Inject
  36.     private AssignmentDao assignmentDao;

  37.     /** Team specific logic handling */
  38.     @Inject
  39.     private TeamManager teamManager;

  40.     /** Project specific logic handling */
  41.     @Inject
  42.     private ProjectManager projectManager;

  43.     /** Card specific logic handling */
  44.     @Inject
  45.     private CardManager cardManager;

  46.     // *********************************************************************************************
  47.     // find assignments
  48.     // *********************************************************************************************

  49.     /**
  50.      * Retrieve the assignments related to the given project
  51.      *
  52.      * @param projectId the id of the project
  53.      *
  54.      * @return list of assignments
  55.      */
  56.     public List<Assignment> getAssignmentsForProject(Long projectId) {
  57.         return projectManager.getCards(projectId).stream()
  58.             .flatMap(card -> {
  59.                 return getAssignmentsForCard(card.getId()).stream();
  60.             })
  61.             .collect(Collectors.toList());
  62.     }

  63.     /**
  64.      * Get assignments list for the given card
  65.      *
  66.      * @param cardId id of the card
  67.      *
  68.      * @return the of assignments for the given card
  69.      *
  70.      * @throws HttpErrorMessage 404 if the card does not exist
  71.      */
  72.     public List<Assignment> getAssignmentsForCard(Long cardId) {
  73.         Card card = cardManager.assertAndGetCard(cardId);
  74.         return card.getAssignments();
  75.     }

  76.     /**
  77.      * Get assignments list for the given card and the given team member
  78.      *
  79.      * @param card       the card
  80.      * @param teamMember the team member
  81.      *
  82.      * @return the list of assignments for the given card and the given team member
  83.      */
  84.     public List<Assignment> getAssignmentsForCardAndTeamMember(Card card, TeamMember teamMember) {
  85.         List<Assignment> assignments = card.getAssignments();
  86.         return assignments.stream()
  87.                 .filter(asg -> Objects.equals(asg.getMember(), teamMember))
  88.                 .collect(Collectors.toList());
  89.     }

  90.     // *********************************************************************************************
  91.     // create / updated
  92.     // *********************************************************************************************

  93.     /**
  94.      * Set an assignment for a member regarding to a card.
  95.      * <p>
  96.      * For now, at one time, there is only one assignment per card x member
  97.      *
  98.      * @param cardId   id of the card
  99.      * @param memberId id of the member
  100.      * @param level    the level
  101.      */
  102.     public void setAssignment(Long cardId, Long memberId, InvolvementLevel level) {
  103.         Card card = cardManager.assertAndGetCard(cardId);
  104.         TeamMember member = teamManager.assertAndGetMember(memberId);

  105.         Assignment assignment = card.getAssignmentByMember(member);

  106.         if (assignment == null) {
  107.             assignment = new Assignment();

  108.             assignment.setCard(card);
  109.             assignment.setMember(member);

  110.             assignmentDao.persistAssignment(assignment);

  111.             card.getAssignments().add(assignment);
  112.             member.getAssignments().add(assignment);
  113.         }

  114.         assignment.setInvolvementLevel(level);
  115.     }

  116.     // *********************************************************************************************
  117.     // deletion
  118.     // *********************************************************************************************

  119.     /**
  120.      * Remove the assignment for a member regarding to a card.
  121.      *
  122.      * @param cardId   id of the card
  123.      * @param memberId id of the member
  124.      */
  125.     public void deleteAssignment(Long cardId, Long memberId) {
  126.         Card card = cardManager.assertAndGetCard(cardId);
  127.         TeamMember member = teamManager.assertAndGetMember(memberId);

  128.         Assignment assignment = card.getAssignmentByMember(member);

  129.         if (assignment != null) {
  130.             deleteAssignment(assignment);
  131.         }

  132.     }

  133.     /**
  134.      * Delete an assignment
  135.      *
  136.      * @param assignment the assignment to delete
  137.      */
  138.     private void deleteAssignment(Assignment assignment) {
  139.         logger.trace("delete assignment {}", assignment);

  140.         if (assignment.getMember() != null) {
  141.             assignment.getMember().getAssignments().remove(assignment);
  142.         }

  143.         if (assignment.getRole() != null) {
  144.             assignment.getRole().getAssignments().remove(assignment);
  145.         }

  146.         if (assignment.getCard() != null) {
  147.             assignment.getCard().getAssignments().remove(assignment);
  148.         }

  149.         assignmentDao.deleteAssignment(assignment);

  150.     }
  151. }