Skip to content

Commit 523015b

Browse files
committed
Added permissions to upload hours, and edit/delete skills. Partially modified Kudos Services to work based on permissions, instead of Admin.
1 parent 1ddde8d commit 523015b

File tree

23 files changed

+304
-295
lines changed

23 files changed

+304
-295
lines changed

server/src/main/java/com/objectcomputing/checkins/services/employee_hours/EmployeeHoursController.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.objectcomputing.checkins.services.employee_hours;
22

3+
import com.objectcomputing.checkins.services.permissions.Permission;
4+
import com.objectcomputing.checkins.services.permissions.RequiredPermission;
35
import com.objectcomputing.checkins.exceptions.NotFoundException;
46
import io.micronaut.core.annotation.Nullable;
57
import io.micronaut.http.MediaType;
@@ -39,25 +41,13 @@ public Set<EmployeeHours> findEmployeeHours(@Nullable String employeeId) {
3941
}
4042

4143

42-
/**
43-
* @param id
44-
* @return
45-
*/
46-
@Get("/{id}")
47-
public EmployeeHours readEmployeeHours(@NotNull UUID id) {
48-
EmployeeHours result = employeeHoursServices.read(id);
49-
if (result == null) {
50-
throw new NotFoundException("No employee hours for employee id");
51-
}
52-
return result;
53-
}
54-
5544
/**
5645
* Parse the CSV file and store it to employee hours table
5746
* @param file
5847
* @{@link HttpResponse<EmployeeHoursResponseDTO>}
5948
*/
6049
@Post(uri="/upload" , consumes = MediaType.MULTIPART_FORM_DATA)
50+
@RequiredPermission(Permission.CAN_UPLOAD_HOURS)
6151
public EmployeeHoursResponseDTO upload(CompletedFileUpload file){
6252
return employeeHoursServices.save(file);
6353
}

server/src/main/java/com/objectcomputing/checkins/services/employee_hours/EmployeeHoursServices.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ public interface EmployeeHoursServices {
99

1010
EmployeeHoursResponseDTO save(CompletedFileUpload file);
1111

12-
EmployeeHours read(UUID id);
13-
1412
Set<EmployeeHours> findByFields(String employeeId);
1513

1614
}

