From a55d7c36929322265b8496d6bf88f5a02219b873 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Fri, 26 Jan 2024 17:42:45 +0200 Subject: [PATCH] Adding outbox events for users on the main app --- .../notification/NotificationContactType.java | 33 +- .../notification/TentativeUserProfile.java | 30 + .../commons/enums/notification/UserType.java | 30 + .../outbox/OutboxIntegrationEvent.java | 44 +- .../outbox/OutboxProperties.java | 59 +- .../outbox/OutboxRepositoryImpl.java | 697 +++++++++--------- .../outbox/OutboxServiceImpl.java | 6 +- .../UserRemovalConsistencyHandler.java | 25 + .../UserRemovalConsistencyPredicates.java | 21 + .../UserRemovalIntegrationEvent.java | 28 + .../UserRemovalIntegrationEventHandler.java | 7 + ...serRemovalIntegrationEventHandlerImpl.java | 40 + .../UserTouchedIntegrationEvent.java | 126 ++++ .../UserTouchedIntegrationEventHandler.java | 7 + ...serTouchedIntegrationEventHandlerImpl.java | 34 + .../web/src/main/resources/config/queue.yml | 2 + 16 files changed, 792 insertions(+), 397 deletions(-) create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/TentativeUserProfile.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/UserType.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyPredicates.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEvent.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandler.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandlerImpl.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEvent.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandler.java create mode 100644 dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/NotificationContactType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/NotificationContactType.java index 904fea9b3..14797356c 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/NotificationContactType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/NotificationContactType.java @@ -7,26 +7,27 @@ import eu.eudat.data.converters.enums.DatabaseEnum; import java.util.Map; public enum NotificationContactType implements DatabaseEnum { - EMAIL((short)0), - SLACK_BROADCAST((short)1), - SMS((short)2), - IN_APP((short)3); - private final Short value; + EMAIL((short) 0), + SLACK_BROADCAST((short) 1), + SMS((short) 2), + IN_APP((short) 3); - NotificationContactType(Short value) { - this.value = value; - } + private final Short value; - @JsonValue - public Short getValue() { - return value; - } + NotificationContactType(Short value) { + this.value = value; + } - private static final Map map = EnumUtils.getEnumValueMap(NotificationContactType.class); + @JsonValue + public Short getValue() { + return value; + } - public static NotificationContactType of(Short i) { - return map.get(i); - } + private static final Map map = EnumUtils.getEnumValueMap(NotificationContactType.class); + + public static NotificationContactType of(Short i) { + return map.get(i); + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/TentativeUserProfile.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/TentativeUserProfile.java new file mode 100644 index 000000000..8c3c59a76 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/TentativeUserProfile.java @@ -0,0 +1,30 @@ +package eu.eudat.commons.enums.notification; + +import com.fasterxml.jackson.annotation.JsonValue; +import eu.eudat.commons.enums.EnumUtils; +import eu.eudat.data.converters.enums.DatabaseEnum; + +import java.util.Map; + +public enum TentativeUserProfile implements DatabaseEnum { + + Complete((short) 0), Tentative((short) 1); + + private final Short value; + + TentativeUserProfile(Short value) { + this.value = value; + } + + @JsonValue + public Short getValue() { + return value; + } + + private static final Map map = EnumUtils.getEnumValueMap(TentativeUserProfile.class); + + public static TentativeUserProfile of(Short i) { + return map.get(i); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/UserType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/UserType.java new file mode 100644 index 000000000..6767c7202 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/notification/UserType.java @@ -0,0 +1,30 @@ +package eu.eudat.commons.enums.notification; + +import com.fasterxml.jackson.annotation.JsonValue; +import eu.eudat.commons.enums.EnumUtils; +import eu.eudat.data.converters.enums.DatabaseEnum; + +import java.util.Map; + +public enum UserType implements DatabaseEnum { + + Person((short) 0), Service((short) 1); + + private final Short value; + + UserType(Short value) { + this.value = value; + } + + @JsonValue + public Short getValue() { + return value; + } + + private static final Map map = EnumUtils.getEnumValueMap(UserType.class); + + public static UserType of(Short i) { + return map.get(i); + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java index d492544e9..97d7c1c52 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxIntegrationEvent.java @@ -4,24 +4,36 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import eu.eudat.integrationevent.TrackedEvent; import gr.cite.rabbitmq.IntegrationEvent; - @JsonIgnoreProperties(ignoreUnknown = true) public class OutboxIntegrationEvent extends IntegrationEvent { - public static final String FORGET_ME_COMPLETED = "FORGET_ME_COMPLETED"; - public static final String NOTIFY = "NOTIFY"; - public static final String TENANT_REACTIVATE = "TENANT_REACTIVATE"; - public static final String TENANT_REMOVE = "TENANT_REMOVE"; - public static final String TENANT_TOUCH = "TENANT_TOUCH"; - public static final String TENANT_USER_INVITE = "TENANT_USER_INVITE"; - public static final String WHAT_YOU_KNOW_ABOUT_ME_COMPLETED = "WHAT_YOU_KNOW_ABOUT_ME_COMPLETED"; - public static final String GENERATE_FILE = "GENERATE_FILE"; - private TrackedEvent event; - public TrackedEvent getEvent() { - return event; - } + public static final String FORGET_ME_COMPLETED = "FORGET_ME_COMPLETED"; - public void setEvent(TrackedEvent event) { - this.event = event; - } + public static final String NOTIFY = "NOTIFY"; + + public static final String TENANT_REACTIVATE = "TENANT_REACTIVATE"; + + public static final String TENANT_REMOVE = "TENANT_REMOVE"; + + public static final String TENANT_TOUCH = "TENANT_TOUCH"; + + public static final String TENANT_USER_INVITE = "TENANT_USER_INVITE"; + + public static final String USER_TOUCH = "USER_TOUCH"; + + public static final String USER_REMOVE = "USER_REMOVE"; + + public static final String WHAT_YOU_KNOW_ABOUT_ME_COMPLETED = "WHAT_YOU_KNOW_ABOUT_ME_COMPLETED"; + + public static final String GENERATE_FILE = "GENERATE_FILE"; + + private TrackedEvent event; + + public TrackedEvent getEvent() { + return event; + } + + public void setEvent(TrackedEvent event) { + this.event = event; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java index e9e0c9680..431027f04 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxProperties.java @@ -1,51 +1,52 @@ package eu.eudat.integrationevent.outbox; - import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.bind.ConstructorBinding; -import org.springframework.validation.annotation.Validated; -import jakarta.validation.constraints.NotNull; - -@Validated @ConfigurationProperties(prefix = "queue.task.publisher.options") -//@ConstructorBinding public class OutboxProperties { - @NotNull + private final String exchange; - @NotNull + private final String tenantTouchTopic; - @NotNull + private final String tenantRemovalTopic; - @NotNull + private final String tenantReactivationTopic; - @NotNull + private final String tenantUserInviteTopic; - @NotNull + + private final String userRemovalTopic; + + private final String userTouchTopic; + private final String notifyTopic; - @NotNull + private final String forgetMeCompletedTopic; - @NotNull + private final String whatYouKnowAboutMeCompletedTopic; - @NotNull + private final String generateFileTopic; public OutboxProperties(String exchange, - String tenantTouchTopic, - String tenantRemovalTopic, - String tenantReactivationTopic, - String tenantUserInviteTopic, - String notifyTopic, - String forgetMeCompletedTopic, - String whatYouKnowAboutMeCompletedTopic, - String generateFileTopic + String tenantTouchTopic, + String tenantRemovalTopic, + String tenantReactivationTopic, + String tenantUserInviteTopic, + String userRemovalTopic, + String userTouchTopic, + String notifyTopic, + String forgetMeCompletedTopic, + String whatYouKnowAboutMeCompletedTopic, + String generateFileTopic ) { this.exchange = exchange; this.tenantTouchTopic = tenantTouchTopic; this.tenantRemovalTopic = tenantRemovalTopic; this.tenantReactivationTopic = tenantReactivationTopic; this.tenantUserInviteTopic = tenantUserInviteTopic; - this.notifyTopic = notifyTopic; + this.userRemovalTopic = userRemovalTopic; + this.userTouchTopic = userTouchTopic; + this.notifyTopic = notifyTopic; this.forgetMeCompletedTopic = forgetMeCompletedTopic; this.whatYouKnowAboutMeCompletedTopic = whatYouKnowAboutMeCompletedTopic; this.generateFileTopic = generateFileTopic; @@ -71,6 +72,14 @@ public class OutboxProperties { return tenantUserInviteTopic; } + public String getUserRemovalTopic() { + return userRemovalTopic; + } + + public String getUserTouchTopic() { + return userTouchTopic; + } + public String getNotifyTopic() { return notifyTopic; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java index 0b93590f7..2e1529411 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxRepositoryImpl.java @@ -14,415 +14,440 @@ import gr.cite.rabbitmq.IntegrationEvent; import gr.cite.tools.data.query.Ordering; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.logging.LoggerService; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; - import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; import jakarta.persistence.OptimisticLockException; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + import java.time.Instant; import java.util.List; -import java.util.Random; import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; public class OutboxRepositoryImpl implements OutboxRepository { - protected final ApplicationContext applicationContext; - private final Random random = new Random(); - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(OutboxRepositoryImpl.class)); - private final JsonHandlingService jsonHandlingService; - private final OutboxProperties outboxProperties; + protected final ApplicationContext applicationContext; - public OutboxRepositoryImpl( - ApplicationContext applicationContext, - OutboxProperties outboxProperties - ) { - this.applicationContext = applicationContext; - this.jsonHandlingService = this.applicationContext.getBean(JsonHandlingService.class); - this.outboxProperties = outboxProperties; - } + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(OutboxRepositoryImpl.class)); - @Override - public CandidateInfo candidate(Instant lastCandidateCreationTimestamp, MessageOptions messageOptions, Function onConfirmTimeout) { - EntityTransaction transaction = null; - EntityManager entityManager = null; - CandidateInfo candidate = null; - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - entityManager = entityManagerFactory.createEntityManager(); + private final JsonHandlingService jsonHandlingService; - transaction = entityManager.getTransaction(); - transaction.begin(); + private final OutboxProperties outboxProperties; - QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class) - .isActives(IsActive.Active) - .notifyStatus(QueueOutboxNotifyStatus.PENDING, QueueOutboxNotifyStatus.WAITING_CONFIRMATION, QueueOutboxNotifyStatus.ERROR) - .retryThreshold(messageOptions.getRetryThreashold()) - .confirmTimeout(messageOptions.getConfirmTimeoutSeconds()) - .createdAfter(lastCandidateCreationTimestamp) - .ordering(new Ordering().addAscending(QueueOutboxEntity._createdAt)) - .first(); + public OutboxRepositoryImpl( + ApplicationContext applicationContext, + OutboxProperties outboxProperties + ) { + this.applicationContext = applicationContext; + this.jsonHandlingService = this.applicationContext.getBean(JsonHandlingService.class); + this.outboxProperties = outboxProperties; + } - if (item != null) { - boolean confirmTimeout = onConfirmTimeout.apply(item); + @Override + public CandidateInfo candidate(Instant lastCandidateCreationTimestamp, MessageOptions messageOptions, Function onConfirmTimeout) { + EntityTransaction transaction = null; + EntityManager entityManager = null; + CandidateInfo candidate = null; + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + entityManager = entityManagerFactory.createEntityManager(); - QueueOutboxNotifyStatus prevState = item.getNotifyStatus(); - item.setNotifyStatus(QueueOutboxNotifyStatus.PROCESSING); + transaction = entityManager.getTransaction(); + transaction.begin(); - entityManager.merge(item); - entityManager.flush(); + QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class) + .isActives(IsActive.Active) + .notifyStatus(QueueOutboxNotifyStatus.PENDING, QueueOutboxNotifyStatus.WAITING_CONFIRMATION, QueueOutboxNotifyStatus.ERROR) + .retryThreshold(messageOptions.getRetryThreashold()) + .confirmTimeout(messageOptions.getConfirmTimeoutSeconds()) + .createdAfter(lastCandidateCreationTimestamp) + .ordering(new Ordering().addAscending(QueueOutboxEntity._createdAt)) + .first(); - candidate = new CandidateInfo(); - candidate.setId(item.getId()); - candidate.setCreatedAt(item.getCreatedAt()); - candidate.setPreviousState(prevState); - } + if (item != null) { + boolean confirmTimeout = onConfirmTimeout.apply(item); - transaction.commit(); - } catch (OptimisticLockException ex) { - // we get this if/when someone else already modified the notifications. We want to essentially ignore this, and keep working - logger.debug("Concurrency exception getting queue outbox. Skipping: {} ", ex.getMessage()); - if (transaction != null) transaction.rollback(); - candidate = null; - } catch (Exception ex) { - logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); - if (transaction != null) transaction.rollback(); - candidate = null; - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); - } + QueueOutboxNotifyStatus prevState = item.getNotifyStatus(); + item.setNotifyStatus(QueueOutboxNotifyStatus.PROCESSING); - return candidate; - } + entityManager.merge(item); + entityManager.flush(); - @Override - public Boolean shouldOmit(CandidateInfo candidate, Function shouldOmit) { - EntityTransaction transaction = null; - EntityManager entityManager = null; - boolean success = false; + candidate = new CandidateInfo(); + candidate.setId(item.getId()); + candidate.setCreatedAt(item.getCreatedAt()); + candidate.setPreviousState(prevState); + } - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + transaction.commit(); + } catch (OptimisticLockException ex) { + // we get this if/when someone else already modified the notifications. We want to essentially ignore this, and keep working + logger.debug("Concurrency exception getting queue outbox. Skipping: {} ", ex.getMessage()); + if (transaction != null) + transaction.rollback(); + candidate = null; + } catch (Exception ex) { + logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); + if (transaction != null) + transaction.rollback(); + candidate = null; + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem getting list of queue outbox. Skipping: {}", ex.getMessage(), ex); + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); + return candidate; + } - transaction.begin(); + @Override + public Boolean shouldOmit(CandidateInfo candidate, Function shouldOmit) { + EntityTransaction transaction = null; + EntityManager entityManager = null; + boolean success = false; - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidate.getId()).first(); + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - if (item == null) { - logger.warn("Could not lookup queue outbox {} to process. Continuing...", candidate.getId()); - } else { - if (shouldOmit.apply(item)) { - item.setNotifyStatus(QueueOutboxNotifyStatus.OMITTED); + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); - entityManager.merge(item); - entityManager.flush(); - success = true; - } - } + transaction.begin(); - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - success = false; - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - return success; - } + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidate.getId()).first(); - @Override - public Boolean shouldWait(CandidateInfo candidate, Function itIsTimeFunc) { - EntityTransaction transaction = null; - EntityManager entityManager = null; - boolean success = false; + if (item == null) { + logger.warn("Could not lookup queue outbox {} to process. Continuing...", candidate.getId()); + } else { + if (shouldOmit.apply(item)) { + item.setNotifyStatus(QueueOutboxNotifyStatus.OMITTED); - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + entityManager.merge(item); + entityManager.flush(); + success = true; + } + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + success = false; + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + return success; + } - transaction.begin(); + @Override + public Boolean shouldWait(CandidateInfo candidate, Function itIsTimeFunc) { + EntityTransaction transaction = null; + EntityManager entityManager = null; + boolean success = false; - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidate.getId()).first(); + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - if (item.getRetryCount() != null && item.getRetryCount() >= 1) { - Boolean itIsTime = itIsTimeFunc.apply(item); + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); - if (!itIsTime) { - item.setNotifyStatus(candidate.getPreviousState()); + transaction.begin(); - entityManager.merge(item); - entityManager.flush(); - success = true; - } + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidate.getId()).first(); - success = !itIsTime; - } - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - success = false; - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - return success; - } + if (item.getRetryCount() != null && item.getRetryCount() >= 1) { + Boolean itIsTime = itIsTimeFunc.apply(item); - @Override - public Boolean process(CandidateInfo candidateInfo, Boolean isAutoconfirmOnPublish, Function publish) { - EntityTransaction transaction = null; - EntityManager entityManager = null; - Boolean success = false; + if (!itIsTime) { + item.setNotifyStatus(candidate.getPreviousState()); - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { + entityManager.merge(item); + entityManager.flush(); + success = true; + } - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + success = !itIsTime; + } + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + success = false; + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + return success; + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); - transaction.begin(); + @Override + public Boolean process(CandidateInfo candidateInfo, Boolean isAutoconfirmOnPublish, Function publish) { + EntityTransaction transaction = null; + EntityManager entityManager = null; + Boolean success = false; - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidateInfo.getId()).first(); + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { - if (item == null) { - logger.warn("Could not lookup queue outbox {} to process. Continuing...", candidateInfo.getId()); - } else { + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - success = publish.apply(item); - if (success) { - if (isAutoconfirmOnPublish) { - item.setNotifyStatus(QueueOutboxNotifyStatus.CONFIRMED); - item.setConfirmedAt(Instant.now()); - } else { - item.setNotifyStatus(QueueOutboxNotifyStatus.WAITING_CONFIRMATION); - } - item.setPublishedAt(Instant.now()); - } else { - item.setNotifyStatus(QueueOutboxNotifyStatus.ERROR); - item.setRetryCount(item.getRetryCount() != null ? item.getRetryCount() + 1 : 0); - item.setPublishedAt(null); - } + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); + transaction.begin(); - entityManager.merge(item); - entityManager.flush(); - } + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + QueueOutboxEntity item = queryFactory.query(QueueOutboxQuery.class).ids(candidateInfo.getId()).first(); - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - success = false; - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - return success; - } + if (item == null) { + logger.warn("Could not lookup queue outbox {} to process. Continuing...", candidateInfo.getId()); + } else { - @Override - public void handleConfirm(List confirmedMessages) { - EntityTransaction transaction = null; - EntityManager entityManager = null; + success = publish.apply(item); + if (success) { + if (isAutoconfirmOnPublish) { + item.setNotifyStatus(QueueOutboxNotifyStatus.CONFIRMED); + item.setConfirmedAt(Instant.now()); + } else { + item.setNotifyStatus(QueueOutboxNotifyStatus.WAITING_CONFIRMATION); + } + item.setPublishedAt(Instant.now()); + } else { + item.setNotifyStatus(QueueOutboxNotifyStatus.ERROR); + item.setRetryCount(item.getRetryCount() != null ? item.getRetryCount() + 1 : 0); + item.setPublishedAt(null); + } - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { + entityManager.merge(item); + entityManager.flush(); + } - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + success = false; + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + return success; + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); - transaction.begin(); + @Override + public void handleConfirm(List confirmedMessages) { + EntityTransaction transaction = null; + EntityManager entityManager = null; - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - List queueOutboxMessages = queryFactory.query(QueueOutboxQuery.class).ids(confirmedMessages).collect(); + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { - if (queueOutboxMessages == null) { - logger.warn("Could not lookup messages {} to process. Continuing...", String.join(",", confirmedMessages.stream().map(x -> x.toString()).collect(Collectors.toList()))); - } else { + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - for (QueueOutboxEntity queueOutboxMessage : queueOutboxMessages) { - queueOutboxMessage.setNotifyStatus(QueueOutboxNotifyStatus.CONFIRMED); - queueOutboxMessage.setConfirmedAt(Instant.now()); - entityManager.merge(queueOutboxMessage); - } + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); + transaction.begin(); - entityManager.flush(); - } + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + List queueOutboxMessages = queryFactory.query(QueueOutboxQuery.class).ids(confirmedMessages).collect(); - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - } + if (queueOutboxMessages == null) { + logger.warn("Could not lookup messages {} to process. Continuing...", String.join(",", confirmedMessages.stream().map(x -> x.toString()).collect(Collectors.toList()))); + } else { - @Override - public void handleNack(List nackedMessages) { - EntityTransaction transaction = null; - EntityManager entityManager = null; + for (QueueOutboxEntity queueOutboxMessage : queueOutboxMessages) { + queueOutboxMessage.setNotifyStatus(QueueOutboxNotifyStatus.CONFIRMED); + queueOutboxMessage.setConfirmedAt(Instant.now()); + entityManager.merge(queueOutboxMessage); + } - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { + entityManager.flush(); + } - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); - transaction.begin(); + @Override + public void handleNack(List nackedMessages) { + EntityTransaction transaction = null; + EntityManager entityManager = null; - QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); - List queueOutboxMessages = queryFactory.query(QueueOutboxQuery.class).ids(nackedMessages).collect(); + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { - if (queueOutboxMessages == null) { - logger.warn("Could not lookup messages {} to process. Continuing...", String.join(",", nackedMessages.stream().map(x -> x.toString()).collect(Collectors.toList()))); - } else { + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - for (QueueOutboxEntity queueOutboxMessage : queueOutboxMessages) { - queueOutboxMessage.setNotifyStatus(QueueOutboxNotifyStatus.ERROR); - queueOutboxMessage.setRetryCount(queueOutboxMessage.getRetryCount() != null ? queueOutboxMessage.getRetryCount() + 1 : 0); - entityManager.merge(queueOutboxMessage); - } + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); + transaction.begin(); - entityManager.flush(); - } + QueryFactory queryFactory = this.applicationContext.getBean(QueryFactory.class); + List queueOutboxMessages = queryFactory.query(QueueOutboxQuery.class).ids(nackedMessages).collect(); - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - } + if (queueOutboxMessages == null) { + logger.warn("Could not lookup messages {} to process. Continuing...", String.join(",", nackedMessages.stream().map(x -> x.toString()).collect(Collectors.toList()))); + } else { - @Override - public QueueOutbox create(IntegrationEvent item) { - EntityTransaction transaction = null; - EntityManager entityManager = null; - boolean success = false; - QueueOutboxEntity queueMessage = null; - try (FakeRequestScope ignored = new FakeRequestScope()) { - try { - queueMessage = this.mapEvent((OutboxIntegrationEvent) item); - EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); + for (QueueOutboxEntity queueOutboxMessage : queueOutboxMessages) { + queueOutboxMessage.setNotifyStatus(QueueOutboxNotifyStatus.ERROR); + queueOutboxMessage.setRetryCount(queueOutboxMessage.getRetryCount() != null ? queueOutboxMessage.getRetryCount() + 1 : 0); + entityManager.merge(queueOutboxMessage); + } - entityManager = entityManagerFactory.createEntityManager(); - transaction = entityManager.getTransaction(); + entityManager.flush(); + } - transaction.begin(); + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + } - entityManager.persist(queueMessage); - entityManager.flush(); + @Override + public QueueOutbox create(IntegrationEvent item) { + EntityTransaction transaction = null; + EntityManager entityManager = null; + boolean success = false; + QueueOutboxEntity queueMessage = null; + try (FakeRequestScope ignored = new FakeRequestScope()) { + try { + queueMessage = this.mapEvent((OutboxIntegrationEvent) item); + EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class); - transaction.commit(); - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - if (transaction != null) transaction.rollback(); - success = false; - } finally { - if (entityManager != null) entityManager.close(); - } - } catch (Exception ex) { - logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); - } - return queueMessage; - } + entityManager = entityManagerFactory.createEntityManager(); + transaction = entityManager.getTransaction(); - private QueueOutboxEntity mapEvent(OutboxIntegrationEvent event) { - String routingKey; - switch (event.getType()) { - case OutboxIntegrationEvent.TENANT_REACTIVATE: { - routingKey = this.outboxProperties.getTenantReactivationTopic(); - break; - } - case OutboxIntegrationEvent.TENANT_REMOVE: { - routingKey = this.outboxProperties.getTenantRemovalTopic(); - break; - } - case OutboxIntegrationEvent.TENANT_TOUCH: { - routingKey = this.outboxProperties.getTenantTouchTopic(); - break; - } - case OutboxIntegrationEvent.TENANT_USER_INVITE: { - routingKey = this.outboxProperties.getTenantUserInviteTopic(); - break; - } - case OutboxIntegrationEvent.FORGET_ME_COMPLETED: { - routingKey = this.outboxProperties.getForgetMeCompletedTopic(); - break; - } - case OutboxIntegrationEvent.NOTIFY: { - routingKey = this.outboxProperties.getNotifyTopic(); - break; - } - case OutboxIntegrationEvent.WHAT_YOU_KNOW_ABOUT_ME_COMPLETED: { - routingKey = this.outboxProperties.getWhatYouKnowAboutMeCompletedTopic(); - break; - } - case OutboxIntegrationEvent.GENERATE_FILE: { - routingKey = this.outboxProperties.getGenerateFileTopic(); - break; - } - default: { - logger.error("unrecognized outgoing integration event {}. Skipping...", event.getType()); - return null; - } - } + transaction.begin(); - UUID correlationId = UUID.randomUUID(); - if (event.getEvent() != null) event.getEvent().setTrackingContextTag(correlationId.toString()); - event.setMessage(this.jsonHandlingService.toJsonSafe(event.getEvent())); - //this._logTrackingService.Trace(correlationId.ToString(), $"Correlating current tracking context with new correlationId {correlationId}"); + entityManager.persist(queueMessage); + entityManager.flush(); - QueueOutboxEntity queueMessage = new QueueOutboxEntity(); - queueMessage.setId(UUID.randomUUID()); - queueMessage.setTenantId(null); - queueMessage.setExchange(this.outboxProperties.getExchange()); - queueMessage.setRoute(routingKey); - queueMessage.setMessageId(event.getMessageId()); - queueMessage.setMessage(this.jsonHandlingService.toJsonSafe(event)); - queueMessage.setIsActive(IsActive.Active); - queueMessage.setNotifyStatus(QueueOutboxNotifyStatus.PENDING); - queueMessage.setRetryCount(0); - queueMessage.setCreatedAt(Instant.now()); - queueMessage.setUpdatedAt(Instant.now()); + transaction.commit(); + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + if (transaction != null) + transaction.rollback(); + success = false; + } finally { + if (entityManager != null) + entityManager.close(); + } + } catch (Exception ex) { + logger.error("Problem executing purge. rolling back any db changes and marking error. Continuing...", ex); + } + return queueMessage; + } - return queueMessage; - } + private QueueOutboxEntity mapEvent(OutboxIntegrationEvent event) { + String routingKey; + switch (event.getType()) { + case OutboxIntegrationEvent.TENANT_REACTIVATE: { + routingKey = this.outboxProperties.getTenantReactivationTopic(); + break; + } + case OutboxIntegrationEvent.TENANT_REMOVE: { + routingKey = this.outboxProperties.getTenantRemovalTopic(); + break; + } + case OutboxIntegrationEvent.TENANT_TOUCH: { + routingKey = this.outboxProperties.getTenantTouchTopic(); + break; + } + case OutboxIntegrationEvent.TENANT_USER_INVITE: { + routingKey = this.outboxProperties.getTenantUserInviteTopic(); + break; + } + case OutboxIntegrationEvent.USER_REMOVE: { + routingKey = this.outboxProperties.getUserRemovalTopic(); + break; + } + case OutboxIntegrationEvent.USER_TOUCH: { + routingKey = this.outboxProperties.getUserTouchTopic(); + break; + } + case OutboxIntegrationEvent.FORGET_ME_COMPLETED: { + routingKey = this.outboxProperties.getForgetMeCompletedTopic(); + break; + } + case OutboxIntegrationEvent.NOTIFY: { + routingKey = this.outboxProperties.getNotifyTopic(); + break; + } + case OutboxIntegrationEvent.WHAT_YOU_KNOW_ABOUT_ME_COMPLETED: { + routingKey = this.outboxProperties.getWhatYouKnowAboutMeCompletedTopic(); + break; + } + case OutboxIntegrationEvent.GENERATE_FILE: { + routingKey = this.outboxProperties.getGenerateFileTopic(); + break; + } + default: { + logger.error("unrecognized outgoing integration event {}. Skipping...", event.getType()); + return null; + } + } + + UUID correlationId = UUID.randomUUID(); + if (event.getEvent() != null) + event.getEvent().setTrackingContextTag(correlationId.toString()); + event.setMessage(this.jsonHandlingService.toJsonSafe(event.getEvent())); + //this._logTrackingService.Trace(correlationId.ToString(), $"Correlating current tracking context with new correlationId {correlationId}"); + + QueueOutboxEntity queueMessage = new QueueOutboxEntity(); + queueMessage.setId(UUID.randomUUID()); + queueMessage.setTenantId(null); + queueMessage.setExchange(this.outboxProperties.getExchange()); + queueMessage.setRoute(routingKey); + queueMessage.setMessageId(event.getMessageId()); + queueMessage.setMessage(this.jsonHandlingService.toJsonSafe(event)); + queueMessage.setIsActive(IsActive.Active); + queueMessage.setNotifyStatus(QueueOutboxNotifyStatus.PENDING); + queueMessage.setRetryCount(0); + queueMessage.setCreatedAt(Instant.now()); + queueMessage.setUpdatedAt(Instant.now()); + + return queueMessage; + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxServiceImpl.java index 3d1a5b7be..75805e7c6 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/OutboxServiceImpl.java @@ -32,12 +32,10 @@ public class OutboxServiceImpl implements OutboxService { public void publish(OutboxIntegrationEvent event) { try { eventPublisher.publishEvent(event); - return; - } catch (Exception ex) { + } catch (Exception ex) { logger.error(new MapLogEntry(String.format("Could not save message ", event.getMessage())).And("message", event.getMessage()).And("ex", ex)); //Still want to skip it from processing - return; - } + } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java new file mode 100644 index 000000000..d4893285c --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java @@ -0,0 +1,25 @@ +package eu.eudat.integrationevent.outbox.userremoval; + +import eu.eudat.integrationevent.inbox.ConsistencyHandler; +import eu.eudat.query.UserQuery; +import gr.cite.tools.data.query.QueryFactory; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class UserRemovalConsistencyHandler implements ConsistencyHandler { + + private final QueryFactory queryFactory; + + public UserRemovalConsistencyHandler(QueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + @Override + public Boolean isConsistent(UserRemovalConsistencyPredicates consistencyPredicates) { + long count = this.queryFactory.query(UserQuery.class).ids(consistencyPredicates.getUserId()).count(); + return count != 0; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyPredicates.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyPredicates.java new file mode 100644 index 000000000..7aa25ed65 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalConsistencyPredicates.java @@ -0,0 +1,21 @@ +package eu.eudat.integrationevent.outbox.userremoval; + +import eu.eudat.integrationevent.inbox.ConsistencyPredicates; + +import java.util.UUID; + +public class UserRemovalConsistencyPredicates implements ConsistencyPredicates { + public UserRemovalConsistencyPredicates(UUID userId) { + this.userId = userId; + } + + private UUID userId; + + public UUID getUserId() { + return userId; + } + + public void setUserId(UUID userId) { + this.userId = userId; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEvent.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEvent.java new file mode 100644 index 000000000..e994aac74 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEvent.java @@ -0,0 +1,28 @@ +package eu.eudat.integrationevent.outbox.userremoval; + +import eu.eudat.integrationevent.TrackedEvent; + +import java.util.UUID; + +public class UserRemovalIntegrationEvent extends TrackedEvent { + + private UUID userId; + + private UUID tenant; + + public UUID getUserId() { + return userId; + } + + public void setUserId(UUID userId) { + this.userId = userId; + } + + public UUID getTenant() { + return tenant; + } + + public void setTenant(UUID tenant) { + this.tenant = tenant; + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandler.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandler.java new file mode 100644 index 000000000..2e637a445 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandler.java @@ -0,0 +1,7 @@ +package eu.eudat.integrationevent.outbox.userremoval; + +public interface UserRemovalIntegrationEventHandler { + + void handle(UserRemovalIntegrationEvent event); + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandlerImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandlerImpl.java new file mode 100644 index 000000000..4469daa85 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/userremoval/UserRemovalIntegrationEventHandlerImpl.java @@ -0,0 +1,40 @@ +package eu.eudat.integrationevent.outbox.userremoval; + +import eu.eudat.integrationevent.outbox.OutboxIntegrationEvent; +import eu.eudat.integrationevent.outbox.OutboxService; +import gr.cite.tools.logging.LoggerService; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class UserRemovalIntegrationEventHandlerImpl implements UserRemovalIntegrationEventHandler { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(UserRemovalIntegrationEventHandlerImpl.class)); + + private final OutboxService outboxService; + + private final ApplicationContext applicationContext; + + public UserRemovalIntegrationEventHandlerImpl(OutboxService outboxService, ApplicationContext applicationContext) { + this.outboxService = outboxService; + this.applicationContext = applicationContext; + } + + @Override + public void handle(UserRemovalIntegrationEvent event) { + UserRemovalConsistencyHandler userRemovalConsistencyHandler = this.applicationContext.getBean(UserRemovalConsistencyHandler.class); + if (!userRemovalConsistencyHandler.isConsistent(new UserRemovalConsistencyPredicates(event.getUserId()))) + return; + OutboxIntegrationEvent message = new OutboxIntegrationEvent(); + message.setMessageId(UUID.randomUUID()); + message.setType(OutboxIntegrationEvent.USER_REMOVE); + message.setEvent(event); + this.outboxService.publish(message); + } +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEvent.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEvent.java new file mode 100644 index 000000000..d84fee0d8 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEvent.java @@ -0,0 +1,126 @@ +package eu.eudat.integrationevent.outbox.usertouched; + +import eu.eudat.commons.enums.notification.TentativeUserProfile; +import eu.eudat.commons.enums.notification.UserType; +import eu.eudat.integrationevent.TrackedEvent; +import eu.eudat.model.UserContactInfo; + +import java.util.List; +import java.util.UUID; + +public class UserTouchedIntegrationEvent extends TrackedEvent { + + private UUID id; + + private UUID tenant; + + private String firstName; + + private String lastName; + + private UserType type; + + private UserProfile profile; + + private List userContactInfo; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public UUID getTenant() { + return tenant; + } + + public void setTenant(UUID tenant) { + this.tenant = tenant; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public UserType getType() { + return type; + } + + public void setType(UserType type) { + this.type = type; + } + + public UserProfile getProfile() { + return profile; + } + + public void setProfile(UserProfile profile) { + this.profile = profile; + } + + public List getUserContactInfo() { + return userContactInfo; + } + + public void setUserContactInfo(List userContactInfo) { + this.userContactInfo = userContactInfo; + } + + public static class UserProfile { + + private TentativeUserProfile isTentative; + + private String timezone; + + private String culture; + + private String language; + + public TentativeUserProfile getIsTentative() { + return isTentative; + } + + public void setIsTentative(TentativeUserProfile isTentative) { + this.isTentative = isTentative; + } + + public String getTimezone() { + return timezone; + } + + public void setTimezone(String timezone) { + this.timezone = timezone; + } + + public String getCulture() { + return culture; + } + + public void setCulture(String culture) { + this.culture = culture; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + } + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandler.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandler.java new file mode 100644 index 000000000..e51388e3c --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandler.java @@ -0,0 +1,7 @@ +package eu.eudat.integrationevent.outbox.usertouched; + +public interface UserTouchedIntegrationEventHandler { + + void handle(UserTouchedIntegrationEvent event); + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java new file mode 100644 index 000000000..d5752f403 --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/usertouched/UserTouchedIntegrationEventHandlerImpl.java @@ -0,0 +1,34 @@ +package eu.eudat.integrationevent.outbox.usertouched; + +import eu.eudat.integrationevent.outbox.OutboxIntegrationEvent; +import eu.eudat.integrationevent.outbox.OutboxService; +import gr.cite.tools.logging.LoggerService; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class UserTouchedIntegrationEventHandlerImpl implements UserTouchedIntegrationEventHandler { + + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(UserTouchedIntegrationEventHandlerImpl.class)); + + private final OutboxService outboxService; + + public UserTouchedIntegrationEventHandlerImpl( + OutboxService outboxService) { + this.outboxService = outboxService; + } + + @Override + public void handle(UserTouchedIntegrationEvent event) { + OutboxIntegrationEvent message = new OutboxIntegrationEvent(); + message.setMessageId(UUID.randomUUID()); + message.setType(OutboxIntegrationEvent.USER_TOUCH); + message.setEvent(event); + this.outboxService.publish(message); + } +} diff --git a/dmp-backend/web/src/main/resources/config/queue.yml b/dmp-backend/web/src/main/resources/config/queue.yml index 3aa39d16c..002a024bf 100644 --- a/dmp-backend/web/src/main/resources/config/queue.yml +++ b/dmp-backend/web/src/main/resources/config/queue.yml @@ -31,6 +31,8 @@ queue: tenant-removal-topic: tenant.remove tenant-touch-topic: tenant.touch tenant-user-invite-topic: tenant.invite + user-touch-topic: user.touch + user-removal-topic: user.remove what-you-know-about-me-completed-topic: whatyouknowaboutme.completed generate-file-topic: generate.file rabbitmq: