Revision 53619
Added by Konstantina Galouni over 5 years ago
HelloWorldService.java | ||
---|---|---|
5 | 5 |
import eu.dnetlib.api.enabling.ISLookUpServiceException; |
6 | 6 |
import eu.dnetlib.data.claims.migration.ClaimValidationException; |
7 | 7 |
import eu.dnetlib.data.claims.migration.entity.Claim; |
8 |
import eu.dnetlib.data.claims.migration.handler.ClaimHandler;
|
|
9 |
import eu.dnetlib.data.claims.migration.handler.DirectIndexHandler;
|
|
10 |
import eu.dnetlib.data.claims.migration.handler.FetchClaimHandler;
|
|
11 |
import eu.dnetlib.data.claims.migration.handler.FetchProjectHandler;
|
|
8 |
import eu.dnetlib.data.claims.migration.entity.Notification;
|
|
9 |
import eu.dnetlib.data.claims.migration.entity.Project;
|
|
10 |
import eu.dnetlib.data.claims.migration.handler.*;
|
|
11 |
import eu.dnetlib.data.claimsDemo.CommunityUtils;
|
|
12 | 12 |
import eu.dnetlib.data.claimsDemo.SQLStoreException; |
13 | 13 |
import gr.uoa.di.driver.util.ServiceLocator; |
14 |
import net.sf.ehcache.search.expression.Not; |
|
14 | 15 |
import org.apache.commons.validator.EmailValidator; |
15 | 16 |
import org.apache.log4j.Logger; |
16 | 17 |
import org.json.XML; |
... | ... | |
24 | 25 |
import javax.ws.rs.core.MediaType; |
25 | 26 |
import javax.ws.rs.core.Response; |
26 | 27 |
import java.util.ArrayList; |
28 |
import java.util.HashMap; |
|
27 | 29 |
import java.util.List; |
30 |
import java.util.Map; |
|
28 | 31 |
|
29 | 32 |
/** |
30 | 33 |
* Created by kiatrop on 15/4/2016. |
... | ... | |
41 | 44 |
@Autowired |
42 | 45 |
private FetchProjectHandler fetchProjectHandler= null; |
43 | 46 |
|
47 |
@Autowired |
|
48 |
private FetchNotificationHandler fetchNotificationHandler = null; |
|
49 |
|
|
50 |
@Autowired |
|
51 |
private NotificationHandler notificationHandler = null; |
|
52 |
|
|
44 | 53 |
@Resource |
45 | 54 |
private ServiceLocator<ISLookUpService> lookupServiceLocator = null; |
46 | 55 |
|
... | ... | |
53 | 62 |
@Autowired |
54 | 63 |
public Authorization authorization = null; |
55 | 64 |
|
65 |
@Autowired |
|
66 |
private String defaultFrequencyInHours; |
|
56 | 67 |
|
57 | 68 |
@GET |
58 | 69 |
@Path("projects/{projectId}/claims") |
... | ... | |
105 | 116 |
} |
106 | 117 |
|
107 | 118 |
@GET |
119 |
@Path("projects/{projectId}/all_claims") |
|
120 |
@Produces(MediaType.APPLICATION_JSON) |
|
121 |
public Response getAllProjectClaims(@PathParam("projectId") String projectId, |
|
122 |
@DefaultValue("-1") @QueryParam("offset") int offset, |
|
123 |
@DefaultValue("-1") @QueryParam("limit") int limit, |
|
124 |
@DefaultValue("") @QueryParam("keyword") String keyword, |
|
125 |
@DefaultValue("") @QueryParam("sortby") String orderby, |
|
126 |
@DefaultValue("true") @QueryParam("descending") boolean descending, |
|
127 |
@DefaultValue("") @QueryParam("types") List<String> types, |
|
128 |
@HeaderParam("X-XSRF-TOKEN") String token, |
|
129 |
@CookieParam("AccessToken") String cookie, |
|
130 |
@Context HttpServletRequest request) { |
|
131 |
|
|
132 |
if(token == null || token.isEmpty() || cookie == null || cookie.isEmpty() || !cookie.equals(token)){ |
|
133 |
authorization.logStatus(token,cookie); |
|
134 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. Maybe you are not registered.")) |
|
135 |
.type(MediaType.APPLICATION_JSON) |
|
136 |
.build(); |
|
137 |
} |
|
138 |
|
|
139 |
UserInfo userInfo = authorization.getUserHandler().getUserInfo(token); |
|
140 |
// if(authorization.isProjectCurator(userInfo)) { |
|
141 |
String userMail = userInfo.getEmail(); |
|
142 |
|
|
143 |
int total = -1; |
|
144 |
|
|
145 |
if (projectId == null || projectId.isEmpty()) { |
|
146 |
return Response.status(Response.Status.BAD_REQUEST).entity(compose400Message("Project id cannot be empty.")) |
|
147 |
.type(MediaType.APPLICATION_JSON).build(); |
|
148 |
} |
|
149 |
|
|
150 |
List<Claim> claims = null; |
|
151 |
try { |
|
152 |
boolean forbidden = true; |
|
153 |
if(authorization.isProjectCurator(userInfo)) { |
|
154 |
forbidden = false; |
|
155 |
} else { |
|
156 |
List<String> contact_emails = fetchProjectHandler.fetchContactEmailsByProjectId(projectId); |
|
157 |
logger.debug(contact_emails); |
|
158 |
if(contact_emails != null && contact_emails.contains(userMail)) { |
|
159 |
forbidden = false; |
|
160 |
} |
|
161 |
} |
|
162 |
|
|
163 |
if(forbidden){ |
|
164 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access")) |
|
165 |
.type(MediaType.APPLICATION_JSON) |
|
166 |
.build(); |
|
167 |
}else{ |
|
168 |
if(offset == -1 && limit == -1) { |
|
169 |
// when offset and limit are -1 fetch claims with null values, to ignore paging and limit clause |
|
170 |
claims = fetchClaimHandler.fetchClaimsByProject(projectId, null, null, keyword, orderby, descending, types, true); |
|
171 |
} else { |
|
172 |
claims = fetchClaimHandler.fetchClaimsByProject(projectId, limit, offset, keyword, orderby, descending, types, true); |
|
173 |
} |
|
174 |
total = fetchClaimHandler.countClaimsByProject(projectId, keyword, types); |
|
175 |
|
|
176 |
return Response.status(200).entity(composeDataResponse(request, claims, total, offset, limit)).build(); |
|
177 |
} |
|
178 |
|
|
179 |
} catch (SQLStoreException|Exception e) { |
|
180 |
logger.error("Could not fetch claims for project with id " + projectId, e); |
|
181 |
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(compose500Message("Fail to fetch claims" + |
|
182 |
" for projects with id " + projectId + ".", e)).type(MediaType.APPLICATION_JSON).build(); |
|
183 |
} |
|
184 |
} |
|
185 |
/* |
|
186 |
@GET |
|
108 | 187 |
@Path("project/claims") |
109 | 188 |
@Produces(MediaType.APPLICATION_JSON) |
110 | 189 |
public Response getProjectClaimsByToken(@QueryParam("projectToken") String projectToken, |
... | ... | |
173 | 252 |
// .type(MediaType.APPLICATION_JSON) |
174 | 253 |
// .build(); |
175 | 254 |
} |
255 |
*/ |
|
256 |
|
|
176 | 257 |
@GET |
177 | 258 |
@Path("/contexts/{contextId}/claims") |
178 | 259 |
@Produces(MediaType.APPLICATION_JSON) |
... | ... | |
967 | 1048 |
.build(); |
968 | 1049 |
} |
969 | 1050 |
|
1051 |
@GET |
|
1052 |
@Path("/users/notification") |
|
1053 |
@Produces(MediaType.APPLICATION_JSON) |
|
1054 |
public Response getUserEmailNotificationPreferences(@QueryParam("communityId") String openaireId, |
|
1055 |
@HeaderParam("X-XSRF-TOKEN") String token, |
|
1056 |
@CookieParam("AccessToken") String cookie, |
|
1057 |
@Context HttpServletRequest request) { |
|
1058 |
|
|
1059 |
if(token == null || token.isEmpty() || cookie == null || cookie.isEmpty() || !cookie.equals(token)){ |
|
1060 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. Maybe you are not registered.")) |
|
1061 |
.type(MediaType.APPLICATION_JSON) |
|
1062 |
.build(); |
|
1063 |
} |
|
1064 |
|
|
1065 |
UserInfo userInfo = authorization.getUserHandler().getUserInfo(token); |
|
1066 |
if(authorization.isRegistered(userInfo)) { |
|
1067 |
String userMail = userInfo.getEmail(); |
|
1068 |
logger.debug("User is registerd " ); |
|
1069 |
|
|
1070 |
EmailValidator emailValidator = EmailValidator.getInstance(); |
|
1071 |
|
|
1072 |
if (userMail == null || userMail.isEmpty()) { |
|
1073 |
return Response.status(Response.Status.BAD_REQUEST).entity(compose400Message("User e-mail cannot be empty.")) |
|
1074 |
.type(MediaType.APPLICATION_JSON).build(); |
|
1075 |
} |
|
1076 |
|
|
1077 |
if (!emailValidator.isValid(userMail)) { |
|
1078 |
return Response.status(Response.Status.BAD_REQUEST).entity(compose400Message("User e-mail is not valid.")) |
|
1079 |
.type(MediaType.APPLICATION_JSON).build(); |
|
1080 |
} |
|
1081 |
|
|
1082 |
List<Notification> notifications = null; |
|
1083 |
try { |
|
1084 |
if(openaireId != null) { |
|
1085 |
CommunityUtils communityInfo = CommunityUtils.getCommunityInfo(openaireId); |
|
1086 |
if(communityInfo.getManagers().contains(userMail)) { |
|
1087 |
|
|
1088 |
Notification notification = null; |
|
1089 |
logger.debug("About to fetch notification"); |
|
1090 |
notification = fetchNotificationHandler.fetchNotification(openaireId, userMail); |
|
1091 |
|
|
1092 |
if (notifications == null) { |
|
1093 |
notifications = new ArrayList<Notification>(); |
|
1094 |
} |
|
1095 |
if (notification == null) { |
|
1096 |
notification = new Notification(openaireId, communityInfo.getName(), userMail, Integer.parseInt(defaultFrequencyInHours), true); |
|
1097 |
} else { |
|
1098 |
notification.setOpenaireName(communityInfo.getName()); |
|
1099 |
} |
|
1100 |
notifications.add(notification); |
|
1101 |
} |
|
1102 |
} else { |
|
1103 |
Map<String, String> projectIdsAndNames = fetchProjectHandler.fetchProjectIdsAndNamesByProjectManagerMail(userMail); |
|
1104 |
if(projectIdsAndNames != null) { |
|
1105 |
for (Map.Entry<String, String> projectIdAndName : projectIdsAndNames.entrySet()) { |
|
1106 |
Notification notification = null; |
|
1107 |
logger.debug("About to fetch notification"); |
|
1108 |
notification = fetchNotificationHandler.fetchNotification(projectIdAndName.getKey(), userMail); |
|
1109 |
|
|
1110 |
if (notifications == null) { |
|
1111 |
notifications = new ArrayList<Notification>(); |
|
1112 |
} |
|
1113 |
if(notification == null) { |
|
1114 |
notification = new Notification(projectIdAndName.getKey(), projectIdAndName.getValue(), userMail, Integer.parseInt(defaultFrequencyInHours), true); |
|
1115 |
} else { |
|
1116 |
notification.setOpenaireName(projectIdAndName.getValue()); |
|
1117 |
} |
|
1118 |
notifications.add(notification); |
|
1119 |
logger.debug(notification); |
|
1120 |
logger.debug("notification openaireId:"+notification.getOpenaireId()); |
|
1121 |
logger.debug(notifications.size()); |
|
1122 |
} |
|
1123 |
} |
|
1124 |
} |
|
1125 |
|
|
1126 |
} catch (SQLStoreException|Exception e) { |
|
1127 |
logger.error("Could not fetch notification preferences for user with mail " + userMail, e); |
|
1128 |
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(compose500Message("Fail to fetch notification preferences" + |
|
1129 |
" for user with e-mail " + userMail + ".", e)).type(MediaType.APPLICATION_JSON).build(); |
|
1130 |
} |
|
1131 |
|
|
1132 |
if (notifications == null || notifications.isEmpty()) { |
|
1133 |
return Response.status(204).entity(compose204Message("There are no notifications for user with mail " + userMail)).type(MediaType.APPLICATION_JSON).build(); |
|
1134 |
} |
|
1135 |
|
|
1136 |
return Response.status(200).entity(composeDataResponse(notifications)).build(); |
|
1137 |
|
|
1138 |
} |
|
1139 |
logger.debug("User is *NOT* registerd " ); |
|
1140 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. You are not registered.")) |
|
1141 |
.type(MediaType.APPLICATION_JSON) |
|
1142 |
.build(); |
|
1143 |
} |
|
1144 |
|
|
1145 |
@POST |
|
1146 |
@Path("/users/notification/save") |
|
1147 |
@Produces(MediaType.APPLICATION_JSON) |
|
1148 |
@Consumes(MediaType.APPLICATION_JSON) |
|
1149 |
public Response saveOrUpdateUserEmailNotificationPreferences(String input, @Context HttpServletRequest request, |
|
1150 |
@HeaderParam("X-XSRF-TOKEN") String token, |
|
1151 |
@HeaderParam("Origin") String origin, |
|
1152 |
@CookieParam("AccessToken") String cookie) { |
|
1153 |
|
|
1154 |
|
|
1155 |
if(token == null || token.isEmpty() || cookie == null || cookie.isEmpty() || !cookie.equals(token)|| !authorization.hasValidOrigin(origin)){ |
|
1156 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. Maybe you are not registered.")) |
|
1157 |
.type(MediaType.APPLICATION_JSON) |
|
1158 |
.build(); |
|
1159 |
} |
|
1160 |
UserInfo userInfo = authorization.getUserHandler().getUserInfo(token); |
|
1161 |
if (authorization.isRegistered(userInfo)) { |
|
1162 |
ArrayList<String> insertedIds = new ArrayList<String>(); |
|
1163 |
JsonArray errorInClaims = new JsonArray(); |
|
1164 |
int code200 = 0; |
|
1165 |
int code400 = 0; |
|
1166 |
int code500 = 0; |
|
1167 |
JsonObject jsonObject = new JsonParser().parse(input).getAsJsonObject(); |
|
1168 |
|
|
1169 |
String userMail =userInfo.getEmail(); |
|
1170 |
|
|
1171 |
String openaireId = jsonObject.get("openaireId").getAsString(); |
|
1172 |
logger.info("openaireId " + openaireId); |
|
1173 |
|
|
1174 |
boolean notify = jsonObject.get("notify").getAsBoolean(); |
|
1175 |
logger.info("notify "+notify); |
|
1176 |
|
|
1177 |
int frequency = jsonObject.get("frequency").getAsInt(); |
|
1178 |
logger.info("frequency " + frequency); |
|
1179 |
|
|
1180 |
EmailValidator emailValidator = EmailValidator.getInstance(); |
|
1181 |
if (!emailValidator.isValid(userMail)) { |
|
1182 |
jsonObject.addProperty("error", "user"); |
|
1183 |
return Response.status(Response.Status.BAD_REQUEST).entity(compose400Message("User e-mail is invalid.")) |
|
1184 |
.type(MediaType.APPLICATION_JSON).build(); |
|
1185 |
} |
|
1186 |
|
|
1187 |
try { |
|
1188 |
boolean continueProcedure = false; |
|
1189 |
List<String> managers = null; |
|
1190 |
try { |
|
1191 |
managers = fetchProjectHandler.fetchContactEmailsByProjectId(openaireId); |
|
1192 |
} catch (Exception e) { |
|
1193 |
e.printStackTrace(); |
|
1194 |
} catch (SQLStoreException e) { |
|
1195 |
e.printStackTrace(); |
|
1196 |
} |
|
1197 |
if(managers != null && managers.contains(userMail)) { |
|
1198 |
continueProcedure = true; |
|
1199 |
} else { |
|
1200 |
CommunityUtils communityInfo = CommunityUtils.getCommunityInfo(openaireId); |
|
1201 |
if(communityInfo.getManagers().contains(userMail)) { |
|
1202 |
continueProcedure = true; |
|
1203 |
} |
|
1204 |
} |
|
1205 |
|
|
1206 |
if(continueProcedure) { |
|
1207 |
Notification notification = null; |
|
1208 |
logger.debug("About to fetch notification"); |
|
1209 |
notification = fetchNotificationHandler.fetchNotification(openaireId, userMail); |
|
1210 |
|
|
1211 |
if (notification == null) { |
|
1212 |
logger.debug("About to insert notification"); |
|
1213 |
notificationHandler.buildAndInsertNotification(openaireId, userMail, frequency, notify); |
|
1214 |
} else { |
|
1215 |
logger.debug("About to update notification"); |
|
1216 |
notificationHandler.updateNotificationPreferences(openaireId, userMail, frequency, notify); |
|
1217 |
} |
|
1218 |
} else { |
|
1219 |
Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. You are not registered.")) |
|
1220 |
.type(MediaType.APPLICATION_JSON) |
|
1221 |
.build(); |
|
1222 |
} |
|
1223 |
} catch (SQLStoreException|Exception e) { |
|
1224 |
logger.error("Could not save or update notification preferences for user with mail " + userMail, e); |
|
1225 |
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(compose500Message("Fail to fetch notification preferences" + |
|
1226 |
" for user with e-mail " + userMail + ".", e)).type(MediaType.APPLICATION_JSON).build(); |
|
1227 |
} |
|
1228 |
|
|
1229 |
return Response.status(200).entity(compose204Message("Save or Update for notification successful")).type(MediaType.APPLICATION_JSON).build(); |
|
1230 |
} |
|
1231 |
return Response.status(Response.Status.FORBIDDEN).entity(compose403Message("Forbidden: You don't have permission to access. You are not registered.")) |
|
1232 |
.type(MediaType.APPLICATION_JSON) |
|
1233 |
.build(); |
|
1234 |
} |
|
1235 |
|
|
970 | 1236 |
private String xml2Json(List<String> input) { |
971 | 1237 |
StringBuilder builder = new StringBuilder(); |
972 | 1238 |
for(String category: input) { |
... | ... | |
975 | 1241 |
return builder.toString(); |
976 | 1242 |
} |
977 | 1243 |
|
1244 |
private String compose204Message(String message) { |
|
1245 |
return "{ \"status\" : \"error\", \"code\" : \"204\", \"message\" : \" " + message +" \" }"; |
|
1246 |
} |
|
1247 |
|
|
978 | 1248 |
private String compose400Message(String message) { |
979 | 1249 |
return "{ \"status\" : \"error\", \"code\" : \"400\", \"message\" : \" " + message +" \" }"; |
980 | 1250 |
} |
... | ... | |
1063 | 1333 |
return " { \"status\" : \"success\", \"code\": \"200\", " + "\"data\" : " + new Gson().toJson(claim) + " }"; |
1064 | 1334 |
} |
1065 | 1335 |
|
1336 |
private String composeDataResponse(List<Notification> notifications) { |
|
1337 |
return " { \"status\" : \"success\", \"code\": \"200\", " + "\"data\" : " + new Gson().toJson(notifications) + " }"; |
|
1338 |
} |
|
1339 |
|
|
1066 | 1340 |
private static String composePaging(HttpServletRequest request, int total, int currentOffset, int limit) { |
1067 | 1341 |
logger.info("total " + total); |
1068 | 1342 |
logger.info("currentOffset " + currentOffset); |
Also available in: Unified diff
1. HelloWorldService.java:
a. replace method 'project/claims', with method 'projects/{projectId}/all_claims' (no token but projectId)
b. add method '/users/notification' to get user email preferences from 'notification' table
c. add method '/users/notification/save' to insert a new notification entry or update an existing in 'notification' table
d. add 'compose204Message(String message)' and 'composeDataResponse(List<Notification> notifications)' functions
2. pom.xml: Add dependency with groupId: eu.dnetlib - artifactId: uoa-claims - version: 2.0.1-SNAPSHOT