ProjectService.java

1
package com.edtech.service;
2
3
import com.edtech.dto.ProjectMemberRequestDto;
4
import com.edtech.dto.ProjectRequestDto;
5
import com.edtech.dto.ProjectResponseDto;
6
import com.edtech.model.AcaoAuditoria;
7
import com.edtech.model.Project;
8
import com.edtech.model.ProjectMember;
9
import com.edtech.model.ProjectRole;
10
import com.edtech.model.User;
11
import com.edtech.repository.ProjectMemberRepository;
12
import com.edtech.repository.ProjectRepository;
13
import com.edtech.repository.UserRepository;
14
import java.util.List;
15
import java.util.UUID;
16
import java.util.stream.Collectors;
17
import org.springframework.cache.annotation.CacheEvict;
18
import org.springframework.cache.annotation.Cacheable;
19
import org.springframework.stereotype.Service;
20
import org.springframework.transaction.annotation.Transactional;
21
22
/** Documentação para ProjectService. */
23
@Service
24
public class ProjectService {
25
26
  private final ProjectRepository projectRepository;
27
  private final ProjectMemberRepository projectMemberRepository;
28
  private final UserRepository userRepository;
29
  private final AuditLogService auditLogService;
30
31
  /** Documentação. */
32
  public ProjectService(
33
      ProjectRepository projectRepository,
34
      ProjectMemberRepository projectMemberRepository,
35
      UserRepository userRepository,
36
      AuditLogService auditLogService) {
37
    this.projectRepository = projectRepository;
38
    this.projectMemberRepository = projectMemberRepository;
39
    this.userRepository = userRepository;
40
    this.auditLogService = auditLogService;
41
  }
42
43
  /** Documentação. */
44
  @Transactional
45
  @CacheEvict(value = "projects", key = "#advisorId")
46
  public ProjectResponseDto createProject(ProjectRequestDto request, UUID advisorId) {
47
    User advisor =
48
        userRepository
49
            .findById(advisorId)
50 1 1. lambda$createProject$0 : replaced return value with null for com/edtech/service/ProjectService::lambda$createProject$0 → KILLED
            .orElseThrow(() -> new RuntimeException("User not found"));
51
52
    Project project = new Project();
53 1 1. createProject : removed call to com/edtech/model/Project::setTitle → SURVIVED
    project.setTitle(request.getTitle());
54 1 1. createProject : removed call to com/edtech/model/Project::setDescription → SURVIVED
    project.setDescription(request.getDescription());
55 1 1. createProject : removed call to com/edtech/model/Project::setAdvisor → SURVIVED
    project.setAdvisor(advisor);
56
57
    project = projectRepository.save(project);
58
59
    ProjectMember member = new ProjectMember();
60 1 1. createProject : removed call to com/edtech/model/ProjectMember::setProject → SURVIVED
    member.setProject(project);
61 1 1. createProject : removed call to com/edtech/model/ProjectMember::setUser → KILLED
    member.setUser(advisor);
62 1 1. createProject : removed call to com/edtech/model/ProjectMember::setRole → KILLED
    member.setRole(ProjectRole.ADVISOR);
63
    projectMemberRepository.save(member);
64
65 1 1. createProject : replaced return value with null for com/edtech/service/ProjectService::createProject → KILLED
    return mapToDto(project);
66
  }
67
68
  /** Documentação para o método listProjectsByUser. */
69
  @Cacheable(value = "projects", key = "#userId")
70
  public List<ProjectResponseDto> listProjectsByUser(UUID userId) {
71 1 1. listProjectsByUser : replaced return value with Collections.emptyList for com/edtech/service/ProjectService::listProjectsByUser → KILLED
    return projectRepository.findProjectsByUserId(userId).stream()
72
        .map(this::mapToDto)
73
        .collect(Collectors.toList());
74
  }
75
76
  /** Documentação. */
77
  @Transactional
78
  @CacheEvict(value = "projects", allEntries = true)
79
  public void addMember(UUID projectId, ProjectMemberRequestDto dto, User authenticatedUser) {
80
    Project project =
81
        projectRepository
82
            .findById(projectId)
83 1 1. lambda$addMember$1 : replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$1 → KILLED
            .orElseThrow(() -> new RuntimeException("Project not found"));
84
85
    UUID targetUserId =
86 2 1. addMember : negated conditional → KILLED
2. addMember : negated conditional → KILLED
        (dto != null && dto.getUserId() != null) ? dto.getUserId() : authenticatedUser.getId();
87
88
    // Se o usuário que está tentando associar alguém for diferente do alvo, ele deve ser ADVISOR do
89
    // projeto.
90 1 1. addMember : negated conditional → KILLED
    if (!targetUserId.equals(authenticatedUser.getId())) {
91
      ProjectMember advisorMember =
92
          projectMemberRepository
93
              .findByProjectIdAndUserId(projectId, authenticatedUser.getId())
94
              .orElseThrow(
95 1 1. lambda$addMember$2 : replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$2 → KILLED
                  () -> new RuntimeException("User is not part of the project to add members"));
96
97 1 1. addMember : negated conditional → KILLED
      if (advisorMember.getRole() != ProjectRole.ADVISOR) {
98
        throw new RuntimeException("Only ADVISORS can add other members");
99
      }
100
    }
101
102 1 1. addMember : negated conditional → KILLED
    if (projectMemberRepository.findByProjectIdAndUserId(projectId, targetUserId).isPresent()) {
103
      throw new RuntimeException("User is already a member of this project");
104
    }
105
106
    User newUser =
107
        userRepository
108
            .findById(targetUserId)
109 1 1. lambda$addMember$3 : replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$3 → KILLED
            .orElseThrow(() -> new RuntimeException("User not found"));
110
111
    String roleStr =
112 2 1. addMember : negated conditional → KILLED
2. addMember : negated conditional → KILLED
        (dto != null && dto.getRole() != null) ? dto.getRole().toUpperCase() : "RESEARCHER";
113
114
    ProjectMember newMember = new ProjectMember();
115 1 1. addMember : removed call to com/edtech/model/ProjectMember::setProject → SURVIVED
    newMember.setProject(project);
116 1 1. addMember : removed call to com/edtech/model/ProjectMember::setUser → KILLED
    newMember.setUser(newUser);
117 1 1. addMember : removed call to com/edtech/model/ProjectMember::setRole → KILLED
    newMember.setRole(ProjectRole.valueOf(roleStr));
118
    projectMemberRepository.save(newMember);
119
120
    auditLogService.logAction(
121
        authenticatedUser.getId(),
122
        AcaoAuditoria.MEMBER_JOINED,
123
        "User " + newUser.getEmail() + " joined project " + project.getTitle());
124
  }
125
126
  private ProjectResponseDto mapToDto(Project project) {
127
    ProjectResponseDto dto = new ProjectResponseDto();
128 1 1. mapToDto : removed call to com/edtech/dto/ProjectResponseDto::setId → KILLED
    dto.setId(project.getId());
129 1 1. mapToDto : removed call to com/edtech/dto/ProjectResponseDto::setTitle → KILLED
    dto.setTitle(project.getTitle());
130 1 1. mapToDto : removed call to com/edtech/dto/ProjectResponseDto::setDescription → KILLED
    dto.setDescription(project.getDescription());
131 1 1. mapToDto : removed call to com/edtech/dto/ProjectResponseDto::setAdvisorId → KILLED
    dto.setAdvisorId(project.getAdvisor().getId());
132 1 1. mapToDto : removed call to com/edtech/dto/ProjectResponseDto::setCreatedAt → SURVIVED
    dto.setCreatedAt(project.getCreatedAt());
133 1 1. mapToDto : replaced return value with null for com/edtech/service/ProjectService::mapToDto → KILLED
    return dto;
134
  }
135
}

