Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
d204718
Merge pull request #2084 from objectcomputing/develop
mkimberlin Dec 17, 2023
d790168
Merge pull request #2094 from objectcomputing/develop
mkimberlin Dec 18, 2023
0f8ac5e
Merge pull request #2098 from objectcomputing/develop
mkimberlin Jan 2, 2024
8b88e40
Merge pull request #2128 from objectcomputing/develop
mkimberlin Mar 15, 2024
3261365
Merge branch 'release/0.7.0'
mkimberlin Mar 25, 2024
092f86a
2363 - Notify new guild leaders
chrismckiernan May 31, 2024
c7eface
Forgot this change in 1948 PR
chrismckiernan May 31, 2024
8ebd838
Merge in origin develop
chrismckiernan May 31, 2024
dda5eae
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan May 31, 2024
98c15df
Working through bugs
chrismckiernan May 31, 2024
b0eb991
Fixed create not working
chrismckiernan May 31, 2024
a06b362
Peer review comments, log error when email not sent
chrismckiernan Jun 3, 2024
73acf60
Improving performance of guild leader send email
chrismckiernan Jun 3, 2024
e992db3
Merge branch 'develop' into feature/2363-email-guild-leaders
chrismckiernan Jun 3, 2024
5c0c2ad
Remove async not needed in send guild leader email
chrismckiernan Jun 3, 2024
128e161
Merge branch 'feature/2363-email-guild-leaders' of github.com:objectc…
chrismckiernan Jun 3, 2024
8febd30
Merge branch 'develop' into feature-2363/email-guild-leaders
chrismckiernan Jun 3, 2024
93048f5
Fix typo Unabl -> Unable
chrismckiernan Jun 3, 2024
2b3e265
Merge branch 'feature-2363/email-guild-leaders' of github.com:objectc…
chrismckiernan Jun 3, 2024
8eceffa
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan Jun 4, 2024
f94adb7
Email pdl/supervisor when a member marks any low score (<=2) in pulse…
chrismckiernan Jun 5, 2024
a26ed2c
Merge branch 'master' of github.com:objectcomputing/check-ins into fe…
chrismckiernan Jun 5, 2024
937801d
Reset sender back to nulls
chrismckiernan Jun 5, 2024
dbae30d
Code cleanup
chrismckiernan Jun 5, 2024
7b53aec
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
69ddaf7
Fix broken tests
chrismckiernan Jun 5, 2024
6c9ad76
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
9194e7b
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
2db57dd
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
7f49e1f
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
f82e419
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
40bb9ad
Update server/src/test/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
768f457
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
5e03c94
Merge
chrismckiernan Jun 5, 2024
cb1300d
Fixed emails not sending
chrismckiernan Jun 5, 2024
b955f69
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
3303781
Fix bug
chrismckiernan Jun 5, 2024
ec063d7
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
Jun 5, 2024
663f43e
Fix log text for non existent user
chrismckiernan Jun 5, 2024
9bc0054
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
1a80b6b
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
496b82a
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
138c03f
Revert controller test import change
chrismckiernan Jun 5, 2024
cb0c9ca
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
3d82d3c
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan Jun 5, 2024
8a1579b
Initial commit
chrismckiernan Jun 5, 2024
56aa664
Add tests for member profile
Jun 6, 2024
7dc9125
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
Jun 6, 2024
f91a061
Fix test bug
Jun 6, 2024
e0f1c0a
Refactor guild leader emails to java side
chrismckiernan Jun 6, 2024
1ad32a5
Added more tests to guild test, member profile, and pulse response
chrismckiernan Jun 6, 2024
b2e5eda
Merge branch 'develop' into feature-2363/email-refactor
chrismckiernan Jun 6, 2024
1b6106e
Add missing mocked tags to pulse response
chrismckiernan Jun 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,32 +62,6 @@ public Mono<HttpResponse<GuildResponseDTO>> readGuild(@NotNull UUID id) {
.map(HttpResponse::ok);
}

/**
* Get guild leader based on guild id
*
* @param id of guild
* @return {@link GuildResponseDTO guild leader matching id}
*/

@Get("/leaders/{id}")
public Mono<HttpResponse<Set<MemberProfile>>> getGuildLeaders(@NotNull UUID id) {
return Mono.fromCallable(() -> {
GuildResponseDTO guild = guildService.read(id);
List<GuildMemberResponseDTO> members = guild.getGuildMembers();
Set<MemberProfile> newLeaders = new HashSet<>();
for (GuildMemberResponseDTO member : members) {
if (member.isLead()) {
MemberProfile memberProfile = profileServices.getById(member.getMemberId());
if (memberProfile != null) {
newLeaders.add(memberProfile);
}
}
}
return newLeaders;
})
.map(HttpResponse::ok);
}