server/src/main/java/com/objectcomputing/checkins/services/employee_hours/EmployeeHoursServicesImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public EmployeeHoursResponseDTO save(CompletedFileUpload file) {
4040
List<EmployeeHours> employeeHoursList = new ArrayList<>();
4141
Set<EmployeeHours> employeeHours = new HashSet<>();
4242
EmployeeHoursResponseDTO responseDTO = new EmployeeHoursResponseDTO();
43-
validate(!isAdmin, NOT_AUTHORIZED_MSG);
4443
responseDTO.setRecordCountDeleted(employeehourRepo.count());
4544
employeehourRepo.deleteAll();
4645
try {
@@ -58,11 +57,6 @@ public EmployeeHoursResponseDTO save(CompletedFileUpload file) {
5857
}
5958

6059

61-
@Override
62-
public EmployeeHours read(UUID id) {
63-
return employeehourRepo.findById(id).orElse(null);
64-
}
65-
6660
@Override
6761
public Set<EmployeeHours> findByFields(String employeeId) {
6862
MemberProfile currentUser = currentUserServices.getCurrentUser();

server/src/main/java/com/objectcomputing/checkins/services/kudos/KudosServicesImpl.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,6 @@ public Kudos save(KudosCreateDTO kudosDTO) {
121121

122122
@Override
123123
public Kudos approve(Kudos kudos) {
124-
if (!currentUserServices.isAdmin()) {
125-
throw new PermissionException(NOT_AUTHORIZED_MSG);
126-
}
127-
128124
UUID kudosId = kudos.getId();
129125
Kudos existingKudos = kudosRepository.findById(kudosId).orElseThrow(() ->
130126
new BadArgException(KUDOS_DOES_NOT_EXIST_MSG.formatted(kudosId)));
@@ -173,10 +169,6 @@ public KudosResponseDTO getById(UUID id) {
173169

174170
@Override
175171
public void delete(UUID id) {
176-
if (!currentUserServices.isAdmin()) {
177-
throw new PermissionException(NOT_AUTHORIZED_MSG);
178-
}
179-
180172
Kudos kudos = kudosRepository.findById(id).orElseThrow(() ->
181173
new NotFoundException(KUDOS_DOES_NOT_EXIST_MSG.formatted(id)));
182174

server/src/main/java/com/objectcomputing/checkins/services/memberprofile/MemberProfileController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public HttpResponse<MemberProfileResponseDTO> save(@Body @Valid MemberProfileCre
111111
*/
112112
@Put
113113
public HttpResponse<MemberProfileResponseDTO> update(@Body @Valid MemberProfileUpdateDTO memberProfile) {
114-
MemberProfile savedProfile = memberProfileServices.saveProfile(fromDTO(memberProfile));
114+
MemberProfile savedProfile = memberProfileServices.updateProfile(fromDTO(memberProfile));
115115
return HttpResponse.ok(fromEntity(savedProfile))
116116
.headers(headers -> headers.location(location(savedProfile.getId())));
117117
}

server/src/main/java/com/objectcomputing/checkins/services/memberprofile/MemberProfileServices.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ Set<MemberProfile> findByValues(String firstName, String lastName, String title,
2727
List<MemberProfile> getSubordinatesForId(UUID id);
2828

2929
MemberProfile updateProfile(MemberProfile memberProfile);
30+
31+
MemberProfile updateCurrentUserProfile(MemberProfile memberProfile);
3032
}

server/src/main/java/com/objectcomputing/checkins/services/memberprofile/MemberProfileServicesImpl.java

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.*;
2626

2727
import static com.objectcomputing.checkins.util.Util.nullSafeUUIDToString;
28+
import static com.objectcomputing.checkins.services.validate.PermissionsValidation.NOT_AUTHORIZED_MSG;
2829

2930
@Singleton
3031
@CacheConfig("member-cache")
@@ -110,27 +111,9 @@ public MemberProfile saveProfile(MemberProfile memberProfile) {
110111
emailAssignment(createdMemberProfile, true); // PDL
111112
emailAssignment(createdMemberProfile, false); // Supervisor
112113
return createdMemberProfile;
113-
}
114-
115-
Optional<MemberProfile> existingProfileOpt = memberProfileRepository.findById(memberProfile.getId());
116-
MemberProfile updatedMemberProfile = memberProfileRepository.update(memberProfile);
117-
if (existingProfileOpt.isEmpty()) {
118-
LOG.error("MemberProfile with id {} not found", memberProfile.getId());
119114
} else {
120-
MemberProfile existingProfile = existingProfileOpt.get();
121-
122-
boolean pdlChanged = !Objects.equals(existingProfile.getPdlId(), memberProfile.getPdlId());
123-
boolean supervisorChanged = !Objects.equals(existingProfile.getSupervisorid(), memberProfile.getSupervisorid());
124-
125-
if (pdlChanged) {
126-
emailAssignment(updatedMemberProfile, true); // PDL
127-
}
128-
if (supervisorChanged) {
129-
emailAssignment(updatedMemberProfile, false); // Supervisor
130-
}
115+
throw new BadArgException("New member created with an id");
131116
}
132-
133-
return updatedMemberProfile;
134117
}
135118

136119
public void emailAssignment(MemberProfile member, boolean isPDL) {
@@ -165,9 +148,6 @@ public void emailAssignment(MemberProfile member, boolean isPDL) {
165148
@Override
166149
@CacheInvalidate(cacheNames = {"member-cache"})
167150
public boolean deleteProfile(@NotNull UUID id) {
168-
if (!currentUserServices.isAdmin()) {
169-
throw new PermissionException("Requires admin privileges");
170-
}
171151
MemberProfile memberProfile = memberProfileRepository.findById(id).orElse(null);
172152
Set<Role> userRoles = (memberProfile != null) ? roleServices.findUserRoles(memberProfile.getId()) : Collections.emptySet();
173153

@@ -237,6 +217,47 @@ public List<MemberProfile> getSubordinatesForId(UUID id) {
237217
@Override
238218
@CacheInvalidate(cacheNames = {"member-cache"})
239219
public MemberProfile updateProfile(MemberProfile memberProfile) {
220+
if (memberProfile.getId() == null) {
221+
throw new BadArgException("Null profile id in update");
222+
}
223+
224+
MemberProfile currentUser = currentUserServices.getCurrentUser();
225+
boolean isAdmin = currentUserServices.isAdmin();
226+
if (!isAdmin && (currentUser == null || !currentUser.getId().equals(memberProfile.getId()))) {
227+
throw new PermissionException(NOT_AUTHORIZED_MSG);
228+
}
229+
230+
MemberProfile emailProfile = memberProfileRepository.findByWorkEmail(memberProfile.getWorkEmail()).orElse(null);
231+
232+
if (emailProfile != null && emailProfile.getId() != null && !Objects.equals(memberProfile.getId(), emailProfile.getId())) {
233+
throw new AlreadyExistsException(String.format("Email %s already exists in database",
234+
memberProfile.getWorkEmail()));
235+
}
236+
237+
Optional<MemberProfile> existingProfileOpt = memberProfileRepository.findById(memberProfile.getId());
238+
MemberProfile updatedMemberProfile = memberProfileRepository.update(memberProfile);
239+
if (existingProfileOpt.isEmpty()) {
240+
LOG.error("MemberProfile with id {} not found", memberProfile.getId());
241+
} else {
242+
MemberProfile existingProfile = existingProfileOpt.get();
243+
244+
boolean pdlChanged = !Objects.equals(existingProfile.getPdlId(), memberProfile.getPdlId());
245+
boolean supervisorChanged = !Objects.equals(existingProfile.getSupervisorid(), memberProfile.getSupervisorid());
246+
247+
if (pdlChanged) {
248+
emailAssignment(updatedMemberProfile, true); // PDL
249+
}
250+
if (supervisorChanged) {
251+
emailAssignment(updatedMemberProfile, false); // Supervisor
252+
}
253+
}
254+
255+
return updatedMemberProfile;
256+
}
257+
258+
@Override
259+
@CacheInvalidate(cacheNames = {"member-cache"})
260+
public MemberProfile updateCurrentUserProfile(MemberProfile memberProfile) {
240261
return memberProfileRepository.update(memberProfile);
241262
}
242263
}

server/src/main/java/com/objectcomputing/checkins/services/memberprofile/currentuser/CurrentUserController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public HttpResponse<CurrentUserDTO> currentUser(@Nullable Authentication authent
6464
MemberProfile user = currentUserServices.findOrSaveUser(firstName, lastName, workEmail);
6565

6666
user.setLastSeen(LocalDate.now());
67-
memberProfileServices.updateProfile(user);
67+
memberProfileServices.updateCurrentUserProfile(user);
6868
List<Permission> permissions = rolePermissionServices.findUserPermissions(user.getId());
6969

7070
Set<Role> roles = roleServices.findUserRoles(user.getId());

server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum Permission {
2727
CAN_VIEW_PROFILE_REPORT("View profile report", "Reporting"),
2828
CAN_VIEW_CHECKINS_REPORT("View checkins report", "Reporting"),
2929
CAN_CREATE_MERIT_REPORT("Create Merit Reports", "Reporting"),
30+
CAN_UPLOAD_HOURS("Upload Hours", "Reporting"),
3031
CAN_CREATE_CHECKINS("Create check-ins", "Check-ins"),
3132
CAN_VIEW_CHECKINS("View check-ins", "Check-ins"),
3233
CAN_UPDATE_CHECKINS("Update check-ins", "Check-ins"),
@@ -41,6 +42,7 @@ public enum Permission {
4142
CAN_VIEW_ALL_CHECKINS("View all check-ins", "Check-ins"),
4243
CAN_UPDATE_ALL_CHECKINS("Update all check-ins, including completed check-ins", "Check-ins"),
4344
CAN_EDIT_SKILL_CATEGORIES("Edit skill categories", "Skill Categories"),
45+
CAN_EDIT_SKILLS("Edit skills", "Skills"),
4446
CAN_CREATE_REVIEW_ASSIGNMENTS("Create review assignments", "Reviews"),
4547
CAN_VIEW_REVIEW_ASSIGNMENTS("View review assignments", "Reviews"),
4648
CAN_UPDATE_REVIEW_ASSIGNMENTS("Update review assignments", "Reviews"),

server/src/main/java/com/objectcomputing/checkins/services/skills/SkillController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.objectcomputing.checkins.services.skills;
22

3+
import com.objectcomputing.checkins.services.permissions.Permission;
4+
import com.objectcomputing.checkins.services.permissions.RequiredPermission;
35
import com.objectcomputing.checkins.exceptions.NotFoundException;
46
import io.micronaut.core.annotation.Nullable;
57
import io.micronaut.http.HttpRequest;
@@ -84,6 +86,7 @@ public Set<Skill> findByValue(@Nullable String name, @Nullable Boolean pending)
8486
* @return {@link HttpResponse<Skill>}
8587
*/
8688
@Put
89+
@RequiredPermission(Permission.CAN_EDIT_SKILLS)
8790
public HttpResponse<Skill> update(@Body @Valid Skill skill, HttpRequest<?> request) {
8891
Skill updatedSkill = skillServices.update(skill);
8992
return HttpResponse.ok(updatedSkill)
@@ -97,7 +100,8 @@ public HttpResponse<Skill> update(@Body @Valid Skill skill, HttpRequest<?> reque
97100
*/
98101
@Delete("/{id}")
99102
@Status(HttpStatus.OK)
103+
@RequiredPermission(Permission.CAN_EDIT_SKILLS)
100104
public void deleteSkill(@NotNull UUID id) {
101105
skillServices.delete(id);
102106
}
103-
}
107+
}

0 commit comments

Comments
 (0)