From 41a8011afb3b62c687315a88e3f6f26151011980 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Thu, 26 May 2022 13:35:33 +0200 Subject: [PATCH] Implementing notifications --- .../SocialNotificationModerationThread.java | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 src/main/java/org/gcube/gcat/moderation/thread/social/notifications/SocialNotificationModerationThread.java diff --git a/src/main/java/org/gcube/gcat/moderation/thread/social/notifications/SocialNotificationModerationThread.java b/src/main/java/org/gcube/gcat/moderation/thread/social/notifications/SocialNotificationModerationThread.java new file mode 100644 index 0000000..2dd9a8d --- /dev/null +++ b/src/main/java/org/gcube/gcat/moderation/thread/social/notifications/SocialNotificationModerationThread.java @@ -0,0 +1,220 @@ +package org.gcube.gcat.moderation.thread.social.notifications; + +import java.io.StringWriter; +import java.net.URL; +import java.util.Set; + +import org.gcube.common.authorization.utils.manager.SecretManager; +import org.gcube.common.authorization.utils.manager.SecretManagerProvider; +import org.gcube.common.authorization.utils.secret.Secret; +import org.gcube.gcat.api.moderation.CMItemStatus; +import org.gcube.gcat.api.moderation.Moderated; +import org.gcube.gcat.moderation.thread.ModerationThread; +import org.gcube.gcat.social.SocialUsers; +import org.gcube.gcat.utils.Constants; +import org.gcube.social_networking.social_networking_client_library.NotificationClient; +import org.gcube.social_networking.socialnetworking.model.beans.catalogue.CatalogueEvent; +import org.gcube.social_networking.socialnetworking.model.beans.catalogue.CatalogueEventType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Luca Frosini (ISTI - CNR) + */ +public class SocialNotificationModerationThread extends ModerationThread { + + private static final Logger logger = LoggerFactory.getLogger(SocialNotificationModerationThread.class); + + protected CatalogueEventType catalogueEventType; + + protected StringBuffer getMainItemInfo(StringBuffer stringBuffer) { + stringBuffer.append("Status: "); + stringBuffer.append(cmItemStatus.getFancyValue()); + stringBuffer.append("\n"); + stringBuffer.append("Title: "); + stringBuffer.append(itemTitle); + stringBuffer.append("\n"); + stringBuffer.append("Name: "); + stringBuffer.append(itemName); + stringBuffer.append("\n"); + stringBuffer.append("ID: "); + stringBuffer.append(itemID); + stringBuffer.append("\n"); + stringBuffer.append("URL: "); + if(cmItemStatus == CMItemStatus.APPROVED) { + stringBuffer.append(itemURL); + }else { + stringBuffer.append(getModerationURL()); + } + stringBuffer.append("\n\n"); + return stringBuffer; + } + + /** + * Create the message for an item that is created/updated + */ + public void notifyItemToBeManaged() throws Exception { + /* + * An example of created message is: + * + * [mister x] created / updated the following item + * + * Title: RESTful Transaction Model + * Name: my_first_restful_transaction_model + * ID: e31a6ba8-66ef-47b8-b61f-99a1366b4a69 + * URL: https://data.dev.d4science.org/ctlg/devVRE/my_first_restful_transaction_model + * + * You are kindly requested to review it and decide either to APPROVE or REJECT it at + * + */ + cmItemStatus = CMItemStatus.PENDING; + String fullName = ckanUser.getNameSurname(); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(fullName); + stringBuffer.append(create ? " created " : " updated "); + stringBuffer.append("the following item\n\n"); + stringBuffer = getMainItemInfo(stringBuffer); + stringBuffer.append("You are kindly requested to review it and decide either to APPROVE or REJECT it."); + // stringBuffer.append("You are kindly requested to review it and decide either to APPROVE or REJECT at"); + // String manageURL = getManageURL(); + // stringBuffer.append(manageURL); + postMessage(stringBuffer.toString()); + } + + + public void postItemCreated() throws Exception { + create = true; + cmItemStatus = CMItemStatus.PENDING; + catalogueEventType = CatalogueEventType.ITEM_SUBMITTED; + notifyItemToBeManaged(); + } + + public void postItemUpdated() throws Exception { + create = false; + cmItemStatus = CMItemStatus.PENDING; + catalogueEventType = CatalogueEventType.ITEM_UPDATED; + notifyItemToBeManaged(); + } + + protected StringBuffer addUserWithRole(String fullName, String role, StringBuffer stringBuffer) { + stringBuffer.append(fullName); + stringBuffer.append(" ["); + stringBuffer.append(role); + stringBuffer.append("] "); + return stringBuffer; + } + + public void postItemManaged(String userMessage) throws Exception { + create = false; + String fullName = ckanUser.getNameSurname(); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer = addUserWithRole(fullName, Moderated.CATALOGUE_MODERATOR, stringBuffer); + stringBuffer.append(cmItemStatus.getValue()); + stringBuffer.append(" the following item"); + if(userMessage!=null && userMessage.length()>0) { + stringBuffer.append(" with this accompanying message\n\n"); + stringBuffer = getMainItemInfo(stringBuffer); + stringBuffer.append(userMessage); + }else { + stringBuffer.append("\n\n"); + stringBuffer = getMainItemInfo(stringBuffer); + } + postMessage(stringBuffer.toString()); + } + + @Override + public void postItemRejected(String userMessage) throws Exception { + create = false; + cmItemStatus = CMItemStatus.REJECTED; + postItemManaged(userMessage); + } + + @Override + public void postItemApproved(String userMessage) throws Exception { + create = false; + cmItemStatus = CMItemStatus.APPROVED; + postItemManaged(userMessage); + } + + protected String getSubject() { + StringWriter stringWriter = new StringWriter(); + if(!create) { + logger.trace("It's a reply"); + stringWriter.append("Re: "); + } + stringWriter.append("[Catalogue Service] "); + stringWriter.append(itemTitle); + return stringWriter.toString(); + } + + protected CatalogueEvent getCatalogueEvent(String messageString) throws Exception { + CatalogueEvent catalogueEvent = new CatalogueEvent(); + catalogueEvent.setItemId(itemID); + if(cmItemStatus == CMItemStatus.APPROVED) { + catalogueEvent.setItemURL(new URL(itemURL)); + }else { + catalogueEvent.setItemURL(new URL(getModerationURL())); + } + + catalogueEvent.setNotifyText(messageString); + + Set users = SocialUsers.getUsernamesByRole(Moderated.CATALOGUE_MODERATOR); + SecretManager secretManager = SecretManagerProvider.instance.get(); + String username = secretManager.getUser().getUsername(); + users.add(username); + + catalogueEvent.setIdsToNotify(users.toArray(new String[users.size()])); + + + + + + return catalogueEvent; + } + + @Override + protected void postMessage(String messageString) throws Exception { + CatalogueEvent catalogueEvent = getCatalogueEvent(messageString); + SecretManager secretManager = SecretManagerProvider.instance.get(); + Secret secret = Constants.getCatalogueSecret(); + secretManager.startSession(secret); + try { + sendNotification(catalogueEvent); + }finally { + secretManager.endSession(); + } + } + + @Override + public void postUserMessage(CMItemStatus cmItemStatus, String userMessage) throws Exception { + this.create = false; + this.cmItemStatus = cmItemStatus; + String fullName = ckanUser.getNameSurname(); + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer = addUserWithRole(fullName, itemAuthor ? "Author" : Moderated.CATALOGUE_MODERATOR, stringBuffer); + stringBuffer.append("sent a message regarding the following item\n\n"); + stringBuffer = getMainItemInfo(stringBuffer); + stringBuffer.append(userMessage); + CatalogueEvent catalogueEvent = getCatalogueEvent(stringBuffer.toString()); + SecretManager secretManager = SecretManagerProvider.instance.get(); + Secret secret = Constants.getCatalogueSecret(); + secretManager.startSession(secret); + try { + sendNotification(catalogueEvent); + }finally { + secretManager.endSession(); + } + } + + protected void sendNotification(CatalogueEvent catalogueEvent) throws Exception { + NotificationClient nc = new NotificationClient(); + nc.sendCatalogueEvent(catalogueEvent); + } + + @Override + protected void createModerationThread() throws Exception { + create = true; + cmItemStatus = CMItemStatus.PENDING; + } + +}