From 51f4618632f5194e3fa9b0b042ac3977942c1c36 Mon Sep 17 00:00:00 2001 From: timmi Date: Fri, 28 Mar 2025 18:50:40 -0700 Subject: [PATCH] Refactoring changeRole method to use helper methods, which removes duplicate code. --- .../task_manager/service/AdminService.java | 154 ++++++++---------- 1 file changed, 68 insertions(+), 86 deletions(-) diff --git a/backend/task-manager/src/main/java/com/example/task_manager/service/AdminService.java b/backend/task-manager/src/main/java/com/example/task_manager/service/AdminService.java index 8a95cf0..9e4cb9a 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/service/AdminService.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/service/AdminService.java @@ -131,12 +131,7 @@ public AdminDTO promoteToAdmin(int teamMemberId) { .orElseThrow(() -> new RuntimeException("Team Member not found with ID: " + teamMemberId)); // Find all teams led by this member - List teamsLed = teamRepository.findByTeamLead_AccountId(teamMember.getAccountId()); - for (Team team : teamsLed) { - team.setTeamLead(null); // Explicitly remove team lead - } - teamRepository.saveAll(teamsLed); - teamRepository.flush(); + removeIfTeamLead(teamMemberId); // Extract info String oldName = teamMember.getUserName(); @@ -145,56 +140,20 @@ public AdminDTO promoteToAdmin(int teamMemberId) { String oldSalt = teamMember.getAuthInfo().getSalt(); //extract memberships and assigned tasks - Set oldTasks = teamMember.getAssignedTasks() - .stream() - .map(IsAssigned::getTask) - .collect(Collectors.toSet()); - - Set oldTeams = teamMember.getTeams() - .stream() - .map(IsMemberOf::getTeam) - .collect(Collectors.toSet()); - - // Delete Notifications explicitly - notificationRepository.deleteAll(teamMember.getNotifications()); - teamMember.getNotifications().clear(); - - // DELETE OLD IsAssigned explicitly - isAssignedRepository.deleteAll(teamMember.getAssignedTasks()); - teamMember.getAssignedTasks().clear(); + Set oldTasks = extractTasks(teamMember); + Set oldTeams = extractTeams(teamMember); - // DELETE OLD IsMemberOf explicitly - isMemberOfRepository.deleteAll(teamMember.getTeams()); - teamMember.getTeams().clear(); - - // DELETE AuthInfo explicitly - authInfoRepository.delete(teamMember.getAuthInfo()); - teamMember.setAuthInfo(null); - - // Flush explicitly - authInfoRepository.flush(); - isAssignedRepository.flush(); - isMemberOfRepository.flush(); - notificationRepository.flush(); + clearMemberRelations(teamMember); // Delete old TeamMember safely deleteTeamMember(teamMember.getAccountId()); teamMemberRepository.flush(); - - //print assigned tasks and memberships - System.out.println(); - // NOW create the new Admin safely + // now create the new Admin safely Admin newAdmin = new Admin(oldName, oldEmail); - // Set new relationships as empty sets initially (you can add if needed) - Set newAssignments = oldTasks.stream() - .map(task -> new IsAssigned(task, newAdmin, task.getTeam())) - .collect(Collectors.toSet()); - - Set newMemberships = oldTeams.stream() - .map(team -> new IsMemberOf(newAdmin, team)) - .collect(Collectors.toSet()); + Set newAssignments = connectOldTasks(newAdmin, oldTasks); + Set newMemberships = connectOldTeams(newAdmin, oldTeams); // Set new AuthInfo AuthInfo newAuthInfo = new AuthInfo(); @@ -225,6 +184,9 @@ public TeamMemberDTO demoteToTeamMember(int adminId) { Admin admin = adminRepository.findById(adminId) .orElseThrow(() -> new RuntimeException("Admin not found with ID: " + adminId)); + // Find all teams led by this member + removeIfTeamLead(adminId); + // Extract info String oldName = admin.getUserName(); String oldEmail = admin.getUserEmail(); @@ -232,53 +194,21 @@ public TeamMemberDTO demoteToTeamMember(int adminId) { String oldSalt = admin.getAuthInfo().getSalt(); //extract memberships and assigned tasks - Set oldTasks = admin.getAssignedTasks() - .stream() - .map(IsAssigned::getTask) - .collect(Collectors.toSet()); - - Set oldTeams = admin.getTeams() - .stream() - .map(IsMemberOf::getTeam) - .collect(Collectors.toSet()); + Set oldTasks = extractTasks(admin); + Set oldTeams = extractTeams(admin); - // Delete Notifications explicitly - notificationRepository.deleteAll(admin.getNotifications()); - admin.getNotifications().clear(); - - // DELETE OLD IsAssigned explicitly - isAssignedRepository.deleteAll(admin.getAssignedTasks()); - admin.getAssignedTasks().clear(); - - // DELETE OLD IsMemberOf explicitly - isMemberOfRepository.deleteAll(admin.getTeams()); - admin.getTeams().clear(); - - // DELETE AuthInfo explicitly - authInfoRepository.delete(admin.getAuthInfo()); - admin.setAuthInfo(null); - - // Flush all deletions - authInfoRepository.flush(); - isAssignedRepository.flush(); - isMemberOfRepository.flush(); - notificationRepository.flush(); + clearMemberRelations(admin); // Delete old Admin safely deleteAdmin(admin.getAccountId()); adminRepository.flush(); - // NOW create the new TeamMember safely + // create the new TeamMember safely TeamMember newTeamMember = new TeamMember(oldName, oldEmail); // Set new relationships as empty sets initially (you can add if needed) - Set newAssignments = oldTasks.stream() - .map(task -> new IsAssigned(task, newTeamMember, task.getTeam())) - .collect(Collectors.toSet()); - - Set newMemberships = oldTeams.stream() - .map(team -> new IsMemberOf(newTeamMember, team)) - .collect(Collectors.toSet()); + Set newAssignments = connectOldTasks(newTeamMember, oldTasks); + Set newMemberships = connectOldTeams(newTeamMember, oldTeams); // Set new AuthInfo AuthInfo newAuthInfo = new AuthInfo(); @@ -303,6 +233,58 @@ public TeamMemberDTO demoteToTeamMember(int adminId) { return convertToDTO(savedTeamMember); } + + private void removeIfTeamLead(int memberId) { + List teamsLed = teamRepository.findByTeamLead_AccountId(memberId); + + for (Team team : teamsLed) { + team.setTeamLead(null); + } + + teamRepository.saveAll(teamsLed); + teamRepository.flush(); + } + + private void clearMemberRelations(TeamMember member) { + //delete and clear every relation explicitly + + notificationRepository.deleteAll(member.getNotifications()); + member.getNotifications().clear(); + + isAssignedRepository.deleteAll(member.getAssignedTasks()); + member.getAssignedTasks().clear(); + + isMemberOfRepository.deleteAll(member.getTeams()); + member.getTeams().clear(); + + authInfoRepository.delete(member.getAuthInfo()); + member.setAuthInfo(null); + + notificationRepository.flush(); + isAssignedRepository.flush(); + isMemberOfRepository.flush(); + authInfoRepository.flush(); + } + + private Set extractTasks(TeamMember member) { + return member.getAssignedTasks().stream().map(IsAssigned::getTask).collect(Collectors.toSet()); + } + + private Set extractTeams(TeamMember member) { + return member.getTeams().stream().map(IsMemberOf::getTeam).collect(Collectors.toSet()); + } + + private Set connectOldTasks(TeamMember member, Set tasks) { + return tasks.stream() + .map(task -> new IsAssigned(task, member, task.getTeam())) + .collect(Collectors.toSet()); + } + + private Set connectOldTeams(TeamMember member, Set teams) { + return teams.stream() + .map(team -> new IsMemberOf(member, team)) + .collect(Collectors.toSet()); + } // Assigns a TeamMember to a Team by creating an IsMemberOf entry public TeamMemberDTO assignToTeam(int teamMemberId, int teamId) {