Project

General

Profile

1
package eu.dnetlib.uoaorcidservice.controllers;
2

    
3
import com.google.gson.Gson;
4
import com.google.gson.GsonBuilder;
5
import eu.dnetlib.uoaorcidservice.configuration.properties.OrcidConfig;
6
import eu.dnetlib.uoaorcidservice.entities.ResultIdAndWork;
7
import eu.dnetlib.uoaorcidservice.entities.UserTokens;
8
import eu.dnetlib.uoaorcidservice.entities.Work;
9
import eu.dnetlib.uoaorcidservice.handlers.ConflictException;
10
import eu.dnetlib.uoaorcidservice.handlers.ForbiddenException;
11
import eu.dnetlib.uoaorcidservice.services.UserTokensService;
12
import eu.dnetlib.uoaorcidservice.services.WorkService;
13
import org.apache.log4j.Logger;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.data.util.Pair;
16
import org.springframework.http.*;
17
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
18
import org.springframework.security.access.AccessDeniedException;
19
import org.springframework.security.access.AuthorizationServiceException;
20
import org.springframework.security.access.prepost.PreAuthorize;
21
import org.springframework.web.bind.annotation.*;
22
import org.springframework.web.client.DefaultResponseErrorHandler;
23
import org.springframework.web.client.RestTemplate;
24
import org.springframework.web.util.UriComponentsBuilder;
25

    
26
import javax.crypto.BadPaddingException;
27
import javax.crypto.IllegalBlockSizeException;
28
import javax.crypto.NoSuchPaddingException;
29
import java.io.IOException;
30
import java.security.InvalidAlgorithmParameterException;
31
import java.security.InvalidKeyException;
32
import java.security.NoSuchAlgorithmException;
33
import java.security.spec.InvalidKeySpecException;
34
import java.util.*;
35

    
36
@RestController
37
//@RequestMapping("/orcid")
38
@PreAuthorize("isAuthenticated()")
39
@CrossOrigin(origins = "*")
40
public class WorkController {
41
    private final Logger log = Logger.getLogger(this.getClass());
42
    private final Logger orcid_log = Logger.getLogger("ORCID-"+this.getClass().getName());
43

    
44
    @Autowired
45
    private OrcidConfig orcidConfig;
46

    
47
    @Autowired
48
    private UserTokensService userTokensService;
49

    
50
    @Autowired
51
    private WorkService workService;
52

    
53
    @RequestMapping(value = "/local/put-code", method = RequestMethod.GET)
54
    public List<String> getPutCode(@RequestParam String[] pids) {
55
        String userOrcid = userTokensService.getCurrentUserOrcid();
56
        List<Work> works = workService.getWorks(pids, userOrcid);
57
        if(works != null) {
58
            List<String> putCodes = new ArrayList<>();
59
            for(Work work : works) {
60
                putCodes.add(work.getPutCode());
61
            }
62
            return putCodes;
63
        }
64
        return null;
65
    }
66

    
67
    @RequestMapping(value = "/local/put-codes", method = RequestMethod.POST)
68
    public List<List<String>> getPutCodes(@RequestBody String[][] pids) {
69
        String userOrcid = userTokensService.getCurrentUserOrcid();
70
        List<List<String>> putCodes = new ArrayList();
71
        for(int i=0; i<pids.length; i++) {
72
            List<Work> works = workService.getWorks(pids[i], userOrcid);
73
            if (works != null) {
74
                List<String> putCodesOfOneRecord = new ArrayList<>();
75
                for(Work work : works) {
76
                    putCodesOfOneRecord.add(work.getPutCode());
77
                }
78
                putCodes.add(putCodesOfOneRecord);
79
            } else {
80
                putCodes.add(null);
81
            }
82
        }
83
        return putCodes;
84
    }
85

    
86
    @RequestMapping(value = "/local/works", method = RequestMethod.POST)
87
    public List<List<Work>> getLocalWorks(@RequestBody String[][] pids) {
88
        String userOrcid = userTokensService.getCurrentUserOrcid();
89
        if(userOrcid == null) {
90
            throw new AuthorizationServiceException("User is not registered");
91
        }
92

    
93
        List<List<Work>> returnedWorks = new ArrayList();
94
        for(int i=0; i<pids.length; i++) {
95
            List<Work> works = workService.getWorks(pids[i], userOrcid);
96
            returnedWorks.add(works);
97
        }
98
        return returnedWorks;
99
    }
100

    
101
    @RequestMapping(value = "/orcid/work/save", method = RequestMethod.POST)
102
    public Work saveWork(@RequestBody String resultString) throws Exception {
103
        log.debug("saveWork: result = " + resultString);
104

    
105
        Gson gson = new GsonBuilder().create();
106
        ResultIdAndWork result = gson.fromJson(resultString, ResultIdAndWork.class);
107

    
108
        UserTokens userTokens = userTokensService.getUserTokens();
109
        if(userTokens == null) {
110
            throw new AuthorizationServiceException("User is not registered");
111
        }
112
        String userOrcid = userTokens.getOrcid();
113
        String userAccessToken = userTokens.getAccessToken();
114

    
115
        if(userOrcid == null || userAccessToken == null) {
116
            throw new AuthorizationServiceException("User is not registered");
117
        }
118

    
119
//        log.debug("Access token: " + userAccessToken);
120
//        log.debug("User orcid: " + userOrcid);
121

    
122
        String url = orcidConfig.getApiURL() + userOrcid + "/work";
123

    
124
        RestTemplate restTemplate = new RestTemplate();
125
//        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
126

    
127
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
128
            protected boolean hasError(HttpStatus statusCode) {
129
                if(statusCode == HttpStatus.UNAUTHORIZED) {
130
                    orcid_log.error("ORCID service returned UNAUTHORIZED: "+HttpStatus.UNAUTHORIZED);
131
                    throw new AuthorizationServiceException("User is not registered");
132
                }
133
                return false;
134
            }
135
        });
