@Test public void shouldFindSubscribedRecipientForGivenResource() { String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user1", false), new Subscriber("user3", false), new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", "uuid_56")) .thenReturn(newHashSet(new Subscriber("user2", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user4", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user1", "user3"), projectUuid, "user")) .thenReturn(newHashSet("user1", "user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, SubscriberPermissionsOnProject.ALL_MUST_HAVE_ROLE_USER); assertThat(multiMap.entries()).hasSize(3); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user1")).containsOnly(emailChannel); assertThat(map.get("user2")).isNull(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); assertThat(map.get("user4")).isNull(); // code is optimized to perform only 1 SQL requests for all channels verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), anyString()); }
private Set<String> keepAuthorizedLogins(DbSession dbSession, String projectKey, Set<SubscriberAndChannel> subscriberAndChannels, @Nullable Boolean global, String permission) { Set<String> logins = subscriberAndChannels.stream() .filter(s -> global == null || s.getSubscriber().isGlobal() == global) .map(s -> s.getSubscriber().getLogin()) .collect(Collectors.toSet()); if (logins.isEmpty()) { return Collections.emptySet(); } return dbClient.authorizationDao().keepAuthorizedLoginsOnProject(dbSession, logins, projectKey, permission); }
/** * {@inheritDoc} */ @Override public Multimap<String, NotificationChannel> findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, String projectKey, SubscriberPermissionsOnProject subscriberPermissionsOnProject) { requireNonNull(projectKey, "projectKey is mandatory"); String dispatcherKey = dispatcher.getKey(); Set<SubscriberAndChannel> subscriberAndChannels = Arrays.stream(notificationChannels) .flatMap(notificationChannel -> toSubscriberAndChannels(dispatcherKey, projectKey, notificationChannel)) .collect(Collectors.toSet()); if (subscriberAndChannels.isEmpty()) { return ImmutableMultimap.of(); } ImmutableSetMultimap.Builder<String, NotificationChannel> builder = ImmutableSetMultimap.builder(); try (DbSession dbSession = dbClient.openSession(false)) { Set<String> authorizedLogins = keepAuthorizedLogins(dbSession, projectKey, subscriberAndChannels, subscriberPermissionsOnProject); subscriberAndChannels.stream() .filter(subscriberAndChannel -> authorizedLogins.contains(subscriberAndChannel.getSubscriber().getLogin())) .forEach(subscriberAndChannel -> builder.put(subscriberAndChannel.getSubscriber().getLogin(), subscriberAndChannel.getChannel())); } return builder.build(); }
/** * {@inheritDoc} */ @Override public Multimap<String, NotificationChannel> findSubscribedRecipientsForDispatcher(NotificationDispatcher dispatcher, String projectKey, SubscriberPermissionsOnProject subscriberPermissionsOnProject) { requireNonNull(projectKey, "projectKey is mandatory"); String dispatcherKey = dispatcher.getKey(); Set<SubscriberAndChannel> subscriberAndChannels = Arrays.stream(notificationChannels) .flatMap(notificationChannel -> toSubscriberAndChannels(dispatcherKey, projectKey, notificationChannel)) .collect(Collectors.toSet()); if (subscriberAndChannels.isEmpty()) { return ImmutableMultimap.of(); } ImmutableSetMultimap.Builder<String, NotificationChannel> builder = ImmutableSetMultimap.builder(); try (DbSession dbSession = dbClient.openSession(false)) { Set<String> authorizedLogins = keepAuthorizedLogins(dbSession, projectKey, subscriberAndChannels, subscriberPermissionsOnProject); subscriberAndChannels.stream() .filter(subscriberAndChannel -> authorizedLogins.contains(subscriberAndChannel.getSubscriber().getLogin())) .forEach(subscriberAndChannel -> builder.put(subscriberAndChannel.getSubscriber().getLogin(), subscriberAndChannel.getChannel())); } return builder.build(); }
private Set<String> keepAuthorizedLogins(DbSession dbSession, String projectKey, Set<SubscriberAndChannel> subscriberAndChannels, @Nullable Boolean global, String permission) { Set<String> logins = subscriberAndChannels.stream() .filter(s -> global == null || s.getSubscriber().isGlobal() == global) .map(s -> s.getSubscriber().getLogin()) .collect(Collectors.toSet()); if (logins.isEmpty()) { return Collections.emptySet(); } return dbClient.authorizationDao().keepAuthorizedLoginsOnProject(dbSession, logins, projectKey, permission); }
@Test public void do_not_call_db_for_project_permission_filtering_if_there_is_no_project_subscriber() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3"), projectUuid, globalPermission)) .thenReturn(newHashSet("user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(2); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(0)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); }
@Test public void should_apply_distinct_permission_filtering_global_or_project_subscribers() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user1", false), new Subscriber("user3", false), new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", "uuid_56")) .thenReturn(newHashSet(new Subscriber("user2", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user4", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3", "user4"), projectUuid, globalPermission)) .thenReturn(newHashSet("user3")); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user1", "user3"), projectUuid, projectPermission)) .thenReturn(newHashSet("user1", "user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(3); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user1")).containsOnly(emailChannel); assertThat(map.get("user2")).isNull(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); assertThat(map.get("user4")).isNull(); // code is optimized to perform only 2 SQL requests for all channels verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); }
@Test public void do_not_call_db_for_project_permission_filtering_if_there_is_no_global_subscriber() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3"), projectUuid, projectPermission)) .thenReturn(newHashSet("user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(2); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); verify(authorizationDao, times(0)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); } }
.containsOnly(new Subscriber("user2", false)); .containsOnly(new Subscriber("user3", true)); .containsOnly(new Subscriber("user3", true)); .containsOnly(new Subscriber("user2", false), new Subscriber("user3", true)); .containsOnly(new Subscriber("user1", false), new Subscriber("user3", true), new Subscriber("user3", false));