diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java index 775a37ae4..62a3fe4d9 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java @@ -70,7 +70,7 @@ public class NotificationIntegrationEventHandlerImpl implements NotificationInte persist.setContactTypeHint(event.getContactTypeHint()); persist.setData(event.getData()); persist.setNotifyState(NotificationNotifyState.PENDING); - persist.setNotifiedWith(NotificationContactType.EMAIL); + persist.setNotifiedWith(event.getContactTypeHint()); persist.setRetryCount(0); persist.setTrackingState(NotificationTrackingState.UNDEFINED); persist.setTrackingProcess(NotificationTrackingProcess.PENDING); diff --git a/dmp-backend/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/InAppNotificationController.java b/dmp-backend/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/InAppNotificationController.java index 95aab412c..9381ee048 100644 --- a/dmp-backend/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/InAppNotificationController.java +++ b/dmp-backend/notification-service/notification-web/src/main/java/gr/cite/notification/web/controllers/InAppNotificationController.java @@ -39,7 +39,7 @@ import javax.transaction.Transactional; import java.util.*; @RestController -@RequestMapping(path = "api/notification/inapp-notification") +@RequestMapping(path = "api/inapp-notification") public class InAppNotificationController { private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(InAppNotificationController.class)); diff --git a/dmp-backend/notification-service/notification-web/src/main/resources/config/notification.yml b/dmp-backend/notification-service/notification-web/src/main/resources/config/notification.yml index 5c5e91151..7ad90ce91 100644 --- a/dmp-backend/notification-service/notification-web/src/main/resources/config/notification.yml +++ b/dmp-backend/notification-service/notification-web/src/main/resources/config/notification.yml @@ -16,7 +16,7 @@ notification: contacts: [ email ] - #dmpInvitationExistingUser type: 4904dea2-5079-46d3-83be-3a19c9ab45dc - contacts: [ email ] + contacts: [ inapp, email ] - #dpmModified type: 4542262A-22F8-4BAA-9DB6-1C8E70AC1DBB contacts: [ email ] @@ -314,6 +314,30 @@ notification: template-cache: prefix: ${CACHE_DISAMBIGUATION:} key-pattern: "{prefix}:Notification_Message_Email_Template:{key}:v0" + in-app: + flows: + - #dmpInvitationExistingUser + key: 4904dea2-5079-46d3-83be-3a19c9ab45dc + subject-path: classpath:notification_templates/dmpinvitationexistinguser/inapp/subject.{language}.txt + subject-field-options: + mandatory: [ ] + optional: [ ] + body-path: classpath:notification_templates/dmpinvitationexistinguser/inapp/body.{language}.html + body-field-options: + mandatory: [ "{dmpname}", "{dmprole}", "{reasonName}", "{installation-url}", "{id}" ] + optional: + - key: "{recipient}" + value: + formatting: + '[{dmpname}]': null + '[{dmprole}]': null + '[{reasonName}]': null + '[{recipient}]': null + priority-key: null + cipher-fields: [ ] + template-cache: + prefix: ${CACHE_DISAMBIGUATION:} + key-pattern: "{prefix}:Notification_Message_InApp_Template:{key}:v0" override-cache: template-cache: prefix: ${CACHE_DISAMBIGUATION:} diff --git a/dmp-backend/notification-service/notification-web/src/main/resources/config/permissions.yml b/dmp-backend/notification-service/notification-web/src/main/resources/config/permissions.yml index 1bc742f5f..c7b20e4ca 100644 --- a/dmp-backend/notification-service/notification-web/src/main/resources/config/permissions.yml +++ b/dmp-backend/notification-service/notification-web/src/main/resources/config/permissions.yml @@ -75,15 +75,13 @@ permissions: #Notification BrowseNotification: roles: - - ic-sti-superuser - - user + - Admin clients: [ ] allowAnonymous: true allowAuthenticated: false EditNotification: roles: - - ic-sti-superuser - - user + - Admin clients: [ ] allowAnonymous: true allowAuthenticated: false diff --git a/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/body.en.html b/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/body.en.html new file mode 100644 index 000000000..75a586097 --- /dev/null +++ b/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/body.en.html @@ -0,0 +1,304 @@ + + + + + + Simple Transactional Email + + + + + + + + + +
  +