136
        HttpHeaders headers = new HttpHeaders();
137
        headers.add("Authorization", "Bearer " + userAccessToken);
138
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
139

    
140
        HttpEntity<String> request = new HttpEntity<>(gson.toJson(result.getWork()), headers);
141

    
142
        orcid_log.info("request: "+request);
143
        orcid_log.info("url: "+url);
144
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
145

    
146
        if (response.getStatusCode() != HttpStatus.CREATED) {
147
            orcid_log.error("Saving work response code is: " + response.getStatusCode());
148
            orcid_log.error("Unexpected Response: "+response.getBody());
149

    
150
            if(response.getStatusCode() == HttpStatus.UNAUTHORIZED) {
151
                throw new AuthorizationServiceException("You are not allowed to save work");
152
            } else if(response.getStatusCode() == HttpStatus.CONFLICT) {
153
                throw new ConflictException("Work is already saved");
154
            } else {
155
                throw new Exception("Internal server error");
156
            }
157
//            return null;
158
        } else {
159
            orcid_log.info("Response: "+response);
160
//            log.debug("[success] Saving work response code is: " + response.getStatusCode());
161
//            log.debug(response.toString());
162

    
163
            Date date = new Date();
164

    
165
            Work workToSave = new Work();
166
            workToSave.setPids(result.getPids());
167
            workToSave.setOrcid(userOrcid);
168
            workToSave.setCreationDate(date);
169
            workToSave.setUpdateDate(date);
170

    
171
            HttpHeaders responseHeaders = response.getHeaders();
172
            String locationPath = responseHeaders.getLocation().toString();
173
            String[] locationPathArray = locationPath.split("/");
174
            workToSave.setPutCode(locationPathArray[locationPathArray.length - 1]);
175

    
176
//            log.debug(gson.toJson(result.getPids()));
177
//            log.debug(responseHeaders.getLocation().toString());
178
//            log.debug(gson.toJson(workToSave));
179

    
180
            workService.saveWork(workToSave);
181

    
182
            return workToSave;
183
//            return "\""+workToSave.getPutCode()+"\"";
184
        }
185
    }
186

    
187
    @RequestMapping(value = "/orcid/work/update/{putCode}", method = RequestMethod.POST)
188
    public Work updateWork(@PathVariable String putCode,
189
                             @RequestBody String resultString) throws AccessDeniedException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
190
        log.debug("updateWork: putCode = " + putCode);
191

    
192
        Gson gson = new GsonBuilder().create();
193
        ResultIdAndWork result = gson.fromJson(resultString, ResultIdAndWork.class);