/**
* Find guild(s) given a combination of the following parameters
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import jakarta.validation.constraints.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URL;
import java.time.LocalDate;
Expand All @@ -36,6 +38,7 @@ public class GuildServicesImpl implements GuildServices {
private final Environment environment;
private final String webAddress;
public static final String WEB_ADDRESS = "check-ins.web-address";
private static final Logger LOG = LoggerFactory.getLogger(GuildServicesImpl.class);;

public GuildServicesImpl(GuildRepository guildsRepo,
GuildMemberRepository guildMemberRepo, GuildMemberHistoryRepository guildMemberHistoryRepository,
Expand Down Expand Up @@ -93,7 +96,18 @@ public GuildResponseDTO save(GuildCreateDTO guildDTO) {
}
}

return fromEntity(newGuildEntity, newMembers);
GuildResponseDTO guildResponse = fromEntity(newGuildEntity, newMembers);

Set<String> emailsOfNewGuildLeads = newMembers
.stream()
.filter(GuildMemberResponseDTO::isLead)
.map(lead -> memberProfileServices.getById(lead.getMemberId()).getWorkEmail())
.collect(Collectors.toSet());
if (!emailsOfNewGuildLeads.isEmpty()) {
emailGuildLeaders(emailsOfNewGuildLeads, newGuildEntity);
}

return guildResponse;
}

public GuildResponseDTO read(@NotNull UUID guildId) {
Expand Down Expand Up @@ -135,8 +149,10 @@ public GuildResponseDTO update(GuildUpdateDTO guildDTO) {
// track membership changes for email notification
List<MemberProfile> addedMembers = new ArrayList<>();
List<MemberProfile> removedMembers = new ArrayList<>();
Set<GuildMember> guildLeaders = new HashSet<>(guildMemberServices.findByFields(guildDTO.getId(), null, true));

// emails of guild leads excluding the one making the change request
Set<String> emailsOfGuildLeads = guildMemberServices.findByFields(guildDTO.getId(), null, true)
Set<String> emailsOfGuildLeadsExcludingChanger = guildLeaders
.stream()
.filter(lead -> !lead.getMemberId().equals(currentUser.getId()))
.map(lead -> memberProfileServices.getById(lead.getMemberId()).getWorkEmail())
Expand All @@ -149,7 +165,7 @@ public GuildResponseDTO update(GuildUpdateDTO guildDTO) {
guildDTO.getGuildMembers().stream().forEach((updatedMember) -> {
Optional<GuildMember> first = existingGuildMembers.stream().filter((existing) -> existing.getMemberId().equals(updatedMember.getMemberId())).findFirst();
MemberProfile existingMember = memberProfileServices.getById(updatedMember.getMemberId());
if(!first.isPresent()) {
if(first.isEmpty()) {
newMembers.add(fromMemberEntity(guildMemberServices.save(fromMemberDTO(updatedMember, newGuildEntity.getId())), existingMember));
addedMembers.add(existingMember);
} else {
Expand All @@ -166,8 +182,22 @@ public GuildResponseDTO update(GuildUpdateDTO guildDTO) {
});
updated = fromEntity(newGuildEntity, newMembers);

if (!emailsOfGuildLeads.isEmpty() && (!addedMembers.isEmpty() || !removedMembers.isEmpty())){
sendGuildMemberChangeNotification(addedMembers, removedMembers, newGuildEntity.getName(), emailsOfGuildLeads);
if (!emailsOfGuildLeadsExcludingChanger.isEmpty() && (!addedMembers.isEmpty() || !removedMembers.isEmpty())){
sendGuildMemberChangeNotification(addedMembers, removedMembers, newGuildEntity.getName(), emailsOfGuildLeadsExcludingChanger);
}

// Calculate the new set of guild leaders
Set<GuildMember> newGuildLeaders = new HashSet<>(guildMemberServices.findByFields(guildDTO.getId(), null, true));
// Determine the newly added guild leaders
newGuildLeaders.removeAll(guildLeaders);

if (!newGuildLeaders.isEmpty()) {
Set<String> emailsOfNewGuildLeads = newGuildLeaders.stream()
.map(lead -> memberProfileServices.getById(lead.getMemberId()).getWorkEmail())
.collect(Collectors.toSet());
if (!emailsOfNewGuildLeads.isEmpty()) {
emailGuildLeaders(emailsOfNewGuildLeads, newGuildEntity);
}
}

} else {
Expand Down Expand Up @@ -295,4 +325,14 @@ private String constructEmailContent (List<MemberProfile> addedMembers, List<Mem
emailHtml += "<a href=\"" + webAddress + "/guilds\">Click here</a> to view the changes in the Check-Ins app.";
return emailHtml;
}

public void emailGuildLeaders(Set<String> guildLeadersEmails, Guild guild) {
if (guild == null || guild.getName() == null || guild.getName().isEmpty()) {
LOG.warn("Guild name is missing or invalid");
return;
}
String subject = "You have been assigned as a guild leader of " + guild.getName();
String body = "Congratulations, you have been assigned as a guild leader of " + guild.getName();
emailSender.sendEmail(null, null, subject, body, guildLeadersEmails.toArray(new String[0]));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.objectcomputing.checkins.exceptions.BadArgException;
import com.objectcomputing.checkins.exceptions.NotFoundException;
import com.objectcomputing.checkins.exceptions.PermissionException;
import com.objectcomputing.checkins.notifications.email.EmailSender;
import com.objectcomputing.checkins.notifications.email.MailJetConfig;
import com.objectcomputing.checkins.services.checkins.CheckInServices;
import com.objectcomputing.checkins.services.member_skill.MemberSkillServices;
import com.objectcomputing.checkins.services.memberprofile.currentuser.CurrentUserServices;
Expand All @@ -13,8 +15,11 @@
import io.micronaut.cache.annotation.CacheConfig;
import io.micronaut.cache.annotation.Cacheable;
import io.micronaut.core.annotation.Nullable;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import jakarta.validation.constraints.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

Expand All @@ -23,26 +28,30 @@
@Singleton
@CacheConfig("member-cache")
public class MemberProfileServicesImpl implements MemberProfileServices {
private static final Logger LOG = LoggerFactory.getLogger(MemberProfileServicesImpl.class);

private final MemberProfileRepository memberProfileRepository;
private final CurrentUserServices currentUserServices;
private final RoleServices roleServices;
private final CheckInServices checkInServices;
private final MemberSkillServices memberSkillServices;
private final TeamMemberServices teamMemberServices;
private final EmailSender emailSender;

public MemberProfileServicesImpl(MemberProfileRepository memberProfileRepository,
CurrentUserServices currentUserServices,
RoleServices roleServices,
CheckInServices checkInServices,
MemberSkillServices memberSkillServices,
TeamMemberServices teamMemberServices) {
TeamMemberServices teamMemberServices,
@Named(MailJetConfig.HTML_FORMAT) EmailSender emailSender) {
this.memberProfileRepository = memberProfileRepository;
this.currentUserServices = currentUserServices;
this.roleServices = roleServices;
this.checkInServices = checkInServices;
this.memberSkillServices = memberSkillServices;
this.teamMemberServices = teamMemberServices;
this.emailSender = emailSender;
}

@Override
Expand Down Expand Up @@ -86,10 +95,60 @@ public MemberProfile saveProfile(MemberProfile memberProfile) {
}

if (memberProfile.getId() == null) {
return memberProfileRepository.save(memberProfile);
MemberProfile createdMemberProfile = memberProfileRepository.save(memberProfile);
emailAssignment(createdMemberProfile, true); // PDL
emailAssignment(createdMemberProfile, false); // Supervisor
return createdMemberProfile;
}

return memberProfileRepository.update(memberProfile);
Optional<MemberProfile> existingProfileOpt = memberProfileRepository.findById(memberProfile.getId());
MemberProfile updatedMemberProfile = memberProfileRepository.update(memberProfile);
if (existingProfileOpt.isEmpty()) {
LOG.error(String.format("MemberProfile with id %s not found", memberProfile.getId()));
} else {
MemberProfile existingProfile = existingProfileOpt.get();

boolean pdlChanged = !Objects.equals(existingProfile.getPdlId(), memberProfile.getPdlId());
boolean supervisorChanged = !Objects.equals(existingProfile.getSupervisorid(), memberProfile.getSupervisorid());

if (pdlChanged) {
emailAssignment(updatedMemberProfile, true); // PDL
}
if (supervisorChanged) {
emailAssignment(updatedMemberProfile, false); // Supervisor
}
}

return updatedMemberProfile;
}

public void emailAssignment(MemberProfile member, boolean isPDL) {
UUID roleId = isPDL ? member.getPdlId() : member.getSupervisorid();
String role = isPDL ? "PDL" : "supervisor";
if (roleId != null) {
if (member.getLastName() != null && member.getFirstName() != null && member.getWorkEmail() != null) {
Optional<MemberProfile> roleProfileOptional = memberProfileRepository.findById(roleId);

if (roleProfileOptional.isPresent()) {
MemberProfile roleProfile = roleProfileOptional.get();

if (roleProfile.getWorkEmail() != null) {
String subject = "You have been assigned as the " + role + " of " + member.getFirstName() + " " + member.getLastName();
String body = member.getFirstName() + " " + member.getLastName() + " will now report to you as their " + role + ". Please engage with them: " + member.getWorkEmail();

emailSender.sendEmail(null, null, subject, body, roleProfile.getWorkEmail());
} else {
LOG.warn("Unable to send email regarding {} {}'s {} update as the {} was unable to be pulled up correctly",
member.getFirstName(), member.getLastName(), role, role);
}
} else {
LOG.warn("Unable to send email regarding {} {}'s {} update as the {} was not found",
member.getFirstName(), member.getLastName(), role, role);
}
} else {
LOG.warn("Unable to send email regarding as member was not valid and missing required fields: {}", member);
}
}
}

@Override
Expand Down
Loading