Mutations

50

1.1
Location : lambda$createProject$0
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_UserNotFound_ThrowsException()]
replaced return value with null for com/edtech/service/ProjectService::lambda$createProject$0 → KILLED

53

1.1
Location : createProject
Killed by : none
removed call to com/edtech/model/Project::setTitle → SURVIVED

54

1.1
Location : createProject
Killed by : none
removed call to com/edtech/model/Project::setDescription → SURVIVED

55

1.1
Location : createProject
Killed by : none
removed call to com/edtech/model/Project::setAdvisor → SURVIVED

60

1.1
Location : createProject
Killed by : none
removed call to com/edtech/model/ProjectMember::setProject → SURVIVED

61

1.1
Location : createProject
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_WithValidData_ReturnsProjectDto()]
removed call to com/edtech/model/ProjectMember::setUser → KILLED

62

1.1
Location : createProject
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_WithValidData_ReturnsProjectDto()]
removed call to com/edtech/model/ProjectMember::setRole → KILLED

65

1.1
Location : createProject
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_WithValidData_ReturnsProjectDto()]
replaced return value with null for com/edtech/service/ProjectService::createProject → KILLED

71

1.1
Location : listProjectsByUser
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:listProjectsByUser_ReturnsList()]
replaced return value with Collections.emptyList for com/edtech/service/ProjectService::listProjectsByUser → KILLED