194

    
195
        UserTokens userTokens = userTokensService.getUserTokens();
196
        if(userTokens == null) {
197
            throw new AuthorizationServiceException("User is not registered");
198
        }
199
        String userOrcid = userTokens.getOrcid();
200
        String userAccessToken = userTokens.getAccessToken();
201

    
202
        if(userOrcid == null || userAccessToken == null) {
203
            throw new AuthorizationServiceException("User is not registered");
204
        }
205

    
206
//        log.debug("Access token: " + userAccessToken);
207
//        log.debug("User orcid: " + userOrcid);
208

    
209
//        String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
210
//        String url = "https://api.sandbox.orcid.org/v3.0/" + userOrcid + "/work/" + putCode;
211
        String url = orcidConfig.getApiURL() + userOrcid + "/work/" + putCode;
212

    
213
        RestTemplate restTemplate = new RestTemplate();
214
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
215
            protected boolean hasError(HttpStatus statusCode) {
216
                return false;
217
            }
218
        });
219
        HttpHeaders headers = new HttpHeaders();
220
//        headers.add("Accept", "application/json");
221
        headers.add("Authorization", "Bearer " + userAccessToken);
222
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
223

    
224
        HttpEntity<String> request = new HttpEntity<>(gson.toJson(result.getWork()), headers);
225
        orcid_log.info("request: "+request);
226
        orcid_log.info("url: "+url);
227

    
228
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, request, String.class);
229
        if (response.getStatusCode() != HttpStatus.OK) {
230
            orcid_log.error("Updating work response code is: " + response.getStatusCode());
231
            orcid_log.error("Unexpected Response: "+response.getBody());
232
            return null;
233
        } else {
234
            orcid_log.info("Response: "+response);
235
            Date date = new Date();
236

    
237
            Work localWork = workService.getLocalWorkByPutCode(putCode);
238
            localWork.setPids(result.getPids());
239
            localWork.setUpdateDate(date);
240

    
241
            workService.saveWork(localWork);
242
            return localWork;
243
//            return null;
244
        }
245

    
246
    }
247

    
248
    @RequestMapping(value = "/orcid/works", method = RequestMethod.GET)
249
    public String getWorksByPutCodes(@RequestParam String put_codes) throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
250
        log.debug("getWorksByPutCodes: put_codes = " + put_codes);
251

    
252
        UserTokens userTokens = userTokensService.getUserTokens();
253
        if(userTokens == null) {
254
            throw new AuthorizationServiceException("User is not registered");
255
        }
256
        String userOrcid = userTokens.getOrcid();
257
        String userAccessToken = userTokens.getAccessToken();
258

    
259
        if(userOrcid == null || userAccessToken == null) {
260
            throw new AuthorizationServiceException("User is not registered");
261
        }
262

    
263
//        log.debug("Access token: " + userAccessToken);
264
//        log.debug("User orcid: " + userOrcid);
265

    
266
//        String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
267
        String url = orcidConfig.getApiURL()+userOrcid+"/works/"+put_codes;
268

    
269
        RestTemplate restTemplate = new RestTemplate();
270
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
271
            protected boolean hasError(HttpStatus statusCode) {
272
                return false;
273
            }
274
        });
275
        HttpHeaders headers = new HttpHeaders();
276
        headers.add("Accept", "application/json");
277
        headers.add("Authorization", "Bearer " + userAccessToken);
278
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
279

    
280
        HttpEntity<String> request = new HttpEntity<>(headers);
281
        orcid_log.info("request: "+request);
282
        orcid_log.info("url: "+url);
283

    
284
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
285
        if (response.getStatusCode() != HttpStatus.OK) {
286
            orcid_log.error("Getting works response code is: " + response.getStatusCode());
287
            orcid_log.error("Unexpected Response: "+response.getBody());
288
            return null;
289
        } else {
290
            orcid_log.info("Response: "+response);
291
            return response.getBody().toString();
292
        }
293
    }
294

    
295
    @RequestMapping(value = "/orcid/work/{putCode}/delete", method = RequestMethod.DELETE)
296
    public String deleteWork(@PathVariable String putCode) throws IOException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
297
        log.debug("deleteWork: putCode = " + putCode);
298

    
299
        UserTokens userTokens = userTokensService.getUserTokens();
