Skip to content

Commit 567cba1

Browse files
authored
Merge pull request #2760 from objectcomputing/feature-2759/server-side-markdown
Refactor merit report to utilize cache for lookup by email
2 parents 6d22527 + 4130041 commit 567cba1

File tree

8 files changed

+154
-150
lines changed

8 files changed

+154
-150
lines changed

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
@@ -9,6 +9,8 @@
99
public interface MemberProfileServices {
1010
MemberProfile getById(UUID id);
1111

12+
MemberProfile findByWorkEmail(@NotNull String workEmail);
13+
1214
Set<MemberProfile> findByValues(String firstName, String lastName, String title,
1315
UUID pdlId, String workEmail, UUID supervisorId, Boolean terminated);
1416

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.objectcomputing.checkins.services.role.RoleServices;
1414
import com.objectcomputing.checkins.services.team.member.TeamMemberServices;
1515
import io.micronaut.cache.annotation.CacheConfig;
16+
import io.micronaut.cache.annotation.CacheInvalidate;
1617
import io.micronaut.cache.annotation.Cacheable;
1718
import io.micronaut.core.annotation.Nullable;
1819
import jakarta.inject.Named;
@@ -55,6 +56,7 @@ public MemberProfileServicesImpl(MemberProfileRepository memberProfileRepository
5556
}
5657

5758
@Override
59+
@Cacheable
5860
public MemberProfile getById(@NotNull UUID id) {
5961
Optional<MemberProfile> optional = memberProfileRepository.findById(id);
6062
if (optional.isEmpty()) {
@@ -67,6 +69,14 @@ public MemberProfile getById(@NotNull UUID id) {
6769
return memberProfile;
6870
}
6971

72+
@Cacheable
73+
@Override
74+
public MemberProfile findByWorkEmail(@NotNull String workEmail) {
75+
return memberProfileRepository.findByWorkEmail(workEmail).orElseThrow(() ->
76+
new NotFoundException("Member not found")
77+
);
78+
}
79+
7080
@Override
7181
public Set<MemberProfile> findByValues(@Nullable String firstName,
7282
@Nullable String lastName,
@@ -86,6 +96,7 @@ public Set<MemberProfile> findByValues(@Nullable String firstName,
8696
}
8797

8898
@Override
99+
@CacheInvalidate(cacheNames = {"member-cache"})
89100
public MemberProfile saveProfile(MemberProfile memberProfile) {
90101
MemberProfile emailProfile = memberProfileRepository.findByWorkEmail(memberProfile.getWorkEmail()).orElse(null);
91102

@@ -152,6 +163,7 @@ public void emailAssignment(MemberProfile member, boolean isPDL) {
152163
}
153164

154165
@Override
166+
@CacheInvalidate(cacheNames = {"member-cache"})
155167
public boolean deleteProfile(@NotNull UUID id) {
156168
if (!currentUserServices.isAdmin()) {
157169
throw new PermissionException("Requires admin privileges");
@@ -183,6 +195,7 @@ public boolean deleteProfile(@NotNull UUID id) {
183195
}
184196

185197
@Override
198+
@Cacheable(parameters = {"firstName", "lastName"})
186199
public MemberProfile findByName(@NotNull String firstName, @NotNull String lastName) {
187200
List<MemberProfile> searchResult = memberProfileRepository.search(firstName, null, lastName,
188201
null, null, null, null, null, null);
@@ -222,6 +235,7 @@ public List<MemberProfile> getSubordinatesForId(UUID id) {
222235
}
223236

224237
@Override
238+
@CacheInvalidate(cacheNames = {"member-cache"})
225239
public MemberProfile updateProfile(MemberProfile memberProfile) {
226240
return memberProfileRepository.update(memberProfile);
227241
}

server/src/main/java/com/objectcomputing/checkins/services/reports/CSVProcessor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.objectcomputing.checkins.services.reports;
22

3-
import com.objectcomputing.checkins.services.memberprofile.MemberProfileRepository;
43
import com.objectcomputing.checkins.exceptions.BadArgException;
54

5+
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
66
import org.apache.commons.csv.CSVFormat;
77
import org.apache.commons.csv.CSVParser;
88

@@ -18,7 +18,7 @@
1818

1919
abstract class CSVProcessor {
2020

21-
public void load(MemberProfileRepository memberProfileRepository,
21+
public void load(MemberProfileServices memberProfileServices,
2222
ByteBuffer dataSource) throws IOException,
2323
BadArgException {
2424
ByteArrayInputStream stream = new ByteArrayInputStream(dataSource.array());
@@ -30,10 +30,10 @@ public void load(MemberProfileRepository memberProfileRepository,
3030
.setNullString("")
3131
.build()
3232
.parse(input);
33-
loadImpl(memberProfileRepository, csvParser);
33+
loadImpl(memberProfileServices, csvParser);
3434
}
3535

36-
protected abstract void loadImpl(MemberProfileRepository memberProfileRepository, CSVParser csvParser) throws BadArgException;
36+
protected abstract void loadImpl(MemberProfileServices memberProfileServices, CSVParser csvParser) throws BadArgException;
3737

3838
protected LocalDate parseDate(String date) {
3939
List<String> formatStrings = List.of("yyyy", "M/d/yyyy");
Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.objectcomputing.checkins.services.reports;
22

3+
import com.objectcomputing.checkins.exceptions.NotFoundException;
34
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
4-
import com.objectcomputing.checkins.services.memberprofile.MemberProfileRepository;
55
import com.objectcomputing.checkins.exceptions.BadArgException;
66

7+
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
78
import io.micronaut.core.annotation.Introspected;
89
import org.apache.commons.csv.CSVParser;
910
import org.apache.commons.csv.CSVRecord;
@@ -12,10 +13,7 @@
1213
import org.slf4j.LoggerFactory;
1314

1415
import java.time.LocalDate;
15-
import java.util.ArrayList;
16-
import java.util.List;
17-
import java.util.UUID;
18-
import java.util.Optional;
16+
import java.util.*;
1917

2018
public class CompensationHistory extends CSVProcessor {
2119

@@ -32,41 +30,39 @@ public record Compensation(
3230
private final List<Compensation> history = new ArrayList<>();
3331

3432
@Override
35-
protected void loadImpl(MemberProfileRepository memberProfileRepository,
33+
protected void loadImpl(MemberProfileServices memberProfileServices,
3634
CSVParser csvParser) throws BadArgException {
37-
history.clear();
38-
for (CSVRecord csvRecord : csvParser) {
39-
try {
40-
String emailAddress = csvRecord.get("emailAddress");
41-
Optional<MemberProfile> memberProfile =
42-
memberProfileRepository.findByWorkEmail(emailAddress);
43-
if (memberProfile.isPresent()) {
44-
String startDate = csvRecord.get("startDate");
45-
LocalDate date = parseDate(startDate);
46-
if (date == null) {
47-
LOG.error("Unable to parse date: {}", startDate);
48-
} else {
49-
String value = csvRecord.get("compensation");
50-
Compensation comp = new Compensation(
51-
memberProfile.get().getId(),
52-
date,
53-
value == null ? null : value.replaceAll("[^\\d\\.,]", ""),
54-
csvRecord.get("totalComp")
55-
);
56-
history.add(comp);
35+
history.clear();
36+
for (CSVRecord csvRecord : csvParser) {
37+
String emailAddress = null;
38+
try {
39+
emailAddress = csvRecord.get("emailAddress");
40+
MemberProfile memberProfile = memberProfileServices.findByWorkEmail(emailAddress);
41+
String startDate = csvRecord.get("startDate");
42+
LocalDate date = parseDate(startDate);
43+
if (date == null) {
44+
LOG.error("Unable to parse date: {}", startDate);
45+
} else {
46+
String value = csvRecord.get("compensation");
47+
Compensation comp = new Compensation(
48+
memberProfile.getId(),
49+
date,
50+
value == null ? null : value.replaceAll("[^\\d\\.,]", ""),
51+
csvRecord.get("totalComp")
52+
);
53+
history.add(comp);
54+
}
55+
} catch (NotFoundException nfe) {
56+
LOG.error("Unable to find a profile for {}", emailAddress);
57+
} catch (IllegalArgumentException ex) {
58+
throw new BadArgException("Unable to parse the compensation history");
5759
}
58-
} else {
59-
LOG.error("Unable to find a profile for {}", emailAddress);
60-
}
61-
} catch(IllegalArgumentException ex) {
62-
throw new BadArgException("Unable to parse the compensation history");
6360
}
64-
}
6561
}
6662

6763
public List<Compensation> getHistory(UUID memberId) {
68-
return history.stream()
69-
.filter(entry -> entry.memberId().equals(memberId))
70-
.toList();
64+
return history.stream()
65+
.filter(entry -> entry.memberId().equals(memberId))
66+
.toList();
7167
}
7268
}

server/src/main/java/com/objectcomputing/checkins/services/reports/CurrentInformation.java

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,66 @@
22

33
import com.objectcomputing.checkins.exceptions.NotFoundException;
44
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
5-
import com.objectcomputing.checkins.services.memberprofile.MemberProfileRepository;
65
import com.objectcomputing.checkins.exceptions.BadArgException;
76

7+
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
88
import io.micronaut.core.annotation.Introspected;
99
import org.apache.commons.csv.CSVParser;
1010
import org.apache.commons.csv.CSVRecord;
1111

1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414

15-
import java.util.ArrayList;
16-
import java.util.List;
17-
import java.util.UUID;
18-
import java.util.Optional;
15+
import java.util.*;
1916

2017
public class CurrentInformation extends CSVProcessor {
2118

22-
@Introspected
23-
public record Information(
24-
UUID memberId,
25-
float salary,
26-
String range,
27-
String nationalRange,
28-
String biography,
29-
String commitments
30-
) {
31-
}
19+
@Introspected
20+
public record Information(
21+
UUID memberId,
22+
float salary,
23+
String range,
24+
String nationalRange,
25+
String biography,
26+
String commitments
27+
) {
28+
}
3229

33-
private static final Logger LOG = LoggerFactory.getLogger(CurrentInformation.class);
34-
private final List<Information> information = new ArrayList<>();
30+
private static final Logger LOG = LoggerFactory.getLogger(CurrentInformation.class);
31+
private final List<Information> information = new ArrayList<>();
3532

36-
@Override
37-
protected void loadImpl(MemberProfileRepository memberProfileRepository,
38-
CSVParser csvParser) throws BadArgException {
39-
information.clear();
40-
for (CSVRecord csvRecord : csvParser) {
41-
try {
42-
String emailAddress = csvRecord.get("emailAddress");
43-
Optional<MemberProfile> memberProfile =
44-
memberProfileRepository.findByWorkEmail(emailAddress);
45-
if (memberProfile.isPresent()) {
46-
Information comp = new Information(
47-
memberProfile.get().getId(),
48-
Float.parseFloat(csvRecord.get("salary")
49-
.replaceAll("[^\\d\\.,]", "")),
50-
csvRecord.get("range"),
51-
csvRecord.get("nationalRange"),
52-
csvRecord.get("biography"),
53-
csvRecord.get("commitments")
54-
);
55-
information.add(comp);
56-
} else {
57-
LOG.error("Unable to find a profile for {}", emailAddress);
33+
@Override
34+
protected void loadImpl(MemberProfileServices memberProfileServices,
35+
CSVParser csvParser) throws BadArgException {
36+
information.clear();
37+
for (CSVRecord csvRecord : csvParser) {
38+
String emailAddress = null;
39+
try {
40+
emailAddress = csvRecord.get("emailAddress");
41+
MemberProfile memberProfile = memberProfileServices.findByWorkEmail(emailAddress);
42+
Information comp = new Information(
43+
memberProfile.getId(),
44+
Float.parseFloat(csvRecord.get("salary")
45+
.replaceAll("[^\\d\\.,]", "")),
46+
csvRecord.get("range"),
47+
csvRecord.get("nationalRange"),
48+
csvRecord.get("biography"),
49+
csvRecord.get("commitments")
50+
);
51+
information.add(comp);
52+
} catch (NotFoundException nfe) {
53+
LOG.error("Unable to find a profile for {}", emailAddress);
54+
} catch (IllegalArgumentException ex) {
55+
throw new BadArgException("Unable to parse the current information");
56+
}
5857
}
59-
} catch(IllegalArgumentException ex) {
60-
throw new BadArgException("Unable to parse the current information");
61-
}
6258
}
63-
}
6459

65-
public Information getInformation(UUID memberId) {
66-
// There should only be one entry per member.
67-
return information.stream()
68-
.filter(entry -> entry.memberId().equals(memberId))
69-
.findFirst()
70-
.orElseThrow(() -> new NotFoundException("Current Information not found for member: " + memberId));
71-
}
60+
public Information getInformation(UUID memberId) {
61+
// There should only be one entry per member.
62+
return information.stream()
63+
.filter(entry -> entry.memberId().equals(memberId))
64+
.findFirst()
65+
.orElseThrow(() -> new NotFoundException("Current Information not found for member: " + memberId));
66+
}
7267
}

0 commit comments

Comments
 (0)