83

1.1
Location : lambda$addMember$1
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_ProjectNotFound_ThrowsException()]
replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$1 → KILLED

86

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_TargetUserDifferent_AuthUserNotAdvisor_ThrowsException()]
negated conditional → KILLED

2.2
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_TargetUserDifferent_AuthUserNotAdvisor_ThrowsException()]
negated conditional → KILLED

90

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_UserAlreadyMember_ThrowsException()]
negated conditional → KILLED

95

1.1
Location : lambda$addMember$2
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_TargetUserDifferent_AuthUserNotMember_ThrowsException()]
replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$2 → KILLED

97

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_TargetUserDifferent_AuthUserNotAdvisor_ThrowsException()]
negated conditional → KILLED

102

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_UserAlreadyMember_ThrowsException()]
negated conditional → KILLED

109

1.1
Location : lambda$addMember$3
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_UserNotFound_ThrowsException()]
replaced return value with null for com/edtech/service/ProjectService::lambda$addMember$3 → KILLED

112

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_WithNullUserIdInDto_DefaultsToAuthUserId()]
negated conditional → KILLED

2.2
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_WithNullDto_DefaultsToAuthUserAndResearcherRole()]
negated conditional → KILLED

115

1.1
Location : addMember
Killed by : none
removed call to com/edtech/model/ProjectMember::setProject → SURVIVED

116

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_WithNullDto_DefaultsToAuthUserAndResearcherRole()]
removed call to com/edtech/model/ProjectMember::setUser → KILLED

117

1.1
Location : addMember
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:addMember_WithNullDto_DefaultsToAuthUserAndResearcherRole()]
removed call to com/edtech/model/ProjectMember::setRole → KILLED

128

1.1
Location : mapToDto
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:listProjectsByUser_ReturnsList()]
removed call to com/edtech/dto/ProjectResponseDto::setId → KILLED

129

1.1
Location : mapToDto
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:listProjectsByUser_ReturnsList()]
removed call to com/edtech/dto/ProjectResponseDto::setTitle → KILLED

130

1.1
Location : mapToDto
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_WithValidData_ReturnsProjectDto()]
removed call to com/edtech/dto/ProjectResponseDto::setDescription → KILLED

131

1.1
Location : mapToDto
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:createProject_WithValidData_ReturnsProjectDto()]
removed call to com/edtech/dto/ProjectResponseDto::setAdvisorId → KILLED

132

1.1
Location : mapToDto
Killed by : none
removed call to com/edtech/dto/ProjectResponseDto::setCreatedAt → SURVIVED

133

1.1
Location : mapToDto
Killed by : com.edtech.service.ProjectServiceTest.[engine:junit-jupiter]/[class:com.edtech.service.ProjectServiceTest]/[method:listProjectsByUser_ReturnsList()]
replaced return value with null for com/edtech/service/ProjectService::mapToDto → KILLED

Active mutators

Tests examined


Report generated by PIT 1.16.1