300
        if(userTokens == null) {
301
            throw new AuthorizationServiceException("User is not registered");
302
        }
303
        String userOrcid = userTokens.getOrcid();
304
        String userAccessToken = userTokens.getAccessToken();
305

    
306
        if(userOrcid == null || userAccessToken == null) {
307
            throw new AuthorizationServiceException("User is not registered");
308
        }
309

    
310
//        log.debug("Access token: " + userAccessToken);
311
//        log.debug("User orcid: " + userOrcid);
312

    
313
        String url = orcidConfig.getApiURL()+userOrcid+"/work/" + putCode;
314

    
315
        RestTemplate restTemplate = new RestTemplate();
316
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
317
            protected boolean hasError(HttpStatus statusCode) {
318
                return false;
319
            }
320
        });
321
        HttpHeaders headers = new HttpHeaders();
322
//        headers.add("Accept", "application/json");
323
        headers.add("Authorization", "Bearer " + userAccessToken);
324
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
325

    
326
        HttpEntity<String> request = new HttpEntity<>(headers);
327
        orcid_log.info("request: "+request);
328
        orcid_log.info("url: "+url);
329

    
330
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, request, String.class);
331
        if (response.getStatusCode() != HttpStatus.NO_CONTENT) {
332
            orcid_log.error("Deleting work response code is: " + response.getStatusCode());
333
            orcid_log.error("Unexpected Response: "+response.getBody());
334

    
335
            if(response.getStatusCode() == HttpStatus.NOT_FOUND) {
336
                workService.deleteWork(putCode);
337
                return putCode;
338
            }
339
            if(response.getStatusCode() == HttpStatus.UNAUTHORIZED) {
340
                throw new AuthorizationServiceException("You are not allowed to delete work");
341
            }
342
            return null;
343
        } else {
344
            orcid_log.info("Response: "+response);
345

    
346
            workService.deleteWork(putCode);
347

    
348
            return putCode;
349
        }
350

    
351
    }
352

    
353
    @RequestMapping(value = "/orcid/works/delete", method = RequestMethod.POST)
354
    public List<String> deleteWorks(@RequestBody List<String> putCodes) throws IOException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
355
        log.debug("deleteWorks: putCodes = " + putCodes);
356

    
357
        UserTokens userTokens = userTokensService.getUserTokens();
358
        if(userTokens == null) {
359
            throw new AuthorizationServiceException("User is not registered");
360
        }
361
        String userOrcid = userTokens.getOrcid();
362
        String userAccessToken = userTokens.getAccessToken();
363

    
364
        if(userOrcid == null || userAccessToken == null) {
365
            throw new AuthorizationServiceException("User is not registered");
366
        }
367

    
368
//        log.debug("Access token: " + userAccessToken);
369
//        log.debug("User orcid: " + userOrcid);
370

    
371
        RestTemplate restTemplate = new RestTemplate();
372
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
373
            protected boolean hasError(HttpStatus statusCode) {
374
                return false;
375
            }
376
        });
377
        HttpHeaders headers = new HttpHeaders();
378
//        headers.add("Accept", "application/json");
379
        headers.add("Authorization", "Bearer " + userAccessToken);
380
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
381

    
382
        HttpEntity<String> request = new HttpEntity<>(headers);
383

    
384
        List<String> deletedPutCodes = new ArrayList<>();
385
        int index = 0;
386
        for(String putCode : putCodes) {
387
            String url = orcidConfig.getApiURL()+userOrcid+"/work/" + putCode;
388
//            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
389

    
390
            orcid_log.info("request: "+request);
391
            orcid_log.info("url: "+url);
392

    
393
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, request, String.class);
394
            if (response.getStatusCode() != HttpStatus.NO_CONTENT) {
395
                orcid_log.error("Deleting work response code is: " + response.getStatusCode());
396
                orcid_log.error("Unexpected Response: "+response.getBody());
397

    
398
                if(index == 0 && response.getStatusCode() == HttpStatus.UNAUTHORIZED) {
399
                    throw new AuthorizationServiceException("You are not allowed to delete work");
400
                }
401
                if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
402
                    workService.deleteWork(putCode);
403
                    deletedPutCodes.add(putCode);
404
                } else {
405
                    deletedPutCodes.add(null);
406
                }
