diff --git a/pom.xml b/pom.xml index c28b1ef..4ca2639 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,11 @@ provided + + org.gcube.social-networking + social-service-model + [1.1.0-SNAPSHOT, 2.0.0) + net.sf.ehcache ehcache @@ -302,7 +307,6 @@ - ${project.name} @@ -345,6 +349,24 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + + -Xdoclint:none + -Xdoclint:none + + 3.1.0 + + + generate-doc + install + + jar + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portal/social/networking/ws/mappers/WorkspaceItemMapper.java b/src/main/java/org/gcube/portal/social/networking/ws/mappers/WorkspaceItemMapper.java new file mode 100644 index 0000000..11683d9 --- /dev/null +++ b/src/main/java/org/gcube/portal/social/networking/ws/mappers/WorkspaceItemMapper.java @@ -0,0 +1,57 @@ +package org.gcube.portal.social.networking.ws.mappers; + +import org.gcube.applicationsupportlayer.social.shared.SocialFileItem; +import org.gcube.applicationsupportlayer.social.shared.SocialSharedFolder; +import org.gcube.social_networking.socialnetworking.model.beans.SharedFolderBean; +import org.gcube.social_networking.socialnetworking.model.beans.WorkspaceFileItemBean; + +public class WorkspaceItemMapper { + + public WorkspaceItemMapper() { + // TODO Auto-generated constructor stub + } + + public static SocialFileItem getFileItem(WorkspaceFileItemBean item) { + String id = null; + String name= null; + String title= null; + String path= null; + SocialSharedFolder parent = null; + + try { + id = item.getId(); + name = item.getName(); + title = item.getTitle(); + path = item.getPath(); + parent = getSharedFolder(item.getParent()); + } catch (Exception e) { + e.printStackTrace(); + } + SocialFileItem toReturn = new SocialFileItem(id, name, title, path, parent); + return toReturn; + } + + public static SocialSharedFolder getSharedFolder(SharedFolderBean item) { + + String id = null; + String name= null; + String title= null; + String displayName= null; + String path= null; + String parentId= null; + boolean vreFolder = false; + try { + id = item.getId(); + name = item.getName(); + title = item.getTitle(); + displayName = item.getDisplayName(); + path = item.getPath(); + parentId = item.getParentId(); + vreFolder = item.isVreFolder(); + } catch (Exception e) { + e.printStackTrace(); + } + SocialSharedFolder toReturn = new SocialSharedFolder(id, name, title, displayName, path, parentId, vreFolder); + return toReturn; + } +} diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Notifications.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Notifications.java index 3e69518..d5e90be 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Notifications.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Notifications.java @@ -20,8 +20,10 @@ import javax.ws.rs.core.Response.Status; import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; import org.gcube.applicationsupportlayer.social.NotificationsManager; +import org.gcube.applicationsupportlayer.social.shared.SocialFileItem; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingUser; +import org.gcube.applicationsupportlayer.social.shared.SocialSharedFolder; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; @@ -33,12 +35,15 @@ import org.gcube.portal.social.networking.caches.SocialNetworkingSiteFinder; import org.gcube.portal.social.networking.liferay.ws.LiferayJSONWsCredentials; import org.gcube.portal.social.networking.liferay.ws.UserManagerWSBuilder; import org.gcube.portal.social.networking.ws.inputs.JobNotificationBean; -import org.gcube.portal.social.networking.ws.model.AddFileNotificationBean; -import org.gcube.portal.social.networking.ws.model.AddFolderNotificationBean; -import org.gcube.portal.social.networking.ws.model.NotificationMessage; +import org.gcube.portal.social.networking.ws.mappers.WorkspaceItemMapper; import org.gcube.portal.social.networking.ws.outputs.ResponseBean; import org.gcube.portal.social.networking.ws.utils.CassandraConnection; import org.gcube.portal.social.networking.ws.utils.ErrorMessages; +import org.gcube.social_networking.socialnetworking.model.beans.SharedFolderBean; +import org.gcube.social_networking.socialnetworking.model.beans.WSAddedItemNotificationBean; +import org.gcube.social_networking.socialnetworking.model.beans.WSSharedFolderNotificationBean; +import org.gcube.social_networking.socialnetworking.model.beans.WorkspaceFileItemBean; +import org.gcube.social_networking.socialnetworking.model.beans.WorkspaceNotificationMessage; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.LoggerFactory; @@ -52,9 +57,9 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; */ @Path("2/notifications") @RequestHeaders ({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"), - @RequestHeader( name = "Content-Type", description = "application/json") - }) + @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"), + @RequestHeader( name = "Content-Type", description = "application/json") +}) public class Notifications { // Logger @@ -160,23 +165,23 @@ public class Notifications { } /** - * Send a JOB notification to a given recipient - * @param job The job bean + * Send a Workspace notification to a given user + * @param message * @return * @throws ValidationException */ @POST - @Path("notify/") + @Path("notify-ws/") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Notification is sent correctly"), + @ResponseCode ( code = 200, condition = "Workspace Notification is sent correctly"), @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) - public Response notify( + public Response notifyWs( @NotNull(message="input is missing") @Valid - NotificationMessage message) throws ValidationException{ + WorkspaceNotificationMessage message) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); String context = ScopeProvider.instance.get(); @@ -185,12 +190,80 @@ public class Notifications { //invalid call return Response.status(Status.BAD_REQUEST).build(); } - - //TODO: call notification method - - return Response.ok().build(); + + ResponseBean responseBean = new ResponseBean(); + Status status = Status.OK; + + try{ + switch (message.getType()) { + case WP_ITEM_NEW: + WSAddedItemNotificationBean wpItemBean = (WSAddedItemNotificationBean) message.getBean(); + GCubeUser userRecipient = UserManagerWSBuilder.getInstance().getUserManager().getUserByUsername(wpItemBean.getUserIdToNotify()); + // notifications are sent by using the user allowed to use liferay's json apis + SocialNetworkingSite site = SocialNetworkingSiteFinder.getSocialNetworkingSiteFromScope(context); + GCubeUser senderUser = UserManagerWSBuilder.getInstance().getUserManager().getUserByEmail(LiferayJSONWsCredentials.getSingleton().getUser()); + SocialNetworkingUser user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), senderUser.getFullname(), senderUser.getUserAvatarURL()); + NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); + nm.notifyAddedItem(context, WorkspaceItemMapper.getFileItem(wpItemBean.getItem()), WorkspaceItemMapper.getSharedFolder(wpItemBean.getFolder())); + break; + + default: + break; + } + } catch(Exception e){ + logger.error("Unable to send job notification", e); + responseBean.setSuccess(false); + responseBean.setMessage(e.getMessage()); + status = Status.INTERNAL_SERVER_ERROR; + } + + return Response.status(status).entity(responseBean).build(); } - - - + + /** + * Send a Workspace notification to a given user + * @param userIdToNotify the user you want to notify + * @param newItem the new shared {@link SocialFileItem} instance + * @param sharedFolder the shared folder {@link SocialSharedFolder} instance + * @return + * @throws ValidationException + */ + @POST + @Path("notify-ws-item-new/") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @StatusCodes ({ + @ResponseCode ( code = 200, condition = "Workspace Notification is sent correctly"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + }) + public Response notifyWsItemNew( + @NotNull(message="input is missing") + @Valid + String userIdToNotify, + @NotNull(message="input is missing") + @Valid + WorkspaceFileItemBean fileItem) throws ValidationException{ + + Caller caller = AuthorizationProvider.instance.get(); + String context = ScopeProvider.instance.get(); + ResponseBean responseBean = new ResponseBean(); + Status status = Status.OK; + + try{ + // notifications are sent by using the user allowed to use liferay's json apis + SocialNetworkingSite site = SocialNetworkingSiteFinder.getSocialNetworkingSiteFromScope(context); + GCubeUser senderUser = UserManagerWSBuilder.getInstance().getUserManager().getUserByEmail(LiferayJSONWsCredentials.getSingleton().getUser()); + SocialNetworkingUser user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), senderUser.getFullname(), senderUser.getUserAvatarURL()); + NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); + nm.notifyAddedItem(context, WorkspaceItemMapper.getFileItem(fileItem), WorkspaceItemMapper.getSharedFolder(fileItem.getParent())); + } catch(Exception e){ + logger.error("Unable to send job notification", e); + responseBean.setSuccess(false); + responseBean.setMessage(e.getMessage()); + status = Status.INTERNAL_SERVER_ERROR; + } + return Response.status(status).entity(responseBean).build(); + } + + } diff --git a/src/main/java/org/gcube/portal/social/networking/ws/model/AddFileNotificationBean.java b/src/main/java/org/gcube/portal/social/networking/ws/model/AddFileNotificationBean.java deleted file mode 100644 index 9a02c47..0000000 --- a/src/main/java/org/gcube/portal/social/networking/ws/model/AddFileNotificationBean.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.gcube.portal.social.networking.ws.model; - -public class AddFileNotificationBean implements NotificationBean { - - private String filename; - - public AddFileNotificationBean(String filename) { - this.filename = filename; - } - - public String getFilename() { - return filename; - } - - -} diff --git a/src/main/java/org/gcube/portal/social/networking/ws/model/AddFolderNotificationBean.java b/src/main/java/org/gcube/portal/social/networking/ws/model/AddFolderNotificationBean.java deleted file mode 100644 index 13f202a..0000000 --- a/src/main/java/org/gcube/portal/social/networking/ws/model/AddFolderNotificationBean.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.gcube.portal.social.networking.ws.model; - -public class AddFolderNotificationBean implements NotificationBean { - - private String foldername; - - public AddFolderNotificationBean(String foldername) { - this.foldername = foldername; - } - - public String getFoldername() { - return foldername; - } - -} diff --git a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationBean.java b/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationBean.java deleted file mode 100644 index 410fe02..0000000 --- a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationBean.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.gcube.portal.social.networking.ws.model; - -interface NotificationBean { - -} diff --git a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationMessage.java b/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationMessage.java deleted file mode 100644 index be295da..0000000 --- a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationMessage.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.gcube.portal.social.networking.ws.model; - -public class NotificationMessage { - - private NotificationType type; - - private NotificationBean bean; - - public NotificationMessage(NotificationType type, NotificationBean bean) { - super(); - this.type = type; - this.bean = bean; - } - - public NotificationType getType() { - return type; - } - - public NotificationBean getBean() { - return bean; - } - - - -} diff --git a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationType.java b/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationType.java deleted file mode 100644 index fdb33c7..0000000 --- a/src/main/java/org/gcube/portal/social/networking/ws/model/NotificationType.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.gcube.portal.social.networking.ws.model; - -public enum NotificationType { - - AddFileToWS(AddFileNotificationBean.class), - AddFolderToWS(AddFolderNotificationBean.class); - - - Class beanClass; - - NotificationType(Class beanClass){ - this.beanClass = beanClass; - } - - - public Class getNotificationClass(){ - return this.beanClass; - } - -}