package org.gcube.gcat.moderation.thread.social.messages; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; 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.socialnetworking.model.beans.Message; import org.gcube.social_networking.socialnetworking.model.beans.Recipient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class SocialMessageModerationThread extends ModerationThread { private static final Logger logger = LoggerFactory.getLogger(SocialMessageModerationThread.class); 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 postItemToBeManaged() 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; postItemToBeManaged(); } public void postItemUpdated() throws Exception { create = false; cmItemStatus = CMItemStatus.PENDING; postItemToBeManaged(); } 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 List getRecipients(Set users) { List recipients = new ArrayList<>(); for(String username : users) { recipients.add(new Recipient(username)); } return recipients; } protected Message getMessage(String messageString) throws Exception { Message message = new Message(); message.setBody(messageString); message.setSubject(getSubject()); Set moderators = SocialUsers.getUsernamesByRole(Moderated.CATALOGUE_MODERATOR); List recipients = getRecipients(moderators); message.setRecipients(recipients); return message; } @Override protected void postMessage(String messageString) throws Exception { SecretManager secretManager = SecretManagerProvider.instance.get(); String username = secretManager.getUser().getUsername(); Message message = getMessage(messageString); List recipients = message.getRecipients(); recipients.add(new Recipient(username)); Secret secret = Constants.getCatalogueSecret(); secretManager.startSession(secret); try { sendMessage(message); }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); Message message = getMessage(stringBuffer.toString()); SecretManager secretManager = SecretManagerProvider.instance.get(); String username = secretManager.getUser().getUsername(); List recipients = message.getRecipients(); recipients.add(new Recipient(username)); Secret secret = Constants.getCatalogueSecret(); secretManager.startSession(secret); try { sendMessage(message); }finally { secretManager.endSession(); } } protected void sendMessage(Message message) throws Exception { SocialMessage socialMessage = new SocialMessage(); socialMessage.setMessage(message); socialMessage.start(); } @Override protected void createModerationThread() throws Exception { create = true; cmItemStatus = CMItemStatus.PENDING; } }