From a55ba31d9aded6004e5f15e7fe6e49f5b75a6466 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Wed, 22 Nov 2023 19:52:25 +0100 Subject: [PATCH] Social service - More REST API resoruces --- pom.xml | 2 +- .../networking/ws/methods/v2/Comments.java | 45 ++-- .../networking/ws/methods/v2/HashTags.java | 20 +- .../networking/ws/methods/v2/Invites.java | 6 +- .../networking/ws/methods/v2/Likes.java | 43 ++-- .../ws/methods/v2/Notifications.java | 220 +++++++++--------- .../networking/ws/methods/v2/Posts.java | 157 ++++++------- 7 files changed, 244 insertions(+), 249 deletions(-) diff --git a/pom.xml b/pom.xml index 6d630aa..cc3eba0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.gcube.tools maven-parent - 1.2.0 + 1.1.0 org.gcube.portal diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Comments.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Comments.java index 407f88d..6e48b98 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Comments.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Comments.java @@ -1,7 +1,6 @@ package org.gcube.portal.social.networking.ws.methods.v2; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; @@ -16,12 +15,10 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang.Validate; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; @@ -52,8 +49,8 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; */ @Path("2/comments") @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 Comments { @@ -62,20 +59,20 @@ public class Comments { /* * Retrieve the list of comments belonging to the post id (key) of the token in the related context - * @param key the key as in the POST JSON representation + * @param key the key as in the POST JSON representation * @pathExample /get-comments-by-post-id?key=9ea137e9-6606-45ff-a1a2-94d4e8760583 - * @return the list of comments belonging to the post identified by the key in the context identified by the token + * @return the list of comments belonging to the post identified by the key in the context identified by the token */ @GET @Produces(MediaType.APPLICATION_JSON) @Path("get-comments-by-post-id") @StatusCodes ({ - @ResponseCode ( code = 200, condition = "The list of comments is put into the 'result' field"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "The list of comments is put into the 'result' field"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllCommentsByPostId( @NotNull - @QueryParam("key") + @QueryParam("key") String key) { ResponseBean responseBean = new ResponseBean(); @@ -108,8 +105,8 @@ public class Comments { @Produces(MediaType.APPLICATION_JSON) @Path("get-comments-user") @StatusCodes ({ - @ResponseCode ( code = 200, condition = "The list of comments is put into the 'result' field"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "The list of comments is put into the 'result' field"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getCommentsUser() { @@ -143,10 +140,10 @@ public class Comments { @Produces(MediaType.APPLICATION_JSON) @Path("get-comments-user-by-time") public Response getCommentsUserByTime( - @QueryParam("time") - @Min(value = 0, message="time cannot be negative") + @QueryParam("time") + @Min(value = 0, message="time cannot be negative") long timeInMillis - ) throws ValidationException{ + ) throws ValidationException{ ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; @@ -182,12 +179,12 @@ public class Comments { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Successfull created, the new comment is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Successfull created, the new comment is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response writeComment( - @NotNull(message="Comment to write is missing") - @Valid + @NotNull(message="Comment to write is missing") + @Valid CommentInputBean comment) throws ValidationException { Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); @@ -223,7 +220,7 @@ public class Comments { responseBean.setSuccess(false); status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(responseBean).build(); - } + } catch(Exception e) { logger.error("Unable to write comment", e); responseBean.setMessage("Could not reach the DB to write the comment, something went wrong"); @@ -235,14 +232,16 @@ public class Comments { + + //lib api @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("add-comment-lib") public Response addCommentLib(@NotNull(message="Comment to write is missing") - @Valid - Comment comment)throws ValidationException { + @Valid + Comment comment)throws ValidationException { ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; try { @@ -396,4 +395,6 @@ public class Comments { } return Response.status(status).entity(responseBean).build(); } + + } diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/HashTags.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/HashTags.java index 7964e22..29f97ea 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/HashTags.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/HashTags.java @@ -1,7 +1,5 @@ package org.gcube.portal.social.networking.ws.methods.v2; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -10,18 +8,14 @@ import javax.validation.ValidationException; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.ws.rs.*; -import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang.Validate; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portal.databook.server.DatabookStore; -import org.gcube.portal.databook.shared.Comment; -import org.gcube.portal.databook.shared.Feed; import org.gcube.portal.databook.shared.Post; import org.gcube.portal.social.networking.liferay.ws.GroupManagerWSBuilder; import org.gcube.portal.social.networking.ws.outputs.ResponseBean; @@ -39,9 +33,9 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; */ @Path("2/hashtags") @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 HashTags { // Logger @@ -51,8 +45,8 @@ public class HashTags { @Path("get-hashtags-and-occurrences/") @Produces({MediaType.APPLICATION_JSON}) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Hashtags and occurrences retrieved, reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Hashtags and occurrences retrieved, reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) /** * @return hashtags in the context bound to the auth token @@ -103,7 +97,7 @@ public class HashTags { @NotNull(message="hashtag to save is missing") @Valid List hashtags - ) throws ValidationException{ + ) throws ValidationException { ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; try{ @@ -281,6 +275,7 @@ public class HashTags { @QueryParam("hashtag") String hashtag ) throws ValidationException { + hashtag = "#" + hashtag; ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; @@ -300,4 +295,5 @@ public class HashTags { } return Response.status(status).entity(responseBean).build(); } + } diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Invites.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Invites.java index 5ea067b..5f19698 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Invites.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Invites.java @@ -41,9 +41,9 @@ public class Invites { @QueryParam("email") String email ) throws ValidationException{ - ResponseBean responseBean = new ResponseBean(); - Status status = Status.OK; - String inv = null; + ResponseBean responseBean = new ResponseBean(); + Status status = Status.OK; + String inv = null; try{ logger.info("Retrieving invite for vre " + vreid); diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Likes.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Likes.java index 6570596..a247f11 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Likes.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Likes.java @@ -1,12 +1,10 @@ package org.gcube.portal.social.networking.ws.methods.v2; -import java.util.ArrayList; import java.util.List; import javax.validation.Valid; import javax.validation.ValidationException; -import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -14,16 +12,13 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang.Validate; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.portal.databook.shared.Comment; import org.gcube.portal.databook.shared.Like; import org.gcube.portal.social.networking.ws.inputs.LikeInputBean; import org.gcube.portal.social.networking.ws.inputs.PostId; @@ -43,8 +38,8 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; */ @Path("2/likes") @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 Likes { @@ -53,20 +48,20 @@ public class Likes { /* * Retrieve the list of likes belonging to the post id (key) of the token in the related context - * @param key the key as in the POST JSON representation + * @param key the key as in the POST JSON representation * @pathExample /get-likes-by-post-id?key=9ea137e9-6606-45ff-a1a2-94d4e8760583 - * @return the list of likes belonging to the post identified by the key in the context identified by the token + * @return the list of likes belonging to the post identified by the key in the context identified by the token */ @GET @Produces(MediaType.APPLICATION_JSON) @Path("get-likes-by-post-id") @StatusCodes ({ - @ResponseCode ( code = 200, condition = "The list of likes is put into the 'result' field"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "The list of likes is put into the 'result' field"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllLikesByPostId( @NotNull - @QueryParam("key") + @QueryParam("key") String key) { ResponseBean responseBean = new ResponseBean(); @@ -93,8 +88,8 @@ public class Likes { /** * Create a new like to a post in the context of the token - * @param post The post id to be liked - * @return true if everything is OK + * @param postid The post id to be liked + * @return true if everything is OK * @throws ValidationException */ @POST @@ -102,12 +97,12 @@ public class Likes { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Successful created, the like operation result is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Successful created, the like operation result is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response like( - @NotNull(message="Post to like is missing") - @Valid + @NotNull(message="Post to like is missing") + @Valid PostId post) throws ValidationException { Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); @@ -130,10 +125,10 @@ public class Likes { responseBean.setSuccess(true); return Response.status(status).entity(responseBean).build(); } - + /** * Unlike to a post in the context of the token - * @param likeInputBean The post id to be liked + * @param postid The post id to be liked * @return true if everything is OK * @throws ValidationException */ @@ -142,12 +137,12 @@ public class Likes { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "The unlike operation result is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "The unlike operation result is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response unlike( - @NotNull(message="Post to unlike is missing") - @Valid + @NotNull(message="Post to unlike is missing") + @Valid LikeInputBean likeInputBean) throws ValidationException { Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); 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 aca7d05..3878235 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,7 +1,10 @@ package org.gcube.portal.social.networking.ws.methods.v2; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; import javax.validation.Valid; import javax.validation.ValidationException; @@ -14,12 +17,10 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang.Validate; import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; import org.gcube.applicationsupportlayer.social.NotificationsManager; import org.gcube.applicationsupportlayer.social.shared.SocialNetworkingSite; @@ -30,7 +31,10 @@ import org.gcube.common.authorization.library.provider.SecurityTokenProvider; 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.*; +import org.gcube.portal.databook.shared.Notification; +import org.gcube.portal.databook.shared.NotificationChannelType; +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; import org.gcube.portal.social.networking.caches.SocialNetworkingSiteFinder; @@ -77,8 +81,8 @@ 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 { @@ -97,15 +101,15 @@ public class Notifications { @Path("get-range-notifications/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Notifications retrieved and reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Notifications retrieved and reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getRangeNotifications( - @DefaultValue("1") @QueryParam("from") @Min(value=1, message="from must be greater or equal to 1") + @DefaultValue("1") @QueryParam("from") @Min(value=1, message="from must be greater or equal to 1") int from, - @DefaultValue("10") @QueryParam("quantity") @Min(value=0, message="quantity must be greater or equal to 0") + @DefaultValue("10") @QueryParam("quantity") @Min(value=0, message="quantity must be greater or equal to 0") int quantity - ) throws ValidationException{ + ) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); @@ -138,19 +142,19 @@ public class Notifications { * @responseExample application/json { "success": true, "message": null "result": true } * @param username the username you want to check * @return true if the notification for the user are disabled (Catalogue and Workspace ones) - * + * */ @GET @Path("is-user-disabled/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "true if the notification for the username given as query param are disabled (Catalogue and Workspace ones), false otherwise"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "true if the notification for the username given as query param are disabled (Catalogue and Workspace ones), false otherwise"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) @AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=AuthException.class) public Response isUserDisabled( - @QueryParam("username") @NotNull(message="username cannot be null") + @QueryParam("username") @NotNull(message="username cannot be null") String username) throws ValidationException{ ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; @@ -185,8 +189,8 @@ public class Notifications { // }) // @AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=AuthException.class) // public Response setUserNotifications( -// @NotNull(message="input is missing") -// @Valid +// @NotNull(message="input is missing") +// @Valid // UserSetNotificationBean setting) throws ValidationException{ // // Caller caller = AuthorizationProvider.instance.get(); @@ -219,10 +223,10 @@ public class Notifications { // } /** - * @deprecated + * @deprecated * @param usernameToCheck * @return true if notification are enabled for this user - * @throws IOException + * @throws IOException */ private boolean isNotificationEnabled(String usernameToCheck) throws IOException { // MemcachedClient entries = new DistributedCacheClient().getMemcachedClient(); @@ -235,12 +239,12 @@ public class Notifications { return true; } // /** -// * +// * // * @param username the user you want to disable or enable notifications (max 29 days) // * @param callerId the username or clientid of the operation executor // * @param disable true if you want to disable the notifications for this user // * @return true if the operation was performed -// * @throws IOException +// * @throws IOException // */ // private Boolean setUserNotificationsOnOff(String username, boolean disable, String callerId) throws IOException { // MemcachedClient entries = new DistributedCacheClient().getMemcachedClient(); @@ -273,12 +277,12 @@ public class Notifications { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Notification is sent correctly"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Notification is sent correctly"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response notifyJobStatus( - @NotNull(message="input is missing") - @Valid + @NotNull(message="input is missing") + @Valid JobNotificationBean job) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); @@ -329,12 +333,12 @@ public class Notifications { @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) + @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 + @NotNull(message="input is missing") + @Valid CatalogueEvent event) throws ValidationException, UserManagementSystemException, UserRetrievalFault{ Caller caller = AuthorizationProvider.instance.get(); @@ -350,14 +354,14 @@ public class Notifications { SecurityTokenProvider.instance.set(LiferayJSONWsCredentials.getSingleton().getNotifierUserToken()); username = jarvis.getUsername(); fullName = caller.getClient().getId().replace("service-account-", ""); // the actual name of the IAM Client - senderUser = um.getUserByUsername(username); + senderUser = um.getUserByUsername(username); user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), fullName, senderUser.getUserAvatarURL()); }else{ username = caller.getClient().getId(); - senderUser = um.getUserByUsername(username); + senderUser = um.getUserByUsername(username); user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), senderUser.getFullname(), senderUser.getUserAvatarURL()); - } - + } + String context = ScopeProvider.instance.get(); logger.debug("catalogue notifications from user = " + username); @@ -367,9 +371,9 @@ public class Notifications { try { logger.debug("catalogue notifications type is " + event.getType()); SocialNetworkingSite site = SocialNetworkingSiteFinder.getSocialNetworkingSiteFromScope(context); - - - NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); + + + NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); String[] idsToNotify = event.getIdsToNotify(); if (! event.idsAsGroup()) { @@ -378,7 +382,7 @@ public class Notifications { if (isNotificationEnabled(userIdToNotify)) { String username2Notify = null; try { - username2Notify = um.getUserByUsername(userIdToNotify).getUsername(); + username2Notify = um.getUserByUsername(userIdToNotify).getUsername(); } catch (Exception e) { status = Status.BAD_REQUEST; @@ -388,14 +392,14 @@ public class Notifications { return Response.status(status).entity(responseBean).build(); } - deliveryResult = + deliveryResult = nm.notifyCatalogueEvent( - CatalogueEventTypeMapper.getType(event.getType()), - username2Notify, - event.getItemId(), - event.getNotifyText(), + CatalogueEventTypeMapper.getType(event.getType()), + username2Notify, + event.getItemId(), + event.getNotifyText(), event.getItemURL()); - } + } else { Log.info("Notification disabled (admin) for user "+userIdToNotify + " will not notify"); } @@ -416,20 +420,20 @@ public class Notifications { String[] userIdsToNotify = getUsernamesByContext(scope).toArray(new String[0]); //resolve the members for (int j = 0; j < userIdsToNotify.length; j++) { String userIdToNotify = userIdsToNotify[j]; - if (isNotificationEnabled(userIdToNotify)) { - deliveryResult = + if (isNotificationEnabled(userIdToNotify)) { + deliveryResult = nm.notifyCatalogueEvent( - CatalogueEventTypeMapper.getType(event.getType()), - userIdToNotify, - event.getItemId(), - event.getNotifyText(), + CatalogueEventTypeMapper.getType(event.getType()), + userIdToNotify, + event.getItemId(), + event.getNotifyText(), event.getItemURL()); } else { Log.info("Notification disabled (admin) for user "+userIdToNotify + " will not notify"); } } } - } + } catch(IllegalArgumentException e) { status = Status.BAD_REQUEST; logger.error("Context not valid", e); @@ -469,12 +473,12 @@ public class Notifications { @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) + @ResponseCode ( code = 200, condition = "Workspace Notification is sent correctly"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response workspace( - @NotNull(message="input is missing") - @Valid + @NotNull(message="input is missing") + @Valid WorkspaceEvent event) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); @@ -498,23 +502,23 @@ public class Notifications { SecurityTokenProvider.instance.set(LiferayJSONWsCredentials.getSingleton().getNotifierUserToken()); username = jarvis.getUsername(); fullName = caller.getClient().getId().replace("service-account-", ""); // the actual name of the IAM Client - senderUser = um.getUserByUsername(username); + senderUser = um.getUserByUsername(username); user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), fullName, senderUser.getUserAvatarURL()); }else{ username = caller.getClient().getId(); - senderUser = um.getUserByUsername(username); + senderUser = um.getUserByUsername(username); user = new SocialNetworkingUser(senderUser.getUsername(), senderUser.getEmail(), senderUser.getFullname(), senderUser.getUserAvatarURL()); - } - NotificationsManager nm = new ApplicationNotificationsManager(UserManagerWSBuilder.getInstance().getUserManager(), site, context, user); + } + 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]; - if (isNotificationEnabled(userIdToNotify)) { + if (isNotificationEnabled(userIdToNotify)) { String username2Notify = ""; try { - username2Notify = um.getUserByUsername(userIdToNotify).getUsername(); + username2Notify = um.getUserByUsername(userIdToNotify).getUsername(); } catch (Exception e) { status = Status.NOT_ACCEPTABLE; @@ -544,14 +548,14 @@ public class Notifications { String[] userIdsToNotify = getUsernamesByContext(scope).toArray(new String[0]); //resolve the members for (int j = 0; j < userIdsToNotify.length; j++) { String userIdToNotify = userIdsToNotify[j]; - if (isNotificationEnabled(userIdToNotify)) + if (isNotificationEnabled(userIdToNotify)) deliveryResult = notifyWorkspaceEvent(event, nm, userIdToNotify); else { Log.info("Notification disabled (admin) for user "+userIdToNotify + " will not notify"); } } } - } + } catch(IllegalArgumentException e) { status = Status.BAD_REQUEST; logger.error("Context not valid", e); @@ -580,7 +584,7 @@ public class Notifications { return Response.status(status).entity(responseBean).build(); } /** - * + * * @param event * @param nm * @param idToNotify @@ -589,49 +593,49 @@ public class Notifications { private boolean notifyWorkspaceEvent(WorkspaceEvent event, NotificationsManager nm, String idToNotify) { try { switch (event.getType()) { - case ITEM_NEW: { - AddedItemEvent itemBean = (AddedItemEvent) event; - return nm.notifyAddedItem(idToNotify, WorkspaceItemMapper.getFileItem(itemBean.getItem()), WorkspaceItemMapper.getSharedFolder(itemBean.getItem().getParent())); - } - case ITEM_UPDATE: { - UpdatedItemEvent itemBean = (UpdatedItemEvent) event; - return nm.notifyUpdatedItem(idToNotify, WorkspaceItemMapper.getFileItem(itemBean.getItem()), WorkspaceItemMapper.getSharedFolder(itemBean.getItem().getParent())); - } - case ITEM_DELETE: { - DeletedItemEvent itemBean = (DeletedItemEvent) event; - return nm.notifyRemovedItem(idToNotify, itemBean.getItemName(), WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); - } - case FOLDER_SHARE: { - SharedFolderEvent itemBean = (SharedFolderEvent) event; - return nm.notifyFolderSharing(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); - } - case FOLDER_UNSHARE: { - UnsharedFolderEvent itemBean = (UnsharedFolderEvent) event; - return nm.notifyFolderUnsharing(idToNotify, itemBean.getUnsharedFolderId(), itemBean.getUnsharedFolderName()); - } - case FOLDER_RENAME: { - RenamedFolderEvent itemBean = (RenamedFolderEvent) event; - return nm.notifyFolderRenaming(idToNotify, itemBean.getPreviousName(), itemBean.getNewName(), itemBean.getRenamedFolderId()); - } - case FOLDER_ADMIN_UPGRADE: { - FolderAdminUpgradeEvent itemBean = (FolderAdminUpgradeEvent) event; - return nm.notifyAdministratorUpgrade(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); - } - case FOLDER_ADMIN_DOWNGRADE: { - FolderAdminDowngradeEvent itemBean = (FolderAdminDowngradeEvent) event; - return nm.notifyAdministratorDowngrade(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); - } - case FOLDER_ADDEDUSER: { - FolderAddedUserEvent itemBean = (FolderAddedUserEvent) event; - UserManager userManager = UserManagerWSBuilder.getInstance().getUserManager(); - return nm.notifyFolderAddedUsers(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder()), itemBean.getNewAddedUserIds(), userManager); - } - case FOLDER_REMOVEDUSER: { - FolderRemovedUserEvent itemBean = (FolderRemovedUserEvent) event; - return nm.notifyFolderRemovedUser(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); - } - default: - break; + case ITEM_NEW: { + AddedItemEvent itemBean = (AddedItemEvent) event; + return nm.notifyAddedItem(idToNotify, WorkspaceItemMapper.getFileItem(itemBean.getItem()), WorkspaceItemMapper.getSharedFolder(itemBean.getItem().getParent())); + } + case ITEM_UPDATE: { + UpdatedItemEvent itemBean = (UpdatedItemEvent) event; + return nm.notifyUpdatedItem(idToNotify, WorkspaceItemMapper.getFileItem(itemBean.getItem()), WorkspaceItemMapper.getSharedFolder(itemBean.getItem().getParent())); + } + case ITEM_DELETE: { + DeletedItemEvent itemBean = (DeletedItemEvent) event; + return nm.notifyRemovedItem(idToNotify, itemBean.getItemName(), WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); + } + case FOLDER_SHARE: { + SharedFolderEvent itemBean = (SharedFolderEvent) event; + return nm.notifyFolderSharing(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); + } + case FOLDER_UNSHARE: { + UnsharedFolderEvent itemBean = (UnsharedFolderEvent) event; + return nm.notifyFolderUnsharing(idToNotify, itemBean.getUnsharedFolderId(), itemBean.getUnsharedFolderName()); + } + case FOLDER_RENAME: { + RenamedFolderEvent itemBean = (RenamedFolderEvent) event; + return nm.notifyFolderRenaming(idToNotify, itemBean.getPreviousName(), itemBean.getNewName(), itemBean.getRenamedFolderId()); + } + case FOLDER_ADMIN_UPGRADE: { + FolderAdminUpgradeEvent itemBean = (FolderAdminUpgradeEvent) event; + return nm.notifyAdministratorUpgrade(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); + } + case FOLDER_ADMIN_DOWNGRADE: { + FolderAdminDowngradeEvent itemBean = (FolderAdminDowngradeEvent) event; + return nm.notifyAdministratorDowngrade(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); + } + case FOLDER_ADDEDUSER: { + FolderAddedUserEvent itemBean = (FolderAddedUserEvent) event; + UserManager userManager = UserManagerWSBuilder.getInstance().getUserManager(); + return nm.notifyFolderAddedUsers(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder()), itemBean.getNewAddedUserIds(), userManager); + } + case FOLDER_REMOVEDUSER: { + FolderRemovedUserEvent itemBean = (FolderRemovedUserEvent) event; + return nm.notifyFolderRemovedUser(idToNotify, WorkspaceItemMapper.getSharedFolder(itemBean.getFolder())); + } + default: + break; } } catch(Exception e){ logger.error("Unable to send job notification", e); @@ -640,7 +644,7 @@ public class Notifications { return false; } /** - * + * * @param context * @return * @throws Exception @@ -672,6 +676,7 @@ public class Notifications { + //library api @POST @Consumes(MediaType.APPLICATION_JSON) @@ -970,4 +975,5 @@ public class Notifications { } return Response.status(status).entity(responseBean).build(); } + } diff --git a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Posts.java b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Posts.java index 7419441..e791b99 100644 --- a/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Posts.java +++ b/src/main/java/org/gcube/portal/social/networking/ws/methods/v2/Posts.java @@ -2,7 +2,6 @@ package org.gcube.portal.social.networking.ws.methods.v2; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -17,12 +16,10 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang.Validate; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.authorization.library.utils.Caller; import org.gcube.common.scope.api.ScopeProvider; @@ -32,7 +29,6 @@ import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException; import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException; import org.gcube.portal.databook.shared.ex.FeedTypeNotFoundException; import org.gcube.portal.databook.shared.ex.PrivacyLevelTypeNotFoundException; -import org.gcube.portal.social.networking.ws.inputs.PostId; import org.gcube.portal.social.networking.ws.inputs.PostInputBean; import org.gcube.portal.social.networking.ws.outputs.ResponseBean; import org.gcube.portal.social.networking.ws.utils.CassandraConnection; @@ -51,14 +47,14 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; */ @Path("2/posts") @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 Posts { // Logger private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Posts.class); - + /** * Retrieve posts of the auth token's owner, and allow to filter them by time" * @param timeInMillis The reference time since when retrieving posts @@ -69,13 +65,13 @@ public class Posts { @Path("get-posts-user-since/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getRecentPostsByUserAndDate( - @QueryParam("time") @Min(value = 0, message="time cannot be negative") + @QueryParam("time") @Min(value = 0, message="time cannot be negative") long timeInMillis - ) throws ValidationException{ + ) throws ValidationException{ ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; @@ -102,8 +98,8 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - - + + /** * Retrieve all user's posts * @return all posts of the auth token's owner in the context identified by the token @@ -112,8 +108,8 @@ public class Posts { @Path("get-posts-user/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllPostsByUser() { @@ -140,7 +136,7 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - + /** * Retrieve a post by id * @return the post if the post id belongs to a post in the context identified by the token @@ -149,18 +145,18 @@ public class Posts { @Path("get-post/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getPost(@QueryParam("id") String id) { - String context = ScopeProvider.instance.get(); + String context = ScopeProvider.instance.get(); Caller caller = AuthorizationProvider.instance.get(); ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; List posts = new ArrayList<>(); try{ logger.debug("Retrieving post with id " + id); - try { + try { posts.add(CassandraConnection.getInstance().getDatabookStore().readPost(id)); } catch(FeedIDNotFoundException e){ responseBean.setMessage("The post with id " + id + " does not exist in context " + context); @@ -187,7 +183,7 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - + /** * Retrieve a given quantity of latest user's posts * @param quantity the number of latest post to get @@ -199,13 +195,13 @@ public class Posts { @Path("get-posts-user-quantity/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successful retrieval of posts, reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getQuantityPostsByUser( - @DefaultValue("10") - @QueryParam("quantity") - @Min(value=0, message="quantity cannot be negative") + @DefaultValue("10") + @QueryParam("quantity") + @Min(value=0, message="quantity cannot be negative") int quantity) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); @@ -241,7 +237,7 @@ public class Posts { } return Response.status(status).entity(responseBean).build(); } - + /** * Create a new user post having as owner the auth token's owner * @param post The post to be written @@ -253,12 +249,12 @@ public class Posts { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response writePostUser( - @NotNull(message="Post to write is missing") - @Valid + @NotNull(message="Post to write is missing") + @Valid PostInputBean post) throws ValidationException{ logger.debug("Request of writing a feed coming from user " + post); @@ -288,15 +284,15 @@ public class Posts { logger.debug("Trying to share user post..."); Post res = SocialUtils.shareUserUpdate( username, - postText, - context, + postText, + context, previewTitle, previewDescription, previewHost, previewUrl, - httpImageUrl, + httpImageUrl, enableNotification - ); + ); if(res != null){ logger.debug("Post correctly written by user " + username); @@ -313,7 +309,7 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - + /** * Retrieve the application's posts * @return the application (IAM Client) posts belonging to the token's owner (i.e., an application)" @@ -322,9 +318,9 @@ public class Posts { @Path("get-posts-app/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 403, condition = "\"There is no application profile with such token"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 403, condition = "\"There is no application profile with such token"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllPostsByApp() { @@ -364,7 +360,7 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - + /** * Create a new application post having as owner-application the token's owner (the IAM Client), note that the application must be registered on the Information System * @param post The post to be written @@ -375,13 +371,13 @@ public class Posts { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), - @ResponseCode ( code = 403, condition = "\"There is no application profile with such token"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successfull created, the new post is reported in the 'result' field of the returned object"), + @ResponseCode ( code = 403, condition = "\"There is no application profile with such token"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response writePostApp( - @NotNull(message="Post to write is null") - @Valid + @NotNull(message="Post to write is null") + @Valid PostInputBean post){ Caller caller = AuthorizationProvider.instance.get(); @@ -419,15 +415,15 @@ public class Posts { // write post + notification if it is the case Post written = SocialUtils.shareApplicationUpdate( - postText, - params, - previewTitle, - previewDescription, - httpImageUrl, - appProfile, + postText, + params, + previewTitle, + previewDescription, + httpImageUrl, + appProfile, caller, enableNotification - ); + ); if(written != null){ responseBean.setResult(written); @@ -443,15 +439,15 @@ public class Posts { } /** - * + * * @return all the posts in the context bound to the auth token */ @GET @Path("get-posts-vre/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllPostsByVRE() { @@ -478,28 +474,28 @@ public class Posts { /** * return the most recent posts for this vre up to quantity param and the last index of the posts in the timeline * lastReturnedPostTimelineIndex is useful to know from where to start the range the next time you ask, because there are deletions - * + * * @param from the range start (most recent feeds for this vre) has to be greater than 0 * @param quantity the number of most recent feeds for this vre starting from "from" param * @pathExample /get-recent-posts-vre-by-range?from=1&quantity=10 * @return a RangePosts containing of most recent feeds for this vre - * @throws FeedTypeNotFoundException - * @throws PrivacyLevelTypeNotFoundException - * @throws ColumnNameNotFoundException + * @throws FeedTypeNotFoundException + * @throws PrivacyLevelTypeNotFoundException + * @throws ColumnNameNotFoundException */ @GET @Path("get-recent-posts-vre-by-range/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getRecentPostsByVREAndRange( - @QueryParam("from") - @Min(value=1, message="from cannot be negative") + @QueryParam("from") + @Min(value=1, message="from cannot be negative") int from, - @QueryParam("quantity") - @Min(value=1, message="quantity cannot be negative") + @QueryParam("quantity") + @Min(value=1, message="quantity cannot be negative") int quantity) throws ValidationException { String context = ScopeProvider.instance.get(); @@ -533,12 +529,12 @@ public class Posts { @Path("get-posts-by-hashtag/") @Produces({MediaType.APPLICATION_JSON}) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Sccessfull retrieved posts, they are reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getPostsByHashTags( - @QueryParam("hashtag") - @NotNull(message="hashtag cannot be missing") + @QueryParam("hashtag") + @NotNull(message="hashtag cannot be missing") String hashtag) throws ValidationException { Caller caller = AuthorizationProvider.instance.get(); @@ -560,7 +556,7 @@ public class Posts { } return Response.status(status).entity(responseBean).build(); } - + /** * Retrieve ids (UUID) of the liked posts by the user * @return ids (UUID) of the liked posts by the user in the context bound to the auth token @@ -569,8 +565,8 @@ public class Posts { @Path("get-id-liked-posts/") @Produces({MediaType.APPLICATION_JSON}) @StatusCodes ({ - @ResponseCode ( code = 201, condition = "Sccessfull retrieved ids, they are reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 201, condition = "Sccessfull retrieved ids, they are reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllLikedPostIdsByUser() { @@ -599,7 +595,7 @@ public class Posts { return Response.status(status).entity(responseBean).build(); } - + /** * Retrieve posts liked by the user * @param limit The maximum number of posts to be retrieved @@ -610,13 +606,13 @@ public class Posts { @Path("get-liked-posts/") @Produces(MediaType.APPLICATION_JSON) @StatusCodes ({ - @ResponseCode ( code = 200, condition = "Successfull retrieved posts, they are reported in the 'result' field of the returned object"), - @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) + @ResponseCode ( code = 200, condition = "Successfull retrieved posts, they are reported in the 'result' field of the returned object"), + @ResponseCode ( code = 500, condition = ErrorMessages.ERROR_IN_API_RESULT) }) public Response getAllLikedPostsByUser( - @DefaultValue("10") - @QueryParam("limit") - @Min(message="limit cannot be negative", value = 0) + @DefaultValue("10") + @QueryParam("limit") + @Min(message="limit cannot be negative", value = 0) int limit) throws ValidationException{ Caller caller = AuthorizationProvider.instance.get(); @@ -646,6 +642,7 @@ public class Posts { + //library api @POST @Consumes(MediaType.APPLICATION_JSON) @@ -883,7 +880,7 @@ public class Posts { public Response getAllPostsByAppLib( @QueryParam("appid") String appid - ) throws ValidationException{ + ) throws ValidationException{ ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; try{ @@ -980,7 +977,7 @@ public class Posts { public Response getAllPostsByVRELib( @QueryParam("vreid") String vreid - ) throws ValidationException{ + ) throws ValidationException{ ResponseBean responseBean = new ResponseBean(); Status status = Status.OK; try{