diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index fe1454ecf..7d0f6a4e7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -257,4 +257,14 @@ public class DMPs extends BaseController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); } } + + @RequestMapping(method = RequestMethod.POST, value = {"/createZenodoDoi/{id}"}) + public ResponseEntity> createZenodoDoi(@PathVariable String id, Principal principal) { + try { + String zenodoDOI = this.dataManagementPlanManager.createZenodoDoi(UUID.fromString(id), principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully created DOI for Data Datamanagement Plan in question.").payload(zenodoDOI)); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index ef9e95d42..5c2241c61 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -49,8 +49,11 @@ import org.apache.poi.xwpf.usermodel.XWPFRun; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; +import org.springframework.core.io.FileSystemResource; import org.springframework.http.*; import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; @@ -967,4 +970,54 @@ public class DataManagementPlanManager { private boolean isUserOwnerOfDmp(DMP dmp, Principal principal) { return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId()); } + + public String createZenodoDoi(UUID id, Principal principal) throws Exception { + DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); + if (!isUserOwnerOfDmp(dmp, principal)) + throw new Exception("User is not authorized to invoke this action"); + if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) + throw new Exception("DMP is not finalized"); + + // First step, post call to Zenodo, to create the entry. + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", "application/json"); + headers.setContentType(MediaType.APPLICATION_JSON); + String createData = "{\n" + + " \"metadata\": {\n" + + " \"title\": \"" + dmp.getLabel() + "\",\n" + + " \"upload_type\": \"publication\",\n" + + " \"publication_type\": \"datamanagementplan\",\n" + + " \"description\": \"" + dmp.getDescription() + "\",\n" + + " \"creators\": [{\n" + + " \t\t\"name\": \"Kolokythas, Georgios\",\n" + + " \t\t\"affiliation\": \"OpenDMP\"}]\n" + + " }\n" + + "}"; + HttpEntity request = new HttpEntity<>(createData, headers); + String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + Map createResponse = restTemplate.postForObject(createUrl, request, Map.class); + + // Second step, add the file to the entry. + HttpHeaders fileHeaders = new HttpHeaders(); + fileHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); + LinkedMultiValueMap addFileMap = new LinkedMultiValueMap<>(); + + File file = getWordDocument(id.toString()); + addFileMap.add("filename", file.getName()); + FileSystemResource fileSystemResource = new FileSystemResource(file); + addFileMap.add("file", fileSystemResource); + HttpEntity> addFileMapRequest = new HttpEntity<>(addFileMap, fileHeaders); + + LinkedHashMap links = (LinkedHashMap) createResponse.get("links"); + String addFileUrl = links.get("files") + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + ResponseEntity addFileResponse = restTemplate.postForEntity(addFileUrl, addFileMapRequest, String.class); + Files.deleteIfExists(file.toPath()); + + // Third post call to Zenodo to publish the entry and return the DOI. + String publishUrl = links.get("publish") + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + Map publishResponce = restTemplate.postForObject(publishUrl, "", Map.class); + + return (String) publishResponce.get("conceptdoi"); + } } diff --git a/dmp-backend/web/src/main/resources/application-devel.properties b/dmp-backend/web/src/main/resources/application-devel.properties index 5faa11279..ecefd17ef 100644 --- a/dmp-backend/web/src/main/resources/application-devel.properties +++ b/dmp-backend/web/src/main/resources/application-devel.properties @@ -34,3 +34,7 @@ facebook.login.namespace= b2access.externallogin.user_info_url=https://b2access-integration.fz-juelich.de:443/oauth2/userinfo b2access.externallogin.access_token_url=https://b2access-integration.fz-juelich.de:443/oauth2/token b2access.externallogin.redirect_uri=http://opendmp.eu/api/oauth/authorized/b2access + +#############ZENODO CONFIGURATIONS######### +zenodo.url=https://sandbox.zenodo.org/api/ +zenodo.access_token=