+ + + This is preheader text. Some clients will show this text as a preview. + + + + + + + + +
+ + + + +
+

Dear {recipient},

+

{reasonName} just add you to collaborate to Data Management plan {dmpname} with role {dmprole}.

+

Click the button to redirect to {dmpname}.

+ + + + + + + +
+ + + + + + +
Join
+
+
+
+ + + + + + +
+
 
+ + \ No newline at end of file diff --git a/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/subject.en.txt b/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/subject.en.txt new file mode 100644 index 000000000..2c36d1524 --- /dev/null +++ b/dmp-backend/notification-service/notification-web/src/main/resources/notification_templates/dmpinvitationexistinguser/inapp/subject.en.txt @@ -0,0 +1 @@ +ARGOS - Data Management Plan Invite \ No newline at end of file diff --git a/dmp-backend/notification-service/notification-web/target/classes/config/notification.yml b/dmp-backend/notification-service/notification-web/target/classes/config/notification.yml index 5c5e91151..7ad90ce91 100644 --- a/dmp-backend/notification-service/notification-web/target/classes/config/notification.yml +++ b/dmp-backend/notification-service/notification-web/target/classes/config/notification.yml @@ -16,7 +16,7 @@ notification: contacts: [ email ] - #dmpInvitationExistingUser type: 4904dea2-5079-46d3-83be-3a19c9ab45dc - contacts: [ email ] + contacts: [ inapp, email ] - #dpmModified type: 4542262A-22F8-4BAA-9DB6-1C8E70AC1DBB contacts: [ email ] @@ -314,6 +314,30 @@ notification: template-cache: prefix: ${CACHE_DISAMBIGUATION:} key-pattern: "{prefix}:Notification_Message_Email_Template:{key}:v0" + in-app: + flows: + - #dmpInvitationExistingUser + key: 4904dea2-5079-46d3-83be-3a19c9ab45dc + subject-path: classpath:notification_templates/dmpinvitationexistinguser/inapp/subject.{language}.txt + subject-field-options: + mandatory: [ ] + optional: [ ] + body-path: classpath:notification_templates/dmpinvitationexistinguser/inapp/body.{language}.html + body-field-options: + mandatory: [ "{dmpname}", "{dmprole}", "{reasonName}", "{installation-url}", "{id}" ] + optional: + - key: "{recipient}" + value: + formatting: + '[{dmpname}]': null + '[{dmprole}]': null + '[{reasonName}]': null + '[{recipient}]': null + priority-key: null + cipher-fields: [ ] + template-cache: + prefix: ${CACHE_DISAMBIGUATION:} + key-pattern: "{prefix}:Notification_Message_InApp_Template:{key}:v0" override-cache: template-cache: prefix: ${CACHE_DISAMBIGUATION:} diff --git a/dmp-backend/notification-service/notification-web/target/classes/config/permissions.yml b/dmp-backend/notification-service/notification-web/target/classes/config/permissions.yml index 1bc742f5f..c7b20e4ca 100644 --- a/dmp-backend/notification-service/notification-web/target/classes/config/permissions.yml +++ b/dmp-backend/notification-service/notification-web/target/classes/config/permissions.yml @@ -75,15 +75,13 @@ permissions: #Notification BrowseNotification: roles: - - ic-sti-superuser - - user + - Admin clients: [ ] allowAnonymous: true allowAuthenticated: false EditNotification: roles: - - ic-sti-superuser - - user + - Admin clients: [ ] allowAnonymous: true allowAuthenticated: false diff --git a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/data/InAppNotificationEntity.java b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/data/InAppNotificationEntity.java index ac42461f6..ad43ac87f 100644 --- a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/data/InAppNotificationEntity.java +++ b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/data/InAppNotificationEntity.java @@ -16,58 +16,57 @@ import java.util.UUID; @Table(name = "\"ntf_InAppNotification\"") public class InAppNotificationEntity extends TenantScopedBaseEntity { public static class Field { - public static final String ID = "id"; - public static final String USER_ID = "userId"; - public static final String IS_ACTIVE = "isActive"; - public static final String TYPE = "type"; - public static final String READ_TIME = "readTime"; - public static final String TRACKING_STATE = "trackingState"; - public static final String PRIORITY = "priority"; - public static final String SUBJECT = "subject"; - public static final String BODY = "body"; - public static final String EXTRA_DATA = "extraData"; - public static final String CREATED_AT = "createdAt"; - public static final String UPDATED_AT = "updatedAt"; + public static final String _id = "id"; + public static final String _userId = "userId"; + public static final String _isActive = "isActive"; + public static final String _type = "type"; + public static final String _readTime = "readTime"; + public static final String _trackingState = "trackingState"; + public static final String _priority = "priority"; + public static final String _subject = "subject"; + public static final String _body = "body"; + public static final String _extraData = "extraData"; + public static final String _createdAt = "createdAt"; + public static final String _updatedAt = "updatedAt"; } @Id - @Column(name = "id", columnDefinition = "uuid", nullable = false) + @Column(name = "\"id\"", columnDefinition = "uuid", nullable = false) private UUID id; - - @Column(name = "user", columnDefinition = "uuid", nullable = false) + @Column(name = "\"user\"", columnDefinition = "uuid", nullable = false) private UUID userId; - @Column(name = "is_active", nullable = false) + @Column(name = "\"is_active\"", nullable = false) @Convert(converter = IsActiveConverter.class) private IsActive isActive; - @Column(name = "type", columnDefinition = "uuid", nullable = false) + @Column(name = "\"type\"", columnDefinition = "uuid", nullable = false) private UUID type; - @Column(name = "read_time") + @Column(name = "\"read_time\"") private Instant readTime; - @Column(name = "tracking_state", nullable = false) + @Column(name = "\"tracking_state\"", nullable = false) @Convert(converter = NotificationInAppTrackingConverter.class) private NotificationInAppTracking trackingState; - @Column(name = "priority", nullable = false) + @Column(name = "\"priority\"", nullable = false) @Convert(converter = InAppNotificationPriorityConverter.class) private InAppNotificationPriority priority; - @Column(name = "subject") + @Column(name = "\"subject\"") private String subject; - @Column(name = "body") + @Column(name = "\"body\"") private String body; - @Column(name = "extra_data") + @Column(name = "\"extra_data\"") private String extraData; - @Column(name = "created_at", nullable = false) + @Column(name = "\"created_at\"", nullable = false) private Instant createdAt; - @Column(name = "updated_at", nullable = false) + @Column(name = "\"updated_at\"", nullable = false) @Version private Instant updatedAt; diff --git a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/query/InAppNotificationQuery.java b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/query/InAppNotificationQuery.java index 98472d2ed..a6a6ac86e 100644 --- a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/query/InAppNotificationQuery.java +++ b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/query/InAppNotificationQuery.java @@ -161,19 +161,19 @@ public class InAppNotificationQuery extends QueryBase { protected Predicate applyFilters(QueryContext queryContext) { List predicates = new ArrayList<>(); if (this.ids != null) { - predicates.add(queryContext.Root.get(InAppNotificationEntity.Field.ID).in(ids)); + predicates.add(queryContext.Root.get(InAppNotificationEntity.Field._id).in(ids)); } if (this.excludeIds != null) { - predicates.add(queryContext.CriteriaBuilder.not(queryContext.Root.get(InAppNotificationEntity.Field.ID).in(ids))); + predicates.add(queryContext.CriteriaBuilder.not(queryContext.Root.get(InAppNotificationEntity.Field._id).in(ids))); } if (this.userId != null) { - predicates.add(queryContext.Root.get(InAppNotificationEntity.Field.USER_ID).in(userId)); + predicates.add(queryContext.Root.get(InAppNotificationEntity.Field._userId).in(userId)); } if (this.isActives != null) { - predicates.add(queryContext.Root.get(InAppNotificationEntity.Field.IS_ACTIVE).in(isActives)); + predicates.add(queryContext.Root.get(InAppNotificationEntity.Field._isActive).in(isActives)); } if (this.tenantIds != null) { @@ -181,23 +181,23 @@ public class InAppNotificationQuery extends QueryBase { } if (this.type != null) { - predicates.add(queryContext.Root.get(InAppNotificationEntity.Field.TYPE).in(this.type)); + predicates.add(queryContext.Root.get(InAppNotificationEntity.Field._type).in(this.type)); } if (this.trackingState != null) { - predicates.add(queryContext.Root.get(InAppNotificationEntity.Field.TRACKING_STATE).in(trackingState)); + predicates.add(queryContext.Root.get(InAppNotificationEntity.Field._trackingState).in(trackingState)); } if (isRead != null) { - predicates.add(isRead ? queryContext.CriteriaBuilder.isNotNull(queryContext.Root.get(InAppNotificationEntity.Field.READ_TIME)) : queryContext.CriteriaBuilder.isNull(queryContext.Root.get(InAppNotificationEntity.Field.READ_TIME))); + predicates.add(isRead ? queryContext.CriteriaBuilder.isNotNull(queryContext.Root.get(InAppNotificationEntity.Field._readTime)) : queryContext.CriteriaBuilder.isNull(queryContext.Root.get(InAppNotificationEntity.Field._readTime))); } if (from != null) { - predicates.add(queryContext.CriteriaBuilder.greaterThanOrEqualTo(queryContext.Root.get(InAppNotificationEntity.Field.CREATED_AT), from)); + predicates.add(queryContext.CriteriaBuilder.greaterThanOrEqualTo(queryContext.Root.get(InAppNotificationEntity.Field._createdAt), from)); } if (to != null) { - predicates.add(queryContext.CriteriaBuilder.lessThanOrEqualTo(queryContext.Root.get(InAppNotificationEntity.Field.CREATED_AT), from)); + predicates.add(queryContext.CriteriaBuilder.lessThanOrEqualTo(queryContext.Root.get(InAppNotificationEntity.Field._createdAt), from)); } if (predicates.size() > 0) { @@ -211,37 +211,37 @@ public class InAppNotificationQuery extends QueryBase { @Override protected String fieldNameOf(FieldResolver item) { - if (item.match(InAppNotification.Field.ID)) return InAppNotificationEntity.Field.ID; - else if (item.match(InAppNotification.Field.CREATED_AT)) return InAppNotificationEntity.Field.CREATED_AT; - else if (item.match(InAppNotification.Field.USER)) return InAppNotificationEntity.Field.USER_ID; - else if (item.match(InAppNotification.Field.IS_ACTIVE)) return InAppNotificationEntity.Field.IS_ACTIVE; - else if (item.match(InAppNotification.Field.READ_TIME)) return InAppNotificationEntity.Field.READ_TIME; - else if (item.match(InAppNotification.Field.TRACKING_STATE)) return InAppNotificationEntity.Field.TRACKING_STATE; - else if (item.match(InAppNotification.Field.BODY)) return InAppNotificationEntity.Field.BODY; - else if (item.match(InAppNotification.Field.EXTRA_DATA)) return InAppNotificationEntity.Field.EXTRA_DATA; - else if (item.match(InAppNotification.Field.PRIORITY)) return InAppNotificationEntity.Field.PRIORITY; - else if (item.match(InAppNotification.Field.SUBJECT)) return InAppNotificationEntity.Field.SUBJECT; + if (item.match(InAppNotification.Field.ID)) return InAppNotificationEntity.Field._id; + else if (item.match(InAppNotification.Field.CREATED_AT)) return InAppNotificationEntity.Field._createdAt; + else if (item.match(InAppNotification.Field.USER)) return InAppNotificationEntity.Field._userId; + else if (item.match(InAppNotification.Field.IS_ACTIVE)) return InAppNotificationEntity.Field._isActive; + else if (item.match(InAppNotification.Field.READ_TIME)) return InAppNotificationEntity.Field._readTime; + else if (item.match(InAppNotification.Field.TRACKING_STATE)) return InAppNotificationEntity.Field._trackingState; + else if (item.match(InAppNotification.Field.BODY)) return InAppNotificationEntity.Field._body; + else if (item.match(InAppNotification.Field.EXTRA_DATA)) return InAppNotificationEntity.Field._extraData; + else if (item.match(InAppNotification.Field.PRIORITY)) return InAppNotificationEntity.Field._priority; + else if (item.match(InAppNotification.Field.SUBJECT)) return InAppNotificationEntity.Field._subject; else if (item.match(InAppNotification.Field.TENANT)) return InAppNotificationEntity._tenantId; - else if (item.match(InAppNotification.Field.TYPE)) return InAppNotificationEntity.Field.TYPE; - else if (item.match(InAppNotification.Field.UPDATED_AT)) return InAppNotificationEntity.Field.UPDATED_AT; + else if (item.match(InAppNotification.Field.TYPE)) return InAppNotificationEntity.Field._type; + else if (item.match(InAppNotification.Field.UPDATED_AT)) return InAppNotificationEntity.Field._updatedAt; else return null; } @Override protected InAppNotificationEntity convert(Tuple tuple, Set columns) { InAppNotificationEntity item = new InAppNotificationEntity(); - item.setId(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.ID, UUID.class)); - item.setType(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.TYPE, UUID.class)); - item.setUserId(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.USER_ID, UUID.class)); + item.setId(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._id, UUID.class)); + item.setType(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._type, UUID.class)); + item.setUserId(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._userId, UUID.class)); item.setTenantId(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity._tenantId, UUID.class)); - item.setTrackingState(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.TRACKING_STATE, NotificationInAppTracking.class)); - item.setCreatedAt(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.CREATED_AT, Instant.class)); - item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.UPDATED_AT, Instant.class)); - item.setIsActive(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.IS_ACTIVE, IsActive.class)); - item.setExtraData(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.EXTRA_DATA, String.class)); - item.setBody(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.BODY, String.class)); - item.setSubject(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.SUBJECT, String.class)); - item.setPriority(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field.PRIORITY, InAppNotificationPriority.class)); + item.setTrackingState(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._trackingState, NotificationInAppTracking.class)); + item.setCreatedAt(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._createdAt, Instant.class)); + item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._updatedAt, Instant.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._isActive, IsActive.class)); + item.setExtraData(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._extraData, String.class)); + item.setBody(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._body, String.class)); + item.setSubject(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._subject, String.class)); + item.setPriority(QueryBase.convertSafe(tuple, columns, InAppNotificationEntity.Field._priority, InAppNotificationPriority.class)); return item; } } diff --git a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/service/notify/InAppNotifier.java b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/service/notify/InAppNotifier.java index 79e2d397b..fc89f1b91 100644 --- a/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/service/notify/InAppNotifier.java +++ b/dmp-backend/notification-service/notification/src/main/java/gr/cite/notification/service/notify/InAppNotifier.java @@ -66,9 +66,9 @@ public class InAppNotifier implements Notify{ inApp.setBody(inAppMessage.getBody()); inApp.setExtraData(inAppMessage.getExtraData() != null ? this.jsonHandlingService.toJsonSafe(inAppMessage.getExtraData()) : null); inApp.setCreatedAt(Instant.now()); + inApp.setUpdatedAt(Instant.now()); inApp.setTenantId(tenantScope.getTenant()); - inApp = entityManager.merge(inApp); entityManager.persist(inApp); InAppTrackingData trackingData = new InAppTrackingData(inApp.getId());