From b267f2f30cfd74269769539f7bedeb79610bca98 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Fri, 26 Apr 2024 18:10:10 +0300 Subject: [PATCH] UserNotificationPreference changes --- ...040_add_ntf_UserNotificationPreference.sql | 5 +- .../user-notification-preference.model.ts | 5 +- .../user-notification-preference.lookup.ts | 4 + .../services/core-service.module.ts | 2 + .../UserNotificationPreferenceController.java | 27 ++++-- .../UserNotificationPreferenceEntity.java | 16 +++- ...CompositeUserNotificationPreferenceId.java | 45 ---------- .../model/UserNotificationPreference.java | 12 +++ .../UserNotificationPreferenceBuilder.java | 1 + .../UserNotificationPreferenceQuery.java | 90 +++++++++++++++++-- .../UserNotificationPreferenceLookup.java | 4 + .../ChannelResolutionServiceImpl.java | 10 ++- .../notification/NotificationServiceImpl.java | 29 +++--- .../UserNotificationPreferenceService.java | 5 +- ...UserNotificationPreferenceServiceImpl.java | 47 +++++----- 15 files changed, 203 insertions(+), 99 deletions(-) delete mode 100644 notification-service/notification/src/main/java/gr/cite/notification/data/composite/CompositeUserNotificationPreferenceId.java diff --git a/dmp-db-scema/updates/00.01.040_add_ntf_UserNotificationPreference.sql b/dmp-db-scema/updates/00.01.040_add_ntf_UserNotificationPreference.sql index f059c6181..a8c4a27b5 100644 --- a/dmp-db-scema/updates/00.01.040_add_ntf_UserNotificationPreference.sql +++ b/dmp-db-scema/updates/00.01.040_add_ntf_UserNotificationPreference.sql @@ -6,15 +6,16 @@ BEGIN CREATE TABLE public."ntf_UserNotificationPreference" ( + id uuid NOT NULL, "user" uuid NOT NULL, "type" uuid NOT NULL, "channel" smallint NOT NULL, "ordinal" numeric NOT NULL, - "tenant" uuid, + "tenant" uuid NULL, "created_at" timestamp without time zone NOT NULL, "updated_at" timestamp without time zone NOT NULL, "is_active" smallint NOT NULL DEFAULT 1, - CONSTRAINT "ntf_UserNotificationPreference_pkey" PRIMARY KEY ("user", "type", "channel"), + CONSTRAINT "ntf_UserNotificationPreference_pkey" PRIMARY KEY (id), CONSTRAINT "ntf_UserNotificationPreference_tenant_fkey" FOREIGN KEY ("tenant") REFERENCES public."ntf_Tenant" (id) MATCH SIMPLE ON UPDATE NO ACTION diff --git a/dmp-frontend/src/notification-service/core/model/user-notification-preference.model.ts b/dmp-frontend/src/notification-service/core/model/user-notification-preference.model.ts index 759b1f5c9..a2b039205 100644 --- a/dmp-frontend/src/notification-service/core/model/user-notification-preference.model.ts +++ b/dmp-frontend/src/notification-service/core/model/user-notification-preference.model.ts @@ -1,8 +1,9 @@ import { Guid } from '@common/types/guid'; import { NotificationType } from '@notification-service/core/enum/notification-type.enum'; import { NotificationContactType } from '../enum/notification-contact-type'; +import { BaseEntity, BaseEntityPersist } from '@common/base/base-entity.model'; -export interface UserNotificationPreference { +export interface UserNotificationPreference extends BaseEntity { userId?: Guid; type: NotificationType; channel: NotificationContactType; @@ -10,7 +11,7 @@ export interface UserNotificationPreference { createdAt?: Date; } -export interface UserNotificationPreferencePersist { +export interface UserNotificationPreferencePersist extends BaseEntityPersist { userId?: Guid; notificationPreferences: { [key: string]: NotificationContactType[] }; } diff --git a/dmp-frontend/src/notification-service/core/query/user-notification-preference.lookup.ts b/dmp-frontend/src/notification-service/core/query/user-notification-preference.lookup.ts index f1f57be1e..e93a8c107 100644 --- a/dmp-frontend/src/notification-service/core/query/user-notification-preference.lookup.ts +++ b/dmp-frontend/src/notification-service/core/query/user-notification-preference.lookup.ts @@ -4,6 +4,8 @@ import { NotificationType } from '@notification-service/core/enum/notification-t import { NotificationContactType } from '../enum/notification-contact-type'; export class UserNotificationPreferenceLookup extends Lookup implements UserNotificationPreferenceFilter { + ids: Guid[]; + excludedIds: Guid[]; userIds?: Guid[]; type?: NotificationType[]; channel?: NotificationContactType[]; @@ -14,6 +16,8 @@ export class UserNotificationPreferenceLookup extends Lookup implements UserNoti } export interface UserNotificationPreferenceFilter { + ids: Guid[]; + excludedIds: Guid[]; userIds?: Guid[]; type?: NotificationType[]; channel?: NotificationContactType[]; diff --git a/dmp-frontend/src/notification-service/services/core-service.module.ts b/dmp-frontend/src/notification-service/services/core-service.module.ts index b79792d08..3a615919f 100644 --- a/dmp-frontend/src/notification-service/services/core-service.module.ts +++ b/dmp-frontend/src/notification-service/services/core-service.module.ts @@ -10,6 +10,7 @@ import { NotificationServiceEnumUtils } from '@notification-service/core/formatt import { InAppNotificationService } from './http/inapp-notification.service'; import { NotificationService } from './http/notification-service'; import { NotificationTemplateService } from './http/notification-template.service'; +import { TenantConfigurationService } from './http/tenant-configuration.service'; // // @@ -38,6 +39,7 @@ export class CoreNotificationServiceModule { NotificationService, InAppNotificationService, NotificationTemplateService, + TenantConfigurationService, UserNotificationPreferenceService ], }; diff --git a/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/UserNotificationPreferenceController.java b/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/UserNotificationPreferenceController.java index 249923248..fb1cece22 100644 --- a/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/UserNotificationPreferenceController.java +++ b/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/UserNotificationPreferenceController.java @@ -4,8 +4,11 @@ import gr.cite.notification.audit.AuditableAction; import gr.cite.notification.authorization.AuthorizationFlags; import gr.cite.notification.common.enums.IsActive; import gr.cite.notification.common.enums.TenantConfigurationType; +import gr.cite.notification.common.scope.tenant.TenantScope; import gr.cite.notification.common.types.tenantconfiguration.NotifierListTenantConfigurationEntity; +import gr.cite.notification.data.TenantEntity; import gr.cite.notification.data.UserNotificationPreferenceEntity; +import gr.cite.notification.event.TenantConfigurationTouchedEvent; import gr.cite.notification.model.UserNotificationPreference; import gr.cite.notification.model.builder.UserNotificationPreferenceBuilder; import gr.cite.notification.model.censorship.UserNotificationPreferenceCensor; @@ -30,9 +33,12 @@ import gr.cite.tools.validation.ValidationFilterAnnotation; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.web.bind.annotation.*; import jakarta.transaction.Transactional; + +import javax.management.InvalidApplicationException; import java.util.*; @RestController @@ -46,20 +52,22 @@ public class UserNotificationPreferenceController { private final CensorFactory censorFactory; private final QueryFactory queryFactory; private final MessageSource messageSource; + private final TenantScope tenantScope; @Autowired public UserNotificationPreferenceController(BuilderFactory builderFactory, - AuditService auditService, - UserNotificationPreferenceService userNotificationPreferenceService, - CensorFactory censorFactory, - QueryFactory queryFactory, - MessageSource messageSource) { + AuditService auditService, + UserNotificationPreferenceService userNotificationPreferenceService, + CensorFactory censorFactory, + QueryFactory queryFactory, + MessageSource messageSource, TenantScope tenantScope) { this.builderFactory = builderFactory; this.auditService = auditService; this.userNotificationPreferenceService = userNotificationPreferenceService; this.censorFactory = censorFactory; this.queryFactory = queryFactory; this.messageSource = messageSource; + this.tenantScope = tenantScope; } @PostMapping("query") @@ -80,7 +88,7 @@ public class UserNotificationPreferenceController { @GetMapping("user/{userId}/current") @Transactional - public List current(@PathVariable UUID userId, FieldSet fieldSet, Locale locale) throws MyApplicationException, MyForbiddenException, MyNotFoundException { + public List current(@PathVariable UUID userId, FieldSet fieldSet, Locale locale) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException { logger.debug(new MapLogEntry("retrieving" + UserNotificationPreference.class.getSimpleName()).And("userId", userId).And("fields", fieldSet)); this.censorFactory.censor(UserNotificationPreferenceCensor.class).censor(fieldSet, userId); @@ -89,6 +97,13 @@ public class UserNotificationPreferenceController { ordering.addAscending(UserNotificationPreference._ordinal); UserNotificationPreferenceQuery query = this.queryFactory.query(UserNotificationPreferenceQuery.class).userId(userId).isActives(IsActive.Active); query.setOrder(ordering); + if (this.tenantScope.isMultitenant() && this.tenantScope.isSet()) { + if (!this.tenantScope.isDefaultTenant()) { + query.tenantIsSet(true).tenantIds(this.tenantScope.getTenant()); + } else { + query.tenantIsSet(false); + } + } List model = this.builderFactory.builder(UserNotificationPreferenceBuilder.class).authorize(AuthorizationFlags.OwnerOrPermission).build(fieldSet, query.collectAs(fieldSet)); this.auditService.track(AuditableAction.User_Notification_Preference_Lookup, Map.ofEntries( diff --git a/notification-service/notification/src/main/java/gr/cite/notification/data/UserNotificationPreferenceEntity.java b/notification-service/notification/src/main/java/gr/cite/notification/data/UserNotificationPreferenceEntity.java index 1eea893cc..36c64ed5b 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/data/UserNotificationPreferenceEntity.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/data/UserNotificationPreferenceEntity.java @@ -2,7 +2,6 @@ package gr.cite.notification.data; import gr.cite.notification.common.enums.IsActive; import gr.cite.notification.common.enums.NotificationContactType; -import gr.cite.notification.data.composite.CompositeUserNotificationPreferenceId; import gr.cite.notification.data.conventers.IsActiveConverter; import gr.cite.notification.data.conventers.NotificationContactTypeConverter; import gr.cite.notification.data.tenant.TenantScopedBaseEntity; @@ -13,22 +12,23 @@ import java.util.UUID; @Entity @Table(name = "\"UserNotificationPreference\"") -@IdClass(CompositeUserNotificationPreferenceId.class) public class UserNotificationPreferenceEntity extends TenantScopedBaseEntity { @Id + @Column(name = "id", columnDefinition = "uuid", updatable = false, nullable = false) + private UUID id; + public static final String _id = "id"; + @Column(name = "user", columnDefinition = "uuid", nullable = false) private UUID userId; public static final String _userId = "userId"; - @Id @Column(name = "type", columnDefinition = "uuid", nullable = false) private UUID type; public static final String _type = "type"; - @Id @Column(name = "channel", nullable = false) @Convert(converter = NotificationContactTypeConverter.class) private NotificationContactType channel; @@ -56,6 +56,14 @@ public class UserNotificationPreferenceEntity extends TenantScopedBaseEntity { public static final String _isActive = "isActive"; + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + public UUID getUserId() { return userId; } diff --git a/notification-service/notification/src/main/java/gr/cite/notification/data/composite/CompositeUserNotificationPreferenceId.java b/notification-service/notification/src/main/java/gr/cite/notification/data/composite/CompositeUserNotificationPreferenceId.java deleted file mode 100644 index 4f132e979..000000000 --- a/notification-service/notification/src/main/java/gr/cite/notification/data/composite/CompositeUserNotificationPreferenceId.java +++ /dev/null @@ -1,45 +0,0 @@ -package gr.cite.notification.data.composite; - -import gr.cite.notification.common.enums.NotificationContactType; - -import java.io.Serializable; -import java.util.UUID; - -public class CompositeUserNotificationPreferenceId implements Serializable { - private UUID userId; - private UUID type; - private NotificationContactType channel; - - public CompositeUserNotificationPreferenceId() { - } - - public CompositeUserNotificationPreferenceId(UUID userId, UUID type, NotificationContactType channel) { - this.userId = userId; - this.type = type; - this.channel = channel; - } - - public UUID getUserId() { - return userId; - } - - public void setUserId(UUID userId) { - this.userId = userId; - } - - public UUID getType() { - return type; - } - - public void setType(UUID type) { - this.type = type; - } - - public NotificationContactType getChannel() { - return channel; - } - - public void setChannel(NotificationContactType channel) { - this.channel = channel; - } -} diff --git a/notification-service/notification/src/main/java/gr/cite/notification/model/UserNotificationPreference.java b/notification-service/notification/src/main/java/gr/cite/notification/model/UserNotificationPreference.java index 6cec86fac..173016837 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/model/UserNotificationPreference.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/model/UserNotificationPreference.java @@ -8,6 +8,10 @@ import java.util.UUID; public class UserNotificationPreference { + private UUID id; + + public static final String _id = "id"; + private UUID userId; public static final String _userId = "userId"; @@ -40,6 +44,14 @@ public class UserNotificationPreference { public static final String _isActive = "isActive"; + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + public UUID getUserId() { return userId; } diff --git a/notification-service/notification/src/main/java/gr/cite/notification/model/builder/UserNotificationPreferenceBuilder.java b/notification-service/notification/src/main/java/gr/cite/notification/model/builder/UserNotificationPreferenceBuilder.java index b66a9a863..10a3fc3b5 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/model/builder/UserNotificationPreferenceBuilder.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/model/builder/UserNotificationPreferenceBuilder.java @@ -42,6 +42,7 @@ public class UserNotificationPreferenceBuilder extends BaseBuilder models = new ArrayList<>(); for(UserNotificationPreferenceEntity d : data){ UserNotificationPreference m = new UserNotificationPreference(); + if(fields.hasField(this.asIndexer(UserNotificationPreference._id))) m.setId(d.getId()); if(fields.hasField(this.asIndexer(UserNotificationPreference._userId))) m.setUserId(d.getUserId()); if(fields.hasField(this.asIndexer(UserNotificationPreference._tenantId))) m.setTenantId(d.getTenantId()); if(fields.hasField(this.asIndexer(UserNotificationPreference._type))) m.setType(d.getType()); diff --git a/notification-service/notification/src/main/java/gr/cite/notification/query/UserNotificationPreferenceQuery.java b/notification-service/notification/src/main/java/gr/cite/notification/query/UserNotificationPreferenceQuery.java index addbcfc7b..89b29cca5 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/query/UserNotificationPreferenceQuery.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/query/UserNotificationPreferenceQuery.java @@ -2,6 +2,8 @@ package gr.cite.notification.query; import gr.cite.notification.common.enums.IsActive; import gr.cite.notification.common.enums.NotificationContactType; +import gr.cite.notification.data.TenantConfigurationEntity; +import gr.cite.notification.data.UserCredentialEntity; import gr.cite.notification.data.UserNotificationPreferenceEntity; import gr.cite.notification.model.UserNotificationPreference; import gr.cite.tools.data.query.FieldResolver; @@ -15,15 +17,16 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UserNotificationPreferenceQuery extends QueryBase { + private Collection ids; + + private Collection excludedIds; + private List userId; private List isActives; @@ -32,6 +35,58 @@ public class UserNotificationPreferenceQuery extends QueryBase channel; + private Collection tenantIds; + private Boolean tenantIsSet; + public UserNotificationPreferenceQuery ids(UUID value) { + this.ids = List.of(value); + return this; + } + + public UserNotificationPreferenceQuery ids(UUID... value) { + this.ids = Arrays.asList(value); + return this; + } + + public UserNotificationPreferenceQuery ids(Collection values) { + this.ids = values; + return this; + } + + public UserNotificationPreferenceQuery tenantIds(UUID value) { + this.tenantIds = List.of(value); + return this; + } + + public UserNotificationPreferenceQuery tenantIds(UUID... value) { + this.tenantIds = Arrays.asList(value); + return this; + } + + public UserNotificationPreferenceQuery tenantIds(Collection values) { + this.tenantIds = values; + return this; + } + + public UserNotificationPreferenceQuery tenantIsSet(Boolean values) { + this.tenantIsSet = values; + return this; + } + + public UserNotificationPreferenceQuery excludedIds(Collection values) { + this.excludedIds = values; + return this; + } + + public UserNotificationPreferenceQuery excludedIds(UUID value) { + this.excludedIds = List.of(value); + return this; + } + + public UserNotificationPreferenceQuery excludedIds(UUID... value) { + this.excludedIds = Arrays.asList(value); + return this; + } + public UserNotificationPreferenceQuery userId(UUID... userId) { this.userId = List.of(userId); return this; @@ -74,7 +129,7 @@ public class UserNotificationPreferenceQuery extends QueryBase Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); + if (this.ids != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserNotificationPreferenceEntity._id)); + for (UUID item : this.ids) + inClause.value(item); + predicates.add(inClause); + } + if (this.excludedIds != null) { + CriteriaBuilder.In notInClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserNotificationPreferenceEntity._id)); + for (UUID item : this.excludedIds) + notInClause.value(item); + predicates.add(notInClause.not()); + } + if (this.tenantIds != null) { + CriteriaBuilder.In inClause = queryContext.CriteriaBuilder.in(queryContext.Root.get(UserNotificationPreferenceEntity._tenantId)); + for (UUID item : this.tenantIds) inClause.value(item); + predicates.add(inClause); + } + if (this.tenantIsSet != null) { + if (this.tenantIsSet) predicates.add(queryContext.CriteriaBuilder.isNotNull(queryContext.Root.get(UserNotificationPreferenceEntity._tenantId))); + else predicates.add(queryContext.CriteriaBuilder.isNull(queryContext.Root.get(UserNotificationPreferenceEntity._tenantId))); + } + if (this.userId != null) { predicates.add(queryContext.Root.get(UserNotificationPreferenceEntity._userId).in(this.userId)); } @@ -119,6 +196,8 @@ public class UserNotificationPreferenceQuery extends QueryBase columns) { UserNotificationPreferenceEntity item = new UserNotificationPreferenceEntity(); + item.setId(QueryBase.convertSafe(tuple, columns, UserNotificationPreferenceEntity._id, UUID.class)); item.setUserId(QueryBase.convertSafe(tuple, columns, UserNotificationPreferenceEntity._userId, UUID.class)); item.setChannel(QueryBase.convertSafe(tuple, columns, UserNotificationPreferenceEntity._channel, NotificationContactType.class)); item.setType(QueryBase.convertSafe(tuple, columns, UserNotificationPreferenceEntity._type, UUID.class)); diff --git a/notification-service/notification/src/main/java/gr/cite/notification/query/lookup/UserNotificationPreferenceLookup.java b/notification-service/notification/src/main/java/gr/cite/notification/query/lookup/UserNotificationPreferenceLookup.java index c98ae5161..d1567704b 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/query/lookup/UserNotificationPreferenceLookup.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/query/lookup/UserNotificationPreferenceLookup.java @@ -12,6 +12,8 @@ import java.util.List; import java.util.UUID; public class UserNotificationPreferenceLookup extends Lookup { + private List ids; + private List excludedIds; private List userId; private List type; private List channel; @@ -45,6 +47,8 @@ public class UserNotificationPreferenceLookup extends Lookup { if (this.userId != null) query.userId(this.userId); if (this.channel != null) query.channel(this.channel); if (this.type != null) query.type(this.type); + if (this.ids != null) query.ids(this.ids); + if (this.excludedIds != null) query.excludedIds(this.excludedIds); this.enrichCommon(query); diff --git a/notification-service/notification/src/main/java/gr/cite/notification/service/channelResolution/ChannelResolutionServiceImpl.java b/notification-service/notification/src/main/java/gr/cite/notification/service/channelResolution/ChannelResolutionServiceImpl.java index 22593c7f3..a01b259d0 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/service/channelResolution/ChannelResolutionServiceImpl.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/service/channelResolution/ChannelResolutionServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import org.springframework.web.context.annotation.RequestScope; +import javax.management.InvalidApplicationException; import java.util.*; import java.util.stream.Collectors; @@ -104,8 +105,13 @@ public class ChannelResolutionServiceImpl implements ChannelResolutionService{ private Map> lookupOrCollectUserPolicies(List users, UUID type) { Map> contactsByUser = new HashMap<>(); - Map> userNotificationPreferences = this.userNotificationPreferenceService.collectUserNotificationPreferences(users); - for (Map.Entry> notificationPreference: userNotificationPreferences.entrySet()) + Map> userNotificationPreferences = null; + try { + userNotificationPreferences = this.userNotificationPreferenceService.collectUserNotificationPreferences(users); + } catch (InvalidApplicationException e) { + throw new RuntimeException(e); + } + for (Map.Entry> notificationPreference: userNotificationPreferences.entrySet()) { contactsByUser.put(notificationPreference.getKey(), notificationPreference.getValue().stream().filter(x -> x.getType() != null && x.getType() == type && x.getChannel() != null).sorted(Comparator.comparingInt(x -> x.getOrdinal())).map(x -> x.getChannel()).collect(Collectors.toList())); } diff --git a/notification-service/notification/src/main/java/gr/cite/notification/service/notification/NotificationServiceImpl.java b/notification-service/notification/src/main/java/gr/cite/notification/service/notification/NotificationServiceImpl.java index 56503a197..141e1b689 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/service/notification/NotificationServiceImpl.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/service/notification/NotificationServiceImpl.java @@ -73,17 +73,18 @@ public class NotificationServiceImpl implements NotificationService { private final NotifierFactory notifierFactory; private final ApplicationContext applicationContext; private final QueryFactory queryFactory; + private final TenantScope tenantScope; @Autowired public NotificationServiceImpl( - TenantEntityManager entityManager, - AuthorizationService authService, - DeleterFactory deleterFactory, - BuilderFactory builderFactory, - ConventionService conventionService, - ErrorThesaurusProperties errors, - MessageSource messageSource, - ChannelResolutionService channelResolutionService, MessageBuilderFactory messageBuilderFactory, ContactExtractorFactory contactExtractorFactory, NotifierFactory notifierFactory, ApplicationContext applicationContext, QueryFactory queryFactory) { + TenantEntityManager entityManager, + AuthorizationService authService, + DeleterFactory deleterFactory, + BuilderFactory builderFactory, + ConventionService conventionService, + ErrorThesaurusProperties errors, + MessageSource messageSource, + ChannelResolutionService channelResolutionService, MessageBuilderFactory messageBuilderFactory, ContactExtractorFactory contactExtractorFactory, NotifierFactory notifierFactory, ApplicationContext applicationContext, QueryFactory queryFactory, TenantScope tenantScope) { this.entityManager = entityManager; this.authService = authService; this.deleterFactory = deleterFactory; @@ -97,6 +98,7 @@ public class NotificationServiceImpl implements NotificationService { this.notifierFactory = notifierFactory; this.applicationContext = applicationContext; this.queryFactory = queryFactory; + this.tenantScope = tenantScope; } @Override @@ -146,6 +148,7 @@ public class NotificationServiceImpl implements NotificationService { public SendNotificationResult doNotify(NotificationEntity notification) { List contactTypes = this.orderContactTypesFromPreferences(notification); if (this.conventionService.isListNullOrEmpty(contactTypes)) contactTypes = this.orderContactTypes(notification); + if (contactTypes == null) return null; for (NotificationContactType contactType: contactTypes) { SendNotificationResult result = this.sendNotification(notification, contactType); @@ -160,8 +163,14 @@ public class NotificationServiceImpl implements NotificationService { UserNotificationPreferenceQuery query = this.queryFactory.query(UserNotificationPreferenceQuery.class).userId(notification.getUserId()).type(notification.getType()).isActives(IsActive.Active); query.setOrder(ordering); - List preferences = query.collectAs(new BaseFieldSet().ensure(UserNotificationPreference._channel)); - if (!this.conventionService.isListNullOrEmpty(preferences)) return preferences.stream().map(x -> x.getChannel()).collect(Collectors.toList()); + List preferences = query.collectAs(new BaseFieldSet().ensure(UserNotificationPreference._channel).ensure(UserNotificationPreference._tenantId).ensure(UserNotificationPreference._id)); + if (!this.conventionService.isListNullOrEmpty(preferences)) return preferences.stream().filter(x -> { + try { + return !this.tenantScope.isMultitenant() || this.tenantScope.isDefaultTenant() ? x.getTenantId() == null : x.getTenantId() == this.tenantScope.getTenant(); + } catch (InvalidApplicationException e) { + throw new RuntimeException(e); + } + }).map(UserNotificationPreferenceEntity::getChannel).collect(Collectors.toList()); return null; } diff --git a/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceService.java b/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceService.java index 0c0c4969f..c76f00716 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceService.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceService.java @@ -5,6 +5,7 @@ import gr.cite.notification.model.UserNotificationPreference; import gr.cite.notification.model.persist.UserNotificationPreferencePersist; import gr.cite.tools.fieldset.FieldSet; +import javax.management.InvalidApplicationException; import java.util.List; import java.util.Map; import java.util.Set; @@ -14,6 +15,6 @@ public interface UserNotificationPreferenceService { List persist(UserNotificationPreferencePersist model, FieldSet fieldSet); NotifierListTenantConfigurationEntity collectUserAvailableNotifierList(Set notificationTypes); - List collectUserNotificationPreferences(UUID id); - Map> collectUserNotificationPreferences(List ids); + List collectUserNotificationPreferences(UUID id) throws InvalidApplicationException; + Map> collectUserNotificationPreferences(List ids) throws InvalidApplicationException; } diff --git a/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceServiceImpl.java b/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceServiceImpl.java index 1fc9e67d1..b6418da0c 100644 --- a/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceServiceImpl.java +++ b/notification-service/notification/src/main/java/gr/cite/notification/service/userNotificationPreference/UserNotificationPreferenceServiceImpl.java @@ -117,7 +117,7 @@ public class UserNotificationPreferenceServiceImpl implements UserNotificationPr } @Override - public List collectUserNotificationPreferences(UUID id) { + public List collectUserNotificationPreferences(UUID id) throws InvalidApplicationException { Map> result = this.collectUserNotificationPreferences(List.of(id)); if (result != null) { return result.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); @@ -127,18 +127,20 @@ public class UserNotificationPreferenceServiceImpl implements UserNotificationPr } @Override - public Map> collectUserNotificationPreferences(List ids) { + public Map> collectUserNotificationPreferences(List ids) throws InvalidApplicationException { + UserNotificationPreferenceQuery query = this.queryFactory + .query(UserNotificationPreferenceQuery.class) + .userId(ids); + if (this.tenantScope.isMultitenant() && this.tenantScope.isSet()) { + if (!this.tenantScope.isDefaultTenant()) { + query.tenantIsSet(true).tenantIds(this.tenantScope.getTenant()); + } else { + query.tenantIsSet(false); + } + } return this.builderFactory.builder(UserNotificationPreferenceBuilder.class) .build(new BaseFieldSet(UserNotificationPreference._userId, UserNotificationPreference._type, - UserNotificationPreference._channel, UserNotificationPreference._ordinal), this.queryFactory - .query(UserNotificationPreferenceQuery.class) - .userId(ids).collect()).stream().filter(x -> { - try { - return !this.tenantScope.isMultitenant() || this.tenantScope.isDefaultTenant() ? x.getTenantId() == null : x.getTenantId() == this.tenantScope.getTenant(); - } catch (InvalidApplicationException e) { - throw new RuntimeException(e); - } - }) + UserNotificationPreference._channel, UserNotificationPreference._ordinal, UserNotificationPreference._tenantId, UserNotificationPreference._id), query.collect()).stream() .collect(Collectors.groupingBy(UserNotificationPreference::getUserId)); //GK: Yep that exist on JAVA Streams } @@ -178,22 +180,24 @@ public class UserNotificationPreferenceServiceImpl implements UserNotificationPr { List preferences = null; try { - preferences = this.queryFactory + UserNotificationPreferenceQuery query = this.queryFactory .query(UserNotificationPreferenceQuery.class) .type(type) .isActives(IsActive.Active) - .userId(userId).collect(); + .userId(userId); + if (this.tenantScope.isMultitenant() && this.tenantScope.isSet()) { + if (!this.tenantScope.isDefaultTenant()) { + query.tenantIsSet(true).tenantIds(this.tenantScope.getTenant()); + } else { + query.tenantIsSet(false); + } + } + preferences = query.collect(); int ordinal = 0; List updatedPreferences = new ArrayList<>(); for (NotificationContactType contactType : contactTypes) { - UserNotificationPreferenceEntity preference = preferences.stream().filter(x -> { - try { - return x.getChannel() == contactType && (!this.tenantScope.isMultitenant() ||this.tenantScope.isDefaultTenant() ? x.getTenantId() == null : x.getTenantId() == this.tenantScope.getTenant()); - } catch (InvalidApplicationException e) { - throw new RuntimeException(e); - } - }).findFirst().orElse(null); + UserNotificationPreferenceEntity preference = preferences.stream().filter(x -> x.getChannel() == contactType).findFirst().orElse(null); boolean isUpdate = preference != null; if (preference != null) { @@ -201,6 +205,7 @@ public class UserNotificationPreferenceServiceImpl implements UserNotificationPr } else { preference = new UserNotificationPreferenceEntity(); + preference.setId(UUID.randomUUID()); preference.setUserId(userId); preference.setType(type); preference.setOrdinal(ordinal); @@ -215,7 +220,7 @@ public class UserNotificationPreferenceServiceImpl implements UserNotificationPr updatedPreferences.add(preference); ordinal++; } - List toDelete = preferences.stream().filter(x -> !updatedPreferences.stream().map(y-> y.getChannel()).collect(Collectors.toList()).contains(x.getChannel())).collect(Collectors.toList()); + List toDelete = preferences.stream().filter(x -> !updatedPreferences.stream().map(UserNotificationPreferenceEntity::getChannel).toList().contains(x.getChannel())).toList(); for (UserNotificationPreferenceEntity deletable: toDelete) { this.entityManager.remove(deletable); }