diff --git a/server/src/main/java/com/objectcomputing/checkins/configuration/CheckInsConfiguration.java b/server/src/main/java/com/objectcomputing/checkins/configuration/CheckInsConfiguration.java index 48debf6853..b1c707a559 100644 --- a/server/src/main/java/com/objectcomputing/checkins/configuration/CheckInsConfiguration.java +++ b/server/src/main/java/com/objectcomputing/checkins/configuration/CheckInsConfiguration.java @@ -24,5 +24,47 @@ public static class ApplicationConfig { @NotBlank private String name; + + @NotNull + private FeedbackConfig feedback; + + @NotNull + private GoogleApiConfig googleApi; + + @Getter + @Setter + @ConfigurationProperties("feedback") + public static class FeedbackConfig { + + @NotNull + private Integer maxSuggestions; + + @NotBlank + private String requestSubject; + } + + @Getter + @Setter + @ConfigurationProperties("google-api") + public static class GoogleApiConfig { + + @NotBlank + private String delegatedUser; + + @NotNull + private ScopeConfig scopes; + + @Getter + @Setter + @ConfigurationProperties("scopes") + public static class ScopeConfig { + + @NotBlank + private String scopeForDriveApi; + + @NotBlank + private String scopeForDirectoryApi; + } + } } } diff --git a/server/src/main/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionServiceImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionServiceImpl.java index 39eae44ce3..44339b8b2e 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionServiceImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionServiceImpl.java @@ -1,12 +1,12 @@ package com.objectcomputing.checkins.services.feedback.suggestions; +import com.objectcomputing.checkins.configuration.CheckInsConfiguration; import com.objectcomputing.checkins.exceptions.PermissionException; import com.objectcomputing.checkins.services.memberprofile.MemberProfile; import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices; import com.objectcomputing.checkins.services.memberprofile.currentuser.CurrentUserServices; import com.objectcomputing.checkins.services.team.member.TeamMember; import com.objectcomputing.checkins.services.team.member.TeamMemberServices; -import io.micronaut.context.annotation.Property; import jakarta.inject.Singleton; import java.time.LocalDate; @@ -19,24 +19,21 @@ import static com.objectcomputing.checkins.services.validate.PermissionsValidation.NOT_AUTHORIZED_MSG; @Singleton -public class FeedbackSuggestionServiceImpl implements FeedbackSuggestionsService { - - public static final String MAX_SUGGESTIONS = "check-ins.application.feedback.max-suggestions"; +class FeedbackSuggestionServiceImpl implements FeedbackSuggestionsService { private final MemberProfileServices memberProfileServices; private final CurrentUserServices currentUserServices; private final TeamMemberServices teamMemberServices; private final Integer maxSuggestions; - - public FeedbackSuggestionServiceImpl(MemberProfileServices memberProfileServices, - CurrentUserServices currentUserServices, - TeamMemberServices teamMemberServices, - @Property(name = MAX_SUGGESTIONS) Integer maxSuggestions) { + FeedbackSuggestionServiceImpl(MemberProfileServices memberProfileServices, + CurrentUserServices currentUserServices, + TeamMemberServices teamMemberServices, + CheckInsConfiguration checkInsConfiguration) { this.memberProfileServices = memberProfileServices; this.currentUserServices = currentUserServices; this.teamMemberServices = teamMemberServices; - this.maxSuggestions = maxSuggestions; + this.maxSuggestions = checkInsConfiguration.getApplication().getFeedback().getMaxSuggestions(); } @Override @@ -50,49 +47,47 @@ public List getSuggestionsByProfileId(UUID id) { } List suggestions = new LinkedList<>(); - if(suggestFor.getSupervisorid() != null && !suggestFor.getSupervisorid().equals(currentUser.getId()) && isMemberActive(suggestFor.getSupervisorid())) { + if (suggestFor.getSupervisorid() != null && !suggestFor.getSupervisorid().equals(currentUser.getId()) && isMemberActive(suggestFor.getSupervisorid())) { suggestions.add(new FeedbackSuggestionDTO("Supervisor of requestee", suggestFor.getSupervisorid())); } - if(suggestFor.getPdlId() != null && !suggestFor.getPdlId().equals(currentUser.getId()) && isMemberActive(suggestFor.getPdlId())) { + if (suggestFor.getPdlId() != null && !suggestFor.getPdlId().equals(currentUser.getId()) && isMemberActive(suggestFor.getPdlId())) { suggestions.add(new FeedbackSuggestionDTO("PDL of requestee", suggestFor.getPdlId())); } Set teamMemberships = teamMemberServices.findByFields(null, id, null); - for(TeamMember currentMembership: teamMemberships){ + for (TeamMember currentMembership : teamMemberships) { Set teamMembers = teamMemberServices.findByFields(currentMembership.getTeamId(), null, null); - Set leads = teamMembers.stream().filter(member -> member.isLead()).collect(Collectors.toSet()); + Set leads = teamMembers.stream().filter(TeamMember::isLead).collect(Collectors.toSet()); leads = filterTerminated(leads); - for(TeamMember lead: leads) { - if(suggestions.size() < maxSuggestions && !lead.getMemberId().equals(id) && !lead.getMemberId().equals(currentUserId)) { + for (TeamMember lead : leads) { + if (suggestions.size() < maxSuggestions && !lead.getMemberId().equals(id) && !lead.getMemberId().equals(currentUserId)) { suggestions.add(new FeedbackSuggestionDTO("Team lead for requestee", lead.getMemberId())); } } - if(suggestions.size() >= maxSuggestions) break; + if (suggestions.size() >= maxSuggestions) break; } - for(TeamMember currentMembership: teamMemberships){ + for (TeamMember currentMembership : teamMemberships) { Set teamMembers = teamMemberServices.findByFields(currentMembership.getTeamId(), null, null); teamMembers = teamMembers.stream().filter(member -> !member.isLead()).collect(Collectors.toSet()); teamMembers = filterTerminated(teamMembers); - for(TeamMember teamMember: teamMembers) { - if(suggestions.size() < maxSuggestions && !teamMember.getMemberId().equals(id) && !teamMember.getMemberId().equals(currentUserId)) { + for (TeamMember teamMember : teamMembers) { + if (suggestions.size() < maxSuggestions && !teamMember.getMemberId().equals(id) && !teamMember.getMemberId().equals(currentUserId)) { suggestions.add(new FeedbackSuggestionDTO("Team member for requestee", teamMember.getMemberId())); } } - if(suggestions.size() >= maxSuggestions) break; + if (suggestions.size() >= maxSuggestions) break; } - + return suggestions; } private Set filterTerminated(Set suggestions) { - suggestions = suggestions.stream().filter((TeamMember suggestion) -> { - return isMemberActive(suggestion.getMemberId()); - }).collect(Collectors.toSet()); + suggestions = suggestions.stream().filter(suggestion -> isMemberActive(suggestion.getMemberId())).collect(Collectors.toSet()); return suggestions; } diff --git a/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java index 2eb7914e21..218e6bb351 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java @@ -12,7 +12,6 @@ import com.objectcomputing.checkins.services.reviews.ReviewPeriod; import com.objectcomputing.checkins.services.reviews.ReviewPeriodRepository; import com.objectcomputing.checkins.util.Util; -import io.micronaut.context.annotation.Property; import jakarta.inject.Named; import jakarta.inject.Singleton; import org.slf4j.Logger; @@ -35,8 +34,6 @@ public class FeedbackRequestServicesImpl implements FeedbackRequestServices { private static final Logger LOG = LoggerFactory.getLogger(FeedbackRequestServicesImpl.class); - public static final String FEEDBACK_REQUEST_NOTIFICATION_SUBJECT = "check-ins.application.feedback.notifications.subject"; - public static final String FEEDBACK_REQUEST_NOTIFICATION_CONTENT = "check-ins.application.feedback.notifications.content"; private final FeedbackRequestRepository feedbackReqRepository; private final CurrentUserServices currentUserServices; private final MemberProfileServices memberProfileServices; @@ -50,7 +47,6 @@ public FeedbackRequestServicesImpl(FeedbackRequestRepository feedbackReqReposito MemberProfileServices memberProfileServices, ReviewPeriodRepository reviewPeriodRepository, @Named(MailJetFactory.HTML_FORMAT) EmailSender emailSender, - @Property(name = FEEDBACK_REQUEST_NOTIFICATION_SUBJECT) String notificationSubject, CheckInsConfiguration checkInsConfiguration ) { this.feedbackReqRepository = feedbackReqRepository; @@ -58,7 +54,7 @@ public FeedbackRequestServicesImpl(FeedbackRequestRepository feedbackReqReposito this.memberProfileServices = memberProfileServices; this.reviewPeriodRepository = reviewPeriodRepository; this.emailSender = emailSender; - this.notificationSubject = notificationSubject; + this.notificationSubject = checkInsConfiguration.getApplication().getFeedback().getRequestSubject(); this.webURL = checkInsConfiguration.getWebAddress(); } diff --git a/server/src/main/java/com/objectcomputing/checkins/util/googleapiaccess/GoogleAccessor.java b/server/src/main/java/com/objectcomputing/checkins/util/googleapiaccess/GoogleAccessor.java index 3c9cb40029..0fa08eb7c4 100644 --- a/server/src/main/java/com/objectcomputing/checkins/util/googleapiaccess/GoogleAccessor.java +++ b/server/src/main/java/com/objectcomputing/checkins/util/googleapiaccess/GoogleAccessor.java @@ -25,18 +25,15 @@ public class GoogleAccessor { private final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private final NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); - private final String applicationName; private final GoogleAuthenticator authenticator; - private final Environment environment; + private final CheckInsConfiguration checkInsConfiguration; public GoogleAccessor( GoogleAuthenticator authenticator, - Environment environment, CheckInsConfiguration checkInsConfiguration ) throws GeneralSecurityException, IOException { - this.applicationName = checkInsConfiguration.getApplication().getName(); + this.checkInsConfiguration = checkInsConfiguration; this.authenticator = authenticator; - this.environment = environment; } /** @@ -47,13 +44,13 @@ public GoogleAccessor( */ public Drive accessGoogleDrive() throws IOException { - String apiScope = environment.getProperty("check-ins.application.google-api.scopes.scopeForDriveApi", String.class).orElse(""); + String apiScope = checkInsConfiguration.getApplication().getGoogleApi().getScopes().getScopeForDriveApi(); List scope = Collections.singletonList(apiScope); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(authenticator.setupCredentials(scope)); return new Drive .Builder(httpTransport, JSON_FACTORY, requestInitializer) - .setApplicationName(applicationName) + .setApplicationName(checkInsConfiguration.getApplication().getName()) .build(); } @@ -65,8 +62,8 @@ public Drive accessGoogleDrive() throws IOException { */ public Directory accessGoogleDirectory() throws IOException { - String apiScope = environment.getProperty("check-ins.application.google-api.scopes.scopeForDirectoryApi", String.class).orElse(""); - String delegatedUser = environment.getProperty("check-ins.application.google-api.delegated-user", String.class).orElse(""); + String apiScope = checkInsConfiguration.getApplication().getGoogleApi().getScopes().getScopeForDirectoryApi(); + String delegatedUser = checkInsConfiguration.getApplication().getGoogleApi().getDelegatedUser(); List scope = Arrays.asList(apiScope.split(",")); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter( @@ -74,7 +71,7 @@ public Directory accessGoogleDirectory() throws IOException { return new Directory .Builder(httpTransport, JSON_FACTORY, requestInitializer) - .setApplicationName(applicationName) + .setApplicationName(checkInsConfiguration.getApplication().getName()) .build(); } } diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index deb8dd1405..753d8f47a0 100755 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -92,13 +92,11 @@ check-ins: google-api: delegated-user: ${ GSUITE_SUPER_ADMIN } scopes: - scopeForDriveApi: "https://www.googleapis.com/auth/drive.file" - scopeForDirectoryApi: "https://www.googleapis.com/auth/admin.directory.user.readonly" + scope-for-drive-api: "https://www.googleapis.com/auth/drive.file" + scope-for-directory-api: "https://www.googleapis.com/auth/admin.directory.user.readonly" feedback: max-suggestions: 6 - notifications: - subject: "Feedback request" - content: "You have received a feedback request. Please go to the " + request-subject: "Feedback request" web-address: ${ WEB_ADDRESS } --- flyway: diff --git a/server/src/test/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionsControllerTest.java b/server/src/test/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionsControllerTest.java index a3b986745b..7b359649f2 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionsControllerTest.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/feedback/suggestions/FeedbackSuggestionsControllerTest.java @@ -1,7 +1,11 @@ package com.objectcomputing.checkins.services.feedback.suggestions; import com.objectcomputing.checkins.services.TestContainersSuite; -import com.objectcomputing.checkins.services.fixture.*; +import com.objectcomputing.checkins.services.fixture.FeedbackFixture; +import com.objectcomputing.checkins.services.fixture.MemberProfileFixture; +import com.objectcomputing.checkins.services.fixture.RoleFixture; +import com.objectcomputing.checkins.services.fixture.TeamFixture; +import com.objectcomputing.checkins.services.fixture.TeamMemberFixture; import com.objectcomputing.checkins.services.memberprofile.MemberProfile; import com.objectcomputing.checkins.services.role.RoleType; import com.objectcomputing.checkins.services.team.Team; @@ -12,31 +16,25 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.client.HttpClient; import io.micronaut.http.client.annotation.Client; +import jakarta.inject.Inject; import org.junit.jupiter.api.Test; -import jakarta.inject.Inject; -import java.util.*; +import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; class FeedbackSuggestionsControllerTest extends TestContainersSuite implements MemberProfileFixture, TeamMemberFixture, TeamFixture, FeedbackFixture, RoleFixture { - private static final Logger LOG = LoggerFactory.getLogger(FeedbackSuggestionsControllerTest.class); + private final String supervisorReason = "Supervisor of requestee"; private final String teamLeadReason = "Team lead for requestee"; private final String teamMemberReason = "Team member for requestee"; private final String pdlReason = "PDL of requestee"; - @Inject @Client("/services/feedback/suggestions") HttpClient client; - void assertContentEqualsEntity(FeedbackSuggestionDTO ideal, FeedbackSuggestionDTO actualResponse) { - assertEquals(ideal.getReason(), actualResponse.getReason()); - assertEquals(ideal.getId(), actualResponse.getId()); - } @Test void testGetRecsIfPdl() { Team team = createDefaultTeam(); @@ -190,4 +188,9 @@ void testDoesNotIncludeTerminatedTeamMembers() { assertContentEqualsEntity(idealTwo, response.getBody().get().get(1)); assertContentEqualsEntity(idealThree, response.getBody().get().get(2)); } + + private void assertContentEqualsEntity(FeedbackSuggestionDTO ideal, FeedbackSuggestionDTO actualResponse) { + assertEquals(ideal.getReason(), actualResponse.getReason()); + assertEquals(ideal.getId(), actualResponse.getId()); + } } \ No newline at end of file diff --git a/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestControllerTest.java b/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestControllerTest.java index dfb79037be..92b7afc829 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestControllerTest.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestControllerTest.java @@ -50,9 +50,6 @@ class FeedbackRequestControllerTest extends TestContainersSuite implements Membe @Client("/services/feedback/requests") HttpClient client; - @Property(name = FeedbackRequestServicesImpl.FEEDBACK_REQUEST_NOTIFICATION_SUBJECT) - String notificationSubject; - @Inject CheckInsConfiguration checkInsConfiguration; @@ -214,7 +211,7 @@ void testCreateFeedbackRequestSendsEmailNow() { "SEND_EMAIL", fromName, pdlMemberProfile.getWorkEmail(), - notificationSubject, + checkInsConfiguration.getApplication().getFeedback().getRequestSubject(), correctContent, recipient.getWorkEmail() ), @@ -1078,7 +1075,7 @@ void testFeedbackRequestEnableEditsSendsEmail() { "SEND_EMAIL", fromName, pdl.getWorkEmail(), - notificationSubject, + checkInsConfiguration.getApplication().getFeedback().getRequestSubject(), correctContent, recipient.getWorkEmail() ), diff --git a/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestTest.java b/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestTest.java index 55d4f23be0..ca1f888440 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestTest.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestTest.java @@ -30,6 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; + import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -66,7 +67,7 @@ void setUp() { reviewPeriodRepository = Mockito.mock(ReviewPeriodRepository.class); feedbackRequestServices = new FeedbackRequestServicesImpl(feedbackReqRepository, currentUserServices, - memberProfileServices, reviewPeriodRepository, emailSender, "DNC", checkInsConfiguration); + memberProfileServices, reviewPeriodRepository, emailSender, checkInsConfiguration); } @Test diff --git a/server/src/test/resources/application-test.yml b/server/src/test/resources/application-test.yml index c711942eb5..5ffff78794 100644 --- a/server/src/test/resources/application-test.yml +++ b/server/src/test/resources/application-test.yml @@ -38,6 +38,9 @@ flyway: --- check-ins: web-address: "https://checkins.objectcomputing.com" + application: + google-api: + delegated-user: test@objectcomputing.com --- aes: key: BOGUS_TEST_KEY