From f7d2a1e569a51946e531f7d408b01425c69f8c0d Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Fri, 6 May 2022 17:15:24 +0200 Subject: [PATCH] added partial support for catalogue notifications --- .../ws/methods/v2/Notifications.java | 64 +++++++++++++++++++ .../networking/ws/methods/v2/Users.java | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) 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 447de18..b8fb07b 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 @@ -1,5 +1,6 @@ package org.gcube.portal.social.networking.ws.methods.v2; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -30,6 +31,7 @@ import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.portal.databook.shared.Notification; +import org.gcube.portal.databook.shared.NotificationType; import org.gcube.portal.databook.shared.RunningJob; import org.gcube.portal.notifications.bean.GenericItemBean; import org.gcube.portal.notifications.thread.JobStatusNotificationThread; @@ -44,6 +46,8 @@ 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.JobNotificationBean; + +import org.gcube.social_networking.socialnetworking.model.beans.catalogue.CatalogueEvent; import org.gcube.social_networking.socialnetworking.model.beans.workspace.WorkspaceEvent; import org.gcube.social_networking.socialnetworking.model.beans.workspace.AddedItemEvent; import org.gcube.social_networking.socialnetworking.model.beans.workspace.DeletedItemEvent; @@ -180,6 +184,66 @@ public class Notifications { return Response.status(status).entity(responseBean).build(); } + + /** + * Send a Catalogue notification to a given user + * @param event + * @return + * @throws ValidationException + */ + @POST + @Path("catalogue/") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @StatusCodes ({ + @ResponseCode ( code = 200, condition = "Catalogue Notification is sent correctly"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + }) + public Response catalogue( + @NotNull(message="input is missing") + @Valid + CatalogueEvent event) throws ValidationException{ + + Caller caller = AuthorizationProvider.instance.get(); + String context = ScopeProvider.instance.get(); + String username = caller.getClient().getId(); + + logger.debug("catalogue notifications from user = " + username); + ResponseBean responseBean = new ResponseBean(); + Status status = Status.OK; + boolean deliveryResult = false; + try { + logger.debug("catalogue notifications type is " + event.getType()); + SocialNetworkingSite site = SocialNetworkingSiteFinder.getSocialNetworkingSiteFromScope(context); + GCubeUser senderUser = UserManagerWSBuilder.getInstance().getUserManager().getUserByUsername(username); + SocialNetworkingUser user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), senderUser.getFullname(), senderUser.getUserAvatarURL()); + NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); + + String[] idsToNotify = event.getIdsToNotify(); + if (! event.idsAsGroup()) { + for (int i = 0; i < idsToNotify.length; i++) { + String userIdToNotify = idsToNotify[i]; + deliveryResult = nm.notifyCatalogueEvent(NotificationType.CAT_ITEM_PUBLISHED, userIdToNotify, event.getItemId(), event.getNotifyText(), event.getItemURL()); + } + } + } catch(Exception e){ + logger.error("Unable to send job notification", e); + responseBean.setSuccess(false); + responseBean.setMessage(e.getMessage()); + status = Status.INTERNAL_SERVER_ERROR; + } + logger.debug("catalogue notifications should have been sent"); + if (deliveryResult) { + responseBean.setSuccess(true); + responseBean.setMessage("catalogue notification delivered correctly"); + responseBean.setResult(new Boolean(true)); + } else { + responseBean.setSuccess(false); + responseBean.setMessage("An error occurred between this service and Cassandra DB, notification not delivered correctly"); + responseBean.setResult(new Boolean(false)); + } + return Response.status(status).entity(responseBean).build(); + } /** * Send a Workspace notification to a given user diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Users.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Users.java index c101cb7..6e3b130 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Users.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Users.java @@ -280,7 +280,7 @@ public class Users { ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; UserProfileExtendedWithVerifiedEmail userWithEmailVerified = null; - if(! (TokensUtils.isUserTokenDefault(caller) || TokensUtils.isUserTokenQualified(caller))){ + if(!TokensUtils.isUserToken(caller)){ status = Status.FORBIDDEN; responseBean.setMessage(NOT_USER_TOKEN_CONTEXT_USED); logger.warn("Trying to access users method via a token different than USER is not allowed");