407
            } else {
408
                orcid_log.info("Response: "+response);
409

    
410
                workService.deleteWork(putCode);
411

    
412
                deletedPutCodes.add(putCode);
413
            }
414
            index++;
415
        }
416
        return deletedPutCodes;
417
    }
418

    
419
    @RequestMapping(value = "/orcid/work", method = RequestMethod.GET)
420
    public List<String> getWorksOfReuslt(@RequestParam String[] pids, @RequestParam String orcid) throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
421
        log.debug("getWorks: pids = " + pids + " - orcid = "+orcid);
422

    
423
        List<Work> works = workService.getWorks(pids, orcid);
424

    
425
        String userAccessToken = userTokensService.getUserAccessToken(orcid);
426
//        log.debug("Access token: " + userAccessToken);
427

    
428
        RestTemplate restTemplate = new RestTemplate();
429
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
430
            protected boolean hasError(HttpStatus statusCode) {
431
                return false;
432
            }
433
        });
434
        HttpHeaders headers = new HttpHeaders();
435
        headers.add("Accept", "application/json");
436
        headers.add("Authorization", "Bearer " + userAccessToken);
437
        headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
438

    
439
        HttpEntity<String> request = new HttpEntity<>(headers);
440

    
441
        List<String> responseValues = new ArrayList<>();
442

    
443
        for(Work work : works) {
444
            String url = orcidConfig.getApiURL() + orcid + "/work/" + work.getPutCode();
445
            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
446
            orcid_log.info("request: "+request);
447
            orcid_log.info("url: "+url);
448

    
449
            ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class);
450
            if (response.getStatusCode() != HttpStatus.OK) {
451
                orcid_log.error("Getting work response code is: " + response.getStatusCode());
452
                orcid_log.error("Unexpected Response: "+response.getBody());
453

    
454
                if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
455
//                work.setPutCode(null);
456
//                workService.saveWork(work);
457
                    workService.deleteWork(work.getPutCode());
458
                }
459

    
460
                responseValues.add(null);
461
            } else {
462
                orcid_log.info("Response: "+response);
463
                responseValues.add(response.getBody().toString());
464
            }
465
        }
466
        return responseValues;
467
    }
468

    
469
//    @PreAuthorize("isAuthenticated()")
470
//    @RequestMapping(value = "/local/works", method = RequestMethod.GET)
471
//    public Map<String, Object> getLocalWorks(@RequestParam(required = false) Integer page, @RequestParam(required = false) Integer size)
472
//            throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
473
//        log.debug("getWorks: page="+page+ " - size="+size);
474
//
475
//        String userOrcid = userTokensService.getCurrentUserOrcid();
476
//        if(userOrcid == null) {
477
//            throw new AuthorizationServiceException("User is not registered");
478
//        }
479
//
480
//        List<Work> works = workService.getLocalWorks(userOrcid);
481
//
482
//        Map<String, Object> response = new HashMap<>();
483
//        response.put("total", works.size());
484
//
485
//        if(page != null && page > 0 && size != null && size > 0) {
486
//            int from = (page-1)*size;
487
//            int to = page*size;
488
//
489
////            log.debug("size: "+works.size());
490
//            if(to > works.size()) {
491
//                to = works.size();
492
//            }
493
////            log.debug("from="+from+" - to="+to);
494
//
495
////            int index = 0;
496
////            Iterator<Work> iterator = works.iterator();
497
////            while(iterator.hasNext()) {
498
////                iterator.next();
499
////                if(index < from || index > to) {
500
////                    iterator.remove();
501
////                }
502
////                index++;
503
////            }
504
//            if(from < to) {
505
//                response.put("results", works.subList(from, to));
506
//                return response;
507
//            }
508
//        }
509
//        response.put("results", works);
510
//        return response;
511
//    }
512

    
513
    @RequestMapping(value = "/local/works", method = RequestMethod.GET)
514
    public List<Work> getMyLocalWorks() {
515
        log.debug("getMyWorks");
516
//
517
        String userOrcid = userTokensService.getCurrentUserOrcid();
518
        if(userOrcid == null) {
519
            throw new AuthorizationServiceException("User is not registered");
520
        }
521
//
522
        List<Work> works = workService.getLocalWorks(userOrcid);
523
//
524
        return works;
525
    }
526
}
(4-4/4)