From b14ea3dd01353c6ed4c466d0ca0bdb66d3eece59 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 5 Mar 2020 14:45:42 +0800 Subject: [PATCH 01/23] Added support for non-published manuscripts. --- pom.xml | 6 +- .../GWASDepositionBackendConstants.java | 2 + .../repository/ManuscriptRepository.java | 16 +++ .../controllers/ManuscriptController.java | 85 +++++++++++++ .../controllers/SubmissionsController.java | 25 +++- .../rest/dto/ManuscriptDtoAssembler.java | 54 +++++++++ .../rest/dto/ManuscriptDtoDisassembler.java | 22 ++++ .../rest/dto/SubmissionDtoAssembler.java | 8 +- .../deposition/service/ManuscriptService.java | 13 ++ .../service/impl/ManuscriptServiceImpl.java | 51 ++++++++ .../impl/SubmissionAssemblyService.java | 22 +++- .../deposition/util/IngestTransformer.java | 72 ----------- .../gwas/deposition/rest/IntegrationTest.java | 11 ++ .../rest/ManuscriptControllerTest.java | 113 ++++++++++++++++++ .../rest/SubmissionsControllerTest.java | 41 ++++++- 15 files changed, 452 insertions(+), 89 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/util/IngestTransformer.java create mode 100644 src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java diff --git a/pom.xml b/pom.xml index d667fa8..f0f6a76 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ uk.ac.ebi.spot.gwasdepo gwasdepo-commons - 1.0.0 + 1.0.2-SNAPSHOT uk.ac.ebi.spot.gwasdepo @@ -136,6 +136,10 @@ commons-fileupload commons-fileupload + + org.modelmapper + modelmapper + commons-io commons-io diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index 3cc07b5..d0ffda4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -8,6 +8,8 @@ public class GWASDepositionBackendConstants { public static final String API_PUBLICATIONS = "/publications"; + public static final String API_MANUSCRIPTS = "/manuscripts"; + public static final String API_SUBMISSIONS = "/submissions"; public static final String API_STUDIES = "/studies"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java new file mode 100644 index 0000000..0ae0ae7 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java @@ -0,0 +1,16 @@ +package uk.ac.ebi.spot.gwas.deposition.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.repository.MongoRepository; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; + +import java.util.Optional; + +public interface ManuscriptRepository extends MongoRepository { + + Optional findByIdAndArchivedAndCreated_UserId(String id, boolean archived, String userId); + + Page findByArchivedAndCreated_UserId(boolean archived, String userId, Pageable page); + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java new file mode 100644 index 0000000..6928cb4 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java @@ -0,0 +1,85 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.controllers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.data.web.PagedResourcesAssembler; +import org.springframework.hateoas.Link; +import org.springframework.hateoas.PagedResources; +import org.springframework.hateoas.Resource; +import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.domain.User; +import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.service.JWTService; +import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; +import uk.ac.ebi.spot.gwas.deposition.service.UserService; +import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; +import uk.ac.ebi.spot.gwas.deposition.util.HeadersUtil; + +import javax.servlet.http.HttpServletRequest; + +@RestController +@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS) +public class ManuscriptController { + + private static final Logger log = LoggerFactory.getLogger(PublicationsController.class); + + @Autowired + private ManuscriptService manuscriptService; + + @Autowired + private ManuscriptDtoAssembler manuscriptDtoAssembler; + + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + + @Autowired + private JWTService jwtService; + + @Autowired + private UserService userService; + + /** + * GET /v1/manuscripts/{manuscriptId} + */ + @GetMapping(value = "/{manuscriptId}", produces = "application/hal+json") + @ResponseStatus(HttpStatus.OK) + public Resource getManuscript(@PathVariable String manuscriptId, + HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to get manuscript: {}", user.getId(), manuscriptId); + Manuscript manuscript = manuscriptService.retrieveManuscript(manuscriptId, user.getId()); + log.info("Returning manuscript: {}", manuscript.getId()); + return manuscriptDtoAssembler.toResource(manuscript); + } + + /** + * GET /v1/manuscripts + */ + @GetMapping(produces = "application/hal+json") + @ResponseStatus(HttpStatus.OK) + public PagedResources getManuscripts(@PageableDefault(size = 20, page = 0) Pageable pageable, + PagedResourcesAssembler assembler, + HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to retrieve manuscripts.", user.getId()); + Page facetedManuscripts = manuscriptService.retrieveManuscripts(user.getId(), pageable); + + final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( + ControllerLinkBuilder.methodOn(ManuscriptController.class).getManuscripts(pageable, assembler, null)); + + return assembler.toResource(facetedManuscripts, manuscriptDtoAssembler, + new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); + + } + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index c78351a..cc34e41 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -16,10 +16,7 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; -import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; -import uk.ac.ebi.spot.gwas.deposition.constants.PublicationStatus; -import uk.ac.ebi.spot.gwas.deposition.constants.Status; -import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionType; +import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; @@ -28,6 +25,7 @@ import uk.ac.ebi.spot.gwas.deposition.exception.EmailAccountNotLinkedToGlobusException; import uk.ac.ebi.spot.gwas.deposition.exception.SSGlobusFolderCreatioException; import uk.ac.ebi.spot.gwas.deposition.exception.SubmissionOnUnacceptedPublicationTypeException; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoDisassembler; import uk.ac.ebi.spot.gwas.deposition.service.*; import uk.ac.ebi.spot.gwas.deposition.service.impl.SubmissionAssemblyService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; @@ -67,6 +65,9 @@ public class SubmissionsController { @Autowired private SumStatsService sumStatsService; + @Autowired + private ManuscriptService manuscriptService; + /** * POST /v1/submissions */ @@ -79,11 +80,25 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to create new submission for publication: {}", user.getName(), submissionCreationDto.getPublication().getPmid()); + if (submissionCreationDto.getPublication().getPmid() == null) { + log.info("Received submission based on manuscript: {}", submissionCreationDto.getPublication().getTitle()); + Manuscript manuscript = ManuscriptDtoDisassembler.diassemble(submissionCreationDto.getPublication(), + new Provenance(DateTime.now(), user.getId())); + manuscript = manuscriptService.createManuscript(manuscript); + Submission submission = new Submission(manuscript.getId(), + SubmissionProvenanceType.MANUSCRIPT.name(), + new Provenance(DateTime.now(), user.getId())); + submission = submissionService.createSubmission(submission); + return submissionAssemblyService.toResource(submission); + } + Publication publication = publicationService.retrievePublication(submissionCreationDto.getPublication().getPmid(), false); if (publication.getStatus().equals(PublicationStatus.ELIGIBLE.name()) || publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { - Submission submission = new Submission(publication.getId(), new Provenance(DateTime.now(), user.getId())); + Submission submission = new Submission(publication.getId(), + SubmissionProvenanceType.PUBLICATION.name(), + new Provenance(DateTime.now(), user.getId())); String globusFolder = UUID.randomUUID().toString(); SSGlobusResponse outcome = sumStatsService.createGlobusFolder(new SSGlobusFolderDto(globusFolder, submissionCreationDto.getGlobusIdentity() != null ? diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java new file mode 100644 index 0000000..8320f17 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java @@ -0,0 +1,54 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Resource; +import org.springframework.hateoas.ResourceAssembler; +import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; +import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; +import uk.ac.ebi.spot.gwas.deposition.rest.controllers.ManuscriptController; +import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; + +@Component +public class ManuscriptDtoAssembler implements ResourceAssembler> { + + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + + public static ManuscriptDto assemble(Manuscript manuscript) { + return new ManuscriptDto(manuscript.getId(), + manuscript.getTitle(), + manuscript.getJournal(), + manuscript.getFirstAuthor(), + manuscript.getSubmissionDate(), + manuscript.getAcceptanceDate(), + manuscript.getCorrespondingAuthor() != null ? + new CorrespondingAuthorDto(manuscript.getCorrespondingAuthor().getAuthorName(), + manuscript.getCorrespondingAuthor().getEmail()) : null, + manuscript.getStatus()); + } + + @Override + public Resource toResource(Manuscript manuscript) { + ManuscriptDto manuscriptDto = new ManuscriptDto(manuscript.getId(), + manuscript.getTitle(), + manuscript.getJournal(), + manuscript.getFirstAuthor(), + manuscript.getSubmissionDate(), + manuscript.getAcceptanceDate(), + manuscript.getCorrespondingAuthor() != null ? + new CorrespondingAuthorDto(manuscript.getCorrespondingAuthor().getAuthorName(), + manuscript.getCorrespondingAuthor().getEmail()) : null, + manuscript.getStatus()); + + final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( + ControllerLinkBuilder.methodOn(ManuscriptController.class).getManuscript(manuscript.getId(), null)); + + Resource resource = new Resource<>(manuscriptDto); + resource.add(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).withSelfRel()); + return resource; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java new file mode 100644 index 0000000..d30f93a --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java @@ -0,0 +1,22 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.dto.PublicationDto; + +public class ManuscriptDtoDisassembler { + + public static Manuscript diassemble(PublicationDto publicationDto, Provenance provenance) { + return new Manuscript(publicationDto.getTitle(), + publicationDto.getFirstAuthor(), + publicationDto.getJournal(), + publicationDto.getPublicationDate(), + publicationDto.getPublicationDate(), + publicationDto.getCorrespondingAuthor() != null ? + new CorrespondingAuthor(publicationDto.getCorrespondingAuthor().getAuthorName(), + publicationDto.getCorrespondingAuthor().getEmail()) : null, + provenance); + } + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java index 553cd5f..e051606 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java @@ -1,10 +1,7 @@ package uk.ac.ebi.spot.gwas.deposition.rest.dto; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; -import uk.ac.ebi.spot.gwas.deposition.dto.FileUploadDto; -import uk.ac.ebi.spot.gwas.deposition.dto.ProvenanceDto; -import uk.ac.ebi.spot.gwas.deposition.dto.PublicationDto; -import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; +import uk.ac.ebi.spot.gwas.deposition.dto.*; import java.util.List; @@ -12,11 +9,13 @@ public class SubmissionDtoAssembler { public static SubmissionDto assemble(Submission submission, PublicationDto publication, + ManuscriptDto manuscript, List fileUploads, ProvenanceDto created, ProvenanceDto lastUpdated) { return new SubmissionDto(submission.getId(), publication, + manuscript, fileUploads, submission.getGlobusFolderId(), submission.getGlobusOriginId(), @@ -27,6 +26,7 @@ public static SubmissionDto assemble(Submission submission, submission.getMetadataStatus(), submission.getSummaryStatsStatus(), submission.getDateSubmitted(), + submission.getProvenanceType(), created, lastUpdated ); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java new file mode 100644 index 0000000..0a56648 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java @@ -0,0 +1,13 @@ +package uk.ac.ebi.spot.gwas.deposition.service; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; + +public interface ManuscriptService { + Manuscript createManuscript(Manuscript manuscript); + + Manuscript retrieveManuscript(String manuscriptId, String userId); + + Page retrieveManuscripts(String userId, Pageable pageable); +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java new file mode 100644 index 0000000..39a7a5b --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java @@ -0,0 +1,51 @@ +package uk.ac.ebi.spot.gwas.deposition.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; +import uk.ac.ebi.spot.gwas.deposition.repository.ManuscriptRepository; +import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; + +import java.util.Optional; + +@Service +public class ManuscriptServiceImpl implements ManuscriptService { + + private static final Logger log = LoggerFactory.getLogger(ManuscriptService.class); + + @Autowired + private ManuscriptRepository manuscriptRepository; + + @Override + public Manuscript createManuscript(Manuscript manuscript) { + log.info("Creating manuscript: {}", manuscript.getTitle()); + manuscript = manuscriptRepository.insert(manuscript); + log.info("Manuscript created: {}", manuscript.getId()); + return manuscript; + } + + @Override + public Manuscript retrieveManuscript(String manuscriptId, String userId) { + log.info("[{}] Retrieving manuscript: {}", userId, manuscriptId); + Optional optionalManuscript = manuscriptRepository.findByIdAndArchivedAndCreated_UserId(manuscriptId, false, userId); + if (!optionalManuscript.isPresent()) { + log.error("Unable to find manuscript with ID: {}", manuscriptId); + throw new EntityNotFoundException("Unable to find manuscript with ID: " + manuscriptId); + } + + log.info("Returning manuscript: {}", optionalManuscript.get().getId()); + return optionalManuscript.get(); + } + + @Override + public Page retrieveManuscripts(String userId, Pageable pageable) { + log.info("[{}] Retrieving manuscripts.", userId); + Page manuscripts = manuscriptRepository.findByArchivedAndCreated_UserId(false, userId, pageable); + return manuscripts; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java index ef0d4ab..08e73bb 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java @@ -8,17 +8,17 @@ import org.springframework.stereotype.Service; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionProvenanceType; import uk.ac.ebi.spot.gwas.deposition.domain.FileUpload; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; import uk.ac.ebi.spot.gwas.deposition.domain.Publication; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.dto.FileUploadDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; import uk.ac.ebi.spot.gwas.deposition.rest.controllers.*; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.FileUploadDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.ProvenanceDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.SubmissionDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.*; import uk.ac.ebi.spot.gwas.deposition.service.FileUploadsService; +import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; import uk.ac.ebi.spot.gwas.deposition.service.PublicationService; import uk.ac.ebi.spot.gwas.deposition.service.UserService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; @@ -44,9 +44,18 @@ public class SubmissionAssemblyService implements ResourceAssembler toResource(Submission submission) { - Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); + Publication publication = null; + Manuscript manuscript = null; + if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.PUBLICATION.name())) { + publication = publicationService.retrievePublication(submission.getPublicationId(), true); + } else { + manuscript = manuscriptService.retrieveManuscript(submission.getManuscriptId(), submission.getCreated().getUserId()); + } List fileUploads = fileUploadsService.getFileUploads(submission.getFileUploads()); List fileUploadDtos = new ArrayList<>(); @@ -55,7 +64,8 @@ public Resource toResource(Submission submission) { } SubmissionDto submissionDto = SubmissionDtoAssembler.assemble(submission, - PublicationDtoAssembler.assemble(publication), + publication != null ? PublicationDtoAssembler.assemble(publication) : null, + manuscript != null ? ManuscriptDtoAssembler.assemble(manuscript) : null, fileUploadDtos, ProvenanceDtoAssembler.assemble(submission.getCreated(), userService.getUser(submission.getCreated().getUserId())), submission.getLastUpdated() != null ? diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/IngestTransformer.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/IngestTransformer.java deleted file mode 100644 index 65ccf66..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/IngestTransformer.java +++ /dev/null @@ -1,72 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.util; - -import uk.ac.ebi.spot.gwas.deposition.constants.PublicationStatus; -import uk.ac.ebi.spot.gwas.deposition.domain.*; -import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; -import uk.ac.ebi.spot.gwas.deposition.dto.ingest.ExtendedPublicationDto; -import uk.ac.ebi.spot.gwas.deposition.dto.ingest.PublicationDto; -import uk.ac.ebi.spot.gwas.deposition.dto.ingest.SubmissionDto; -import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateEntryDto; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.ProvenanceDtoAssembler; - -import java.util.ArrayList; -import java.util.List; - -public class IngestTransformer { - - public static Publication fromIngest(ExtendedPublicationDto extendedPublicationDto) { - CorrespondingAuthor correspondingAuthor = extendedPublicationDto.getCorrespondingAuthor() != null ? - new CorrespondingAuthor(extendedPublicationDto.getCorrespondingAuthor().getAuthorName(), - extendedPublicationDto.getCorrespondingAuthor().getEmail()) : null; - - return new Publication(extendedPublicationDto.getPmid(), - extendedPublicationDto.getJournal(), - extendedPublicationDto.getTitle(), - extendedPublicationDto.getFirstAuthor(), - extendedPublicationDto.getPublicationDate(), - correspondingAuthor, - extendedPublicationDto.getStatus() != null ? extendedPublicationDto.getStatus() : PublicationStatus.ELIGIBLE.name()); - } - - public static List templateEntriesFromInges(ExtendedPublicationDto extendedPublicationDto) { - List ssTemplateEntries = null; - - if (extendedPublicationDto.getSsTemplateEntries() != null) { - ssTemplateEntries = new ArrayList<>(); - for (SSTemplateEntryDto ssTemplateEntryDto : extendedPublicationDto.getSsTemplateEntries()) { - ssTemplateEntries.add(new SSTemplateEntry(ssTemplateEntryDto.getStudyAccession(), - ssTemplateEntryDto.getStudyTag(), - ssTemplateEntryDto.getTrait(), - ssTemplateEntryDto.getSampleDescription(), - ssTemplateEntryDto.getHasSummaryStats())); - } - } - - return ssTemplateEntries; - } - - public static SubmissionDto toIngest(Submission submission, Publication publication, User user) { - CorrespondingAuthorDto correspondingAuthor = publication.getCorrespondingAuthor() != null ? - new CorrespondingAuthorDto(publication.getCorrespondingAuthor().getAuthorName(), - publication.getCorrespondingAuthor().getEmail()) : null; - PublicationDto publicationDto = new PublicationDto(publication.getPmid(), - publication.getTitle(), - publication.getJournal(), - publication.getFirstAuthor(), - publication.getPublicationDate(), - correspondingAuthor, - publication.getStatus()); - - return new SubmissionDto(submission.getId(), - publicationDto, - submission.getOverallStatus(), - submission.getGlobusFolderId(), - submission.getGlobusOriginId(), - null, - null, - null, - null, - submission.getDateSubmitted(), - ProvenanceDtoAssembler.assemble(submission.getCreated(), user)); - } -} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index 78e10de..8c85714 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.RandomStringUtils; +import org.joda.time.LocalDate; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -142,6 +143,8 @@ public SSCallbackTask ssCallbackTask() { protected Publication publishedPublication; + protected Publication manuscriptPublication; + protected Study study; protected Note note; @@ -163,6 +166,14 @@ public void setup() { user = userRepository.insert(TestUtil.user()); eligiblePublication = publicationRepository.insert(TestUtil.eligiblePublication()); publishedPublication = publicationRepository.insert(TestUtil.publishedPublication()); + manuscriptPublication = new Publication(null, + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10) + " " + RandomStringUtils.randomAlphanumeric(10), + LocalDate.now(), + new CorrespondingAuthor(RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10)), + null); when(jwtService.extractUser(any())).thenReturn(user); diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java new file mode 100644 index 0000000..bb3cc14 --- /dev/null +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java @@ -0,0 +1,113 @@ +package uk.ac.ebi.spot.gwas.deposition.rest; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.jayway.jsonpath.JsonPath; +import net.minidev.json.JSONArray; +import org.apache.commons.lang3.RandomStringUtils; +import org.joda.time.DateTime; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Resource; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; +import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoDisassembler; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; +import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ContextConfiguration(classes = {IntegrationTest.MockJWTServiceConfig.class, + IntegrationTest.MockTaskExecutorConfig.class, + IntegrationTest.MockGWASCatalogRESTServiceConfig.class, + IntegrationTest.MockTemplateServiceConfig.class, + IntegrationTest.MockSumStatsServiceConfig.class}) +public class ManuscriptControllerTest extends IntegrationTest { + + @Autowired + private SumStatsService sumStatsService; + + private Manuscript manuscript; + + @Autowired + private ManuscriptService manuscriptService; + + @Before + public void setup() { + super.setup(); + reset(sumStatsService); + when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); + + manuscript = ManuscriptDtoDisassembler.diassemble(PublicationDtoAssembler.assemble(manuscriptPublication), + new Provenance(DateTime.now(), user.getId())); + manuscript = manuscriptService.createManuscript(manuscript); + } + + /** + * GET /v1/manuscripts/{manuscriptId} + */ + @Test + public void shouldGetManuscript() throws Exception { + String endpoint = GWASDepositionBackendConstants.API_V1 + + GWASDepositionBackendConstants.API_MANUSCRIPTS + + "/" + manuscript.getId(); + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + ManuscriptDto actual = actualResource.getContent(); + + assertEquals(manuscript.getTitle(), actual.getTitle()); + assertEquals(manuscript.getJournal(), actual.getJournal()); + assertEquals(manuscript.getFirstAuthor(), actual.getFirstAuthor()); + assertEquals(manuscript.getCorrespondingAuthor().getAuthorName(), actual.getCorrespondingAuthor().getAuthorName()); + } + + /** + * GET /v1/manuscripts + */ + @Test + public void shouldGetManuscripts() throws Exception { + String endpoint = GWASDepositionBackendConstants.API_V1 + + GWASDepositionBackendConstants.API_MANUSCRIPTS; + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + + Map objectMap = JsonPath.read(response, "$.page"); + assertEquals(1, objectMap.get("totalElements")); + JSONArray jsonArray = JsonPath.read(response, "$._embedded.manuscripts[*]"); + assertEquals(1, jsonArray.size()); + Map submissionData = JsonPath.read(response, "$._embedded.manuscripts[0]"); + assertEquals(manuscript.getId(), submissionData.get("manuscriptId")); + assertEquals(manuscript.getTitle(), submissionData.get("title")); + assertEquals(manuscript.getJournal(), submissionData.get("journal")); + assertEquals(manuscript.getFirstAuthor(), submissionData.get("firstAuthor")); + + } + +} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index f631394..2e4983d 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -17,6 +17,7 @@ import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateEntryDto; +import uk.ac.ebi.spot.gwas.deposition.repository.ManuscriptRepository; import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.service.*; @@ -27,6 +28,7 @@ import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; @@ -58,6 +60,9 @@ public class SubmissionsControllerTest extends IntegrationTest { @Autowired private SumStatsService sumStatsService; + @Autowired + private ManuscriptRepository manuscriptRepository; + @Before public void setup() { super.setup(); @@ -148,9 +153,43 @@ public void shouldCreatePublishedSubmission() throws Exception { } /** - * GET /v1/submissions/{submissionId} + * POST /v1/submissions */ + @Test + public void shouldCreateManuscriptSubmission() throws Exception { + when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); + + SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(manuscriptPublication), + RandomStringUtils.randomAlphanumeric(10)); + String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + GWASDepositionBackendConstants.API_SUBMISSIONS) + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(submissionCreationDto))) + .andExpect(status().isCreated()) + .andReturn() + .getResponse() + .getContentAsString(); + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + SubmissionDto actual = actualResource.getContent(); + + assertNull(actual.getPublication()); + assertEquals(SubmissionProvenanceType.MANUSCRIPT.name(), actual.getProvenanceType()); + assertEquals(user.getName(), actual.getCreated().getUser().getName()); + assertEquals(user.getEmail(), actual.getCreated().getUser().getEmail()); + assertEquals(manuscriptPublication.getJournal(), actual.getManuscript().getJournal()); + assertEquals(manuscriptPublication.getTitle(), actual.getManuscript().getTitle()); + assertEquals(manuscriptPublication.getFirstAuthor(), actual.getManuscript().getFirstAuthor()); + + assertTrue(actual.getFiles().isEmpty()); + assertEquals(1, manuscriptRepository.findAll().size()); + verify(sumStatsService, times(0)).createGlobusFolder(any()); + } + + /** + * GET /v1/submissions/{submissionId} + */ @Test public void shouldGetSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), From 0b691f89f1728f357c5bcef0598b7dfe2d3f695d Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Fri, 6 Mar 2020 21:37:45 +0800 Subject: [PATCH 02/23] Refactored commons. Added endpoint for submission envelopes. --- .../ebi/spot/gwas/deposition/Application.java | 5 +- .../config/GWASDepositionBackendConfig.java | 7 +++ .../gwas/deposition/config/MongoConfig.java | 11 ++-- .../config/SystemConfigProperties.java | 52 ------------------- .../GWASDepositionBackendConstants.java | 8 --- .../controllers/AssociationsController.java | 3 +- .../controllers/DailyStatsController.java | 3 +- .../controllers/FileUploadsController.java | 3 +- .../controllers/ManuscriptController.java | 3 +- .../controllers/PublicationsController.java | 3 +- .../rest/controllers/SamplesController.java | 3 +- .../ServiceManagementController.java | 3 +- .../rest/controllers/StudiesController.java | 3 +- .../controllers/SubmissionsController.java | 3 +- src/main/resources/application.yml | 6 +++ .../rest/AssociationsControllerTest.java | 5 +- .../FileUploadsControllerMetadataTest.java | 15 +++--- .../rest/FileUploadsControllerSSTest.java | 21 ++++---- .../rest/FileUploadsControllerTest.java | 10 ++-- .../gwas/deposition/rest/IntegrationTest.java | 3 +- .../rest/ManuscriptControllerTest.java | 5 +- .../rest/PublicationsControllerTest.java | 11 ++-- .../rest/SamplesControllerTest.java | 5 +- .../rest/ServiceManagementControllerTest.java | 5 +- .../rest/StudiesControllerTest.java | 5 +- .../rest/SubmissionsControllerTest.java | 26 +++++----- 26 files changed, 99 insertions(+), 128 deletions(-) delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/config/SystemConfigProperties.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/Application.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/Application.java index 2d18a1f..5f87946 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/Application.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/Application.java @@ -6,12 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import uk.ac.ebi.spot.gwas.deposition.config.SystemConfigProperties; -import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -40,7 +39,7 @@ public void destroy() { public static void main(String[] args) throws UnknownHostException { String hostAddress = InetAddress.getLocalHost().getHostAddress(); - String logFileName = System.getenv(GWASDepositionBackendConstants.LOG_FILE_NAME); + String logFileName = System.getenv(GeneralCommon.LOG_FILE_NAME); System.setProperty("log.file.name", logFileName + "-" + hostAddress); SpringApplication.run(Application.class, args); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java index 153b4e2..1c184c4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java @@ -33,6 +33,13 @@ public class GWASDepositionBackendConfig { @Value("${gwas-deposition.email-config.base-url}") private String submissionsBaseURL; + @Value("${gwas-deposition.db:#{NULL}}") + private String dbName; + + public String getDbName() { + return dbName; + } + public String getSubmissionsBaseURL() { return submissionsBaseURL; } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java index 0bef780..b68326b 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java @@ -4,7 +4,6 @@ import com.mongodb.MongoClientURI; import com.mongodb.ServerAddress; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -61,9 +60,12 @@ public static class MongoConfigSandbox extends AbstractMongoConfiguration { @Autowired private SystemConfigProperties systemConfigProperties; + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + @Override protected String getDatabaseName() { - return systemConfigProperties.getDbName(); + return gwasDepositionBackendConfig.getDbName(); } @Bean @@ -87,9 +89,12 @@ public static class MongoConfigProd extends AbstractMongoConfiguration { @Autowired private SystemConfigProperties systemConfigProperties; + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + @Override protected String getDatabaseName() { - return systemConfigProperties.getDbName(); + return gwasDepositionBackendConfig.getDbName(); } @Bean diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/SystemConfigProperties.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/SystemConfigProperties.java deleted file mode 100644 index 8ff20ef..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/SystemConfigProperties.java +++ /dev/null @@ -1,52 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; - -@Component -public class SystemConfigProperties { - - @Value("${spring.profiles.active}") - private String activeSpringProfile; - - @Value("${server.name}") - private String serverName; - - @Value("${server.port}") - private String serverPort; - - @Value("${spring.data.mongodb.uri}") - private String mongoUri; - - @Value("${gwas-deposition.db:#{NULL}}") - private String dbName; - - public String getActiveSpringProfile() { - return activeSpringProfile; - } - - public String getServerName() { - return serverName; - } - - public String getServerPort() { - return serverPort; - } - - public String getMongoUri() { - return mongoUri; - } - - public String getDbUser() { - return System.getenv(GWASDepositionBackendConstants.DB_USER); - } - - public String getDbPassword() { - return System.getenv(GWASDepositionBackendConstants.DB_PASSWORD); - } - - public String getDbName() { - return dbName; - } -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index d0ffda4..7365555 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -2,8 +2,6 @@ public class GWASDepositionBackendConstants { - public static final String API_V1 = "/v1"; - public static final String API_DAILYSTATS = "/daily-stats"; public static final String API_PUBLICATIONS = "/publications"; @@ -28,12 +26,6 @@ public class GWASDepositionBackendConstants { public static final String API_CLEAR_PUBLICATIONS = "/clear-publications"; - public static final String LOG_FILE_NAME = "LOG_FILE_NAME"; - - public static final String DB_USER = "DB_USER"; - - public static final String DB_PASSWORD = "DB_PASSWORD"; - public static final String PARAM_PMID = "pmid"; public static final String PARAM_AUTHOR = "author"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/AssociationsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/AssociationsController.java index 792bf34..999f7d8 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/AssociationsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/AssociationsController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Association; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -30,7 +31,7 @@ import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) public class AssociationsController { private static final Logger log = LoggerFactory.getLogger(AssociationsController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/DailyStatsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/DailyStatsController.java index 25750e7..9e5da60 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/DailyStatsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/DailyStatsController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.DailyStats; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.dto.DailyStatsDto; @@ -25,7 +26,7 @@ import java.util.stream.Collectors; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_DAILYSTATS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_DAILYSTATS) @ConditionalOnProperty(name = "gwas-deposition.stats-task.enabled", havingValue = "true") public class DailyStatsController { diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java index 4f0bc32..da9e9fb 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java @@ -14,6 +14,7 @@ import org.springframework.web.multipart.MultipartFile; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionType; import uk.ac.ebi.spot.gwas.deposition.domain.FileUpload; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; @@ -33,7 +34,7 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) public class FileUploadsController { private static final Logger log = LoggerFactory.getLogger(FileUploadsController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java index 6928cb4..6c191a3 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; @@ -28,7 +29,7 @@ import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS) public class ManuscriptController { private static final Logger log = LoggerFactory.getLogger(PublicationsController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/PublicationsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/PublicationsController.java index f9a68da..d840b2c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/PublicationsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/PublicationsController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Publication; import uk.ac.ebi.spot.gwas.deposition.dto.PublicationDto; import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; @@ -22,7 +23,7 @@ import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS) public class PublicationsController { private static final Logger log = LoggerFactory.getLogger(PublicationsController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SamplesController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SamplesController.java index 313a7be..44ab482 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SamplesController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SamplesController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Sample; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -30,7 +31,7 @@ import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) public class SamplesController { private static final Logger log = LoggerFactory.getLogger(SamplesController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ServiceManagementController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ServiceManagementController.java index df500c0..5bb9717 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ServiceManagementController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ServiceManagementController.java @@ -9,10 +9,11 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.service.SOLRService; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1) +@RequestMapping(value = GeneralCommon.API_V1) public class ServiceManagementController { private static final Logger log = LoggerFactory.getLogger(ServiceManagementController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java index 259f3b3..10ad327 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Study; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -30,7 +31,7 @@ import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) public class StudiesController { private static final Logger log = LoggerFactory.getLogger(StudiesController.class); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index cc34e41..7e3fe70 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -36,7 +36,7 @@ import java.util.UUID; @RestController -@RequestMapping(value = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) public class SubmissionsController { private static final Logger log = LoggerFactory.getLogger(SubmissionsController.class); @@ -88,6 +88,7 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr Submission submission = new Submission(manuscript.getId(), SubmissionProvenanceType.MANUSCRIPT.name(), new Provenance(DateTime.now(), user.getId())); + submission = submissionService.createSubmission(submission); return submissionAssemblyService.toResource(submission); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2145ef8..ed18fbe 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -53,6 +53,12 @@ solr: enable: alias: false +audit: + enabled: false + url: http://gwas-audit-service:8080 + endpoints: + audit-entries: /v1/audit-entries + gwas-sumstats-service: enabled: true url: http://gwas-ss-service:8000 diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java index f949574..5bac8ac 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java @@ -11,6 +11,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -60,7 +61,7 @@ public void setup() { public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -92,7 +93,7 @@ public void shouldGetSamples() throws Exception { submission.setNotes(Arrays.asList(new String[]{note.getId()})); submissionService.saveSubmission(submission); - String endpoint = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_ASSOCIATIONS; response = mockMvc.perform(get(endpoint) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerMetadataTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerMetadataTest.java index ac256e6..cd775a9 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerMetadataTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerMetadataTest.java @@ -13,6 +13,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionType; import uk.ac.ebi.spot.gwas.deposition.domain.*; @@ -87,7 +88,7 @@ public void shouldUploadFile() throws Exception { @Test public void shouldFailWithInvalidFile() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -121,7 +122,7 @@ public void shouldFailWithInvalidFile() throws Exception { @Test public void shouldFailWithNoSchema() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -155,7 +156,7 @@ public void shouldFailWithNoSchema() throws Exception { @Test public void shouldFailWithUnusableSchema() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -199,7 +200,7 @@ public void shouldFailWithUnusableSchema() throws Exception { @Test public void shouldFailWithNoSchemaVersion1() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -234,7 +235,7 @@ public void shouldFailWithNoSchemaVersion1() throws Exception { @Test public void shouldFailWithNoSchemaVersion2() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -273,7 +274,7 @@ public void shouldFailWithNoSchemaVersion2() throws Exception { @Test public void shouldFailWithInvalidData() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -314,7 +315,7 @@ public void shouldFailWithInvalidData() throws Exception { } private FileUploadDto createMetadataFileUpload(SubmissionDto submissionDto) throws Exception { - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java index 6241b8d..b799ed3 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java @@ -14,10 +14,7 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; -import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; -import uk.ac.ebi.spot.gwas.deposition.constants.Status; -import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionType; +import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.FileUploadDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; @@ -89,7 +86,7 @@ public void setup() { @Test public void shouldFailWithInvalidFile() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -125,7 +122,7 @@ public void shouldFailWithInvalidFile() throws Exception { @Test public void shouldFailWithNoSchema() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -161,7 +158,7 @@ public void shouldFailWithNoSchema() throws Exception { @Test public void shouldFailWithSchemaMistmatch() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -197,7 +194,7 @@ public void shouldFailWithSchemaMistmatch() throws Exception { @Test public void shouldFailWithNoSchemaVersion1() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -234,7 +231,7 @@ public void shouldFailWithNoSchemaVersion1() throws Exception { @Test public void shouldFailWithNoSchemaVersion2() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -277,7 +274,7 @@ public void shouldFailWithNoSchemaVersion2() throws Exception { @Test public void shouldFailWithInvalidData() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -327,7 +324,7 @@ public void shouldFailWithInvalidData() throws Exception { @Test public void shouldHandleSummaryStats() throws Exception { SubmissionDto submissionDto = createSubmissionFromPublished(); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -404,7 +401,7 @@ private SubmissionDto createSubmissionFromPublished() throws Exception { FileObject fileObject = new FileObject("ss_template.xlsx", IOUtils.toByteArray(is)); when(templateService.retrievePrefilledTemplate(any())).thenReturn(fileObject); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerTest.java index 6f1d903..cef6988 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerTest.java @@ -102,7 +102,7 @@ public void shouldGetFileUpload() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); FileUploadDto fileUploadDto = createMetadataFileUpload(submissionDto); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS + @@ -132,7 +132,7 @@ public void shouldGetFileUploads() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); FileUploadDto fileUploadDto = createMetadataFileUpload(submissionDto); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; @@ -161,7 +161,7 @@ public void shouldDownloadFile() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); FileUploadDto fileUploadDto = createMetadataFileUpload(submissionDto); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS + @@ -191,7 +191,7 @@ public void shouldDeleteFileUpload() throws Exception { SubmissionDto submissionDto = createSubmissionFromEligible(); FileUploadDto fileUploadDto = createMetadataFileUpload(submissionDto); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS + @@ -220,7 +220,7 @@ public void shouldDeleteFileUpload() throws Exception { } private FileUploadDto createMetadataFileUpload(SubmissionDto submissionDto) throws Exception { - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_UPLOADS; diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index 8c85714..321c8f6 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -23,6 +23,7 @@ import org.springframework.web.context.WebApplicationContext; import uk.ac.ebi.spot.gwas.deposition.Application; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; @@ -240,7 +241,7 @@ private void createPrerequisites() { protected SubmissionDto createSubmissionFromEligible() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java index bb3cc14..5b9671e 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java @@ -12,6 +12,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; @@ -61,7 +62,7 @@ public void setup() { */ @Test public void shouldGetManuscript() throws Exception { - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS + "/" + manuscript.getId(); @@ -87,7 +88,7 @@ public void shouldGetManuscript() throws Exception { */ @Test public void shouldGetManuscripts() throws Exception { - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS; String response = mockMvc.perform(get(endpoint) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/PublicationsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/PublicationsControllerTest.java index 1da79bb..58a5705 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/PublicationsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/PublicationsControllerTest.java @@ -9,6 +9,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.dto.PublicationDto; import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; @@ -26,7 +27,7 @@ public class PublicationsControllerTest extends IntegrationTest { */ @Test public void shouldGetPublicationById() throws Exception { - String response = mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "/" + eligiblePublication.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -45,7 +46,7 @@ public void shouldGetPublicationById() throws Exception { */ @Test public void shouldGetPublicationByPMID() throws Exception { - String response = mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "/" + eligiblePublication.getPmid() + "?" + GWASDepositionBackendConstants.PARAM_PMID + "=true") .contentType(MediaType.APPLICATION_JSON)) @@ -65,7 +66,7 @@ public void shouldGetPublicationByPMID() throws Exception { */ @Test public void shouldNotFindGetPublicationById() throws Exception { - mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "/" + RandomStringUtils.randomAlphanumeric(10)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNotFound()); @@ -76,7 +77,7 @@ public void shouldNotFindGetPublicationById() throws Exception { */ @Test public void shouldAllPublications() throws Exception { - String response = mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -106,7 +107,7 @@ public void shouldGetPublicationsByAuthor() throws Exception { String[] parts = authorName.split(" "); String value = parts[1].toUpperCase(); - String response = mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "?author=" + value) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java index 85bf29a..2a62f7e 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java @@ -11,6 +11,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -60,7 +61,7 @@ public void setup() { public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -92,7 +93,7 @@ public void shouldGetSamples() throws Exception { submission.setNotes(Arrays.asList(new String[]{note.getId()})); submissionService.saveSubmission(submission); - String endpoint = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_SAMPLES; response = mockMvc.perform(get(endpoint) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ServiceManagementControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ServiceManagementControllerTest.java index d7f6fb9..743ca1f 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ServiceManagementControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ServiceManagementControllerTest.java @@ -5,6 +5,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -19,11 +20,11 @@ public class ServiceManagementControllerTest extends IntegrationTest { @Ignore @Test public void shouldGetPublicationById() throws Exception { - mockMvc.perform(delete(GWASDepositionBackendConstants.API_V1 + + mockMvc.perform(delete(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "/" + eligiblePublication.getPmid())) .andExpect(status().isOk()); - mockMvc.perform(get(GWASDepositionBackendConstants.API_V1 + + mockMvc.perform(get(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_PUBLICATIONS + "/" + eligiblePublication.getPmid() + "?" + GWASDepositionBackendConstants.PARAM_PMID + "=true") .contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java index 3676d58..d5b24de 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java @@ -11,6 +11,7 @@ import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; @@ -60,7 +61,7 @@ public void setup() { public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -92,7 +93,7 @@ public void shouldGetSamples() throws Exception { submission.setNotes(Arrays.asList(new String[]{note.getId()})); submissionService.saveSubmission(submission); - String endpoint = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_STUDIES; response = mockMvc.perform(get(endpoint) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 2e4983d..d8cc4b0 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -78,7 +78,7 @@ public void shouldCreateEligibleSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -123,7 +123,7 @@ public void shouldCreatePublishedSubmission() throws Exception { IOUtils.toByteArray(is)); when(templateService.retrievePrefilledTemplate(any())).thenReturn(fileObject); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -161,7 +161,7 @@ public void shouldCreateManuscriptSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(manuscriptPublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -194,7 +194,7 @@ public void shouldCreateManuscriptSubmission() throws Exception { public void shouldGetSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -216,7 +216,7 @@ public void shouldGetSubmission() throws Exception { submission.setNotes(Arrays.asList(new String[]{note.getId()})); submissionService.saveSubmission(submission); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + submissionDto.getSubmissionId(); @@ -251,7 +251,7 @@ public void shouldGetSubmission() throws Exception { public void shouldDeleteSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -263,7 +263,7 @@ public void shouldDeleteSubmission() throws Exception { Resource actual = mapper.readValue(response, new TypeReference>() { }); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + actual.getContent().getSubmissionId(); @@ -299,7 +299,7 @@ public void shouldDeleteSubmissionOfPublishedPublication() throws Exception { IOUtils.toByteArray(is)); when(templateService.retrievePrefilledTemplate(any())).thenReturn(fileObject); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -311,7 +311,7 @@ public void shouldDeleteSubmissionOfPublishedPublication() throws Exception { Resource actual = mapper.readValue(response, new TypeReference>() { }); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + actual.getContent().getSubmissionId(); @@ -334,7 +334,7 @@ public void shouldDeleteSubmissionOfPublishedPublication() throws Exception { public void shouldSubmitSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -346,7 +346,7 @@ public void shouldSubmitSubmission() throws Exception { Resource actual = mapper.readValue(response, new TypeReference>() { }); - String endpoint = GWASDepositionBackendConstants.API_V1 + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + "/" + actual.getContent().getSubmissionId() + GWASDepositionBackendConstants.API_SUBMIT; @@ -371,7 +371,7 @@ public void shouldSubmitSubmission() throws Exception { public void shouldGetSubmissions() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), RandomStringUtils.randomAlphanumeric(10)); - String response = mockMvc.perform(post(GWASDepositionBackendConstants.API_V1 + + String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(submissionCreationDto))) @@ -393,7 +393,7 @@ public void shouldGetSubmissions() throws Exception { submission.setNotes(Arrays.asList(new String[]{note.getId()})); submissionService.saveSubmission(submission); - String endpoint = GWASDepositionBackendConstants.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS; + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS; response = mockMvc.perform(get(endpoint) .contentType(MediaType.APPLICATION_JSON)) From 61b9d906c95690a34ebe061ae2c9d10a694fff69 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Fri, 13 Mar 2020 22:29:29 +0800 Subject: [PATCH 03/23] Added audit entries. Migrated email component. --- .../deposition/config/BackendMailConfig.java | 36 ++++++ .../config/GWASDepositionBackendConfig.java | 7 -- .../gwas/deposition/config/MailConfig.java | 57 --------- .../controllers/FileUploadsController.java | 8 ++ .../controllers/ManuscriptController.java | 6 + .../controllers/SubmissionsController.java | 19 +++ .../scheduler/tasks/SSCallbackTask.java | 21 +++- ...lService.java => BackendEmailService.java} | 4 +- .../service/impl/BackendEmailServiceImpl.java | 57 +++++++++ .../service/impl/EmailServiceImpl.java | 111 ------------------ .../impl/MetadataValidationServiceImpl.java | 18 ++- .../service/impl/SubmissionServiceImpl.java | 6 + .../SummaryStatsProcessingServiceImpl.java | 11 +- .../SummaryStatsValidationServiceImpl.java | 21 +++- .../impl/email/AbstractEmailBuilder.java | 43 ------- .../service/impl/email/EmailBuilder.java | 9 -- .../service/impl/email/FailEmailBuilder.java | 2 + .../impl/email/SuccessEmailBuilder.java | 2 + .../resources/application-prod-fallback.yml | 5 +- src/main/resources/application-prod.yml | 5 +- src/main/resources/application-sandbox.yml | 4 +- src/main/resources/application.yml | 11 +- .../gwas/deposition/rest/IntegrationTest.java | 6 +- .../scheduler/SSCallbackTaskTest.java | 10 +- .../service/GWASCatalogRESTServiceTest.java | 2 + 25 files changed, 222 insertions(+), 259 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendMailConfig.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MailConfig.java rename src/main/java/uk/ac/ebi/spot/gwas/deposition/service/{EmailService.java => BackendEmailService.java} (73%) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/EmailServiceImpl.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/AbstractEmailBuilder.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/EmailBuilder.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendMailConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendMailConfig.java new file mode 100644 index 0000000..e106c27 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendMailConfig.java @@ -0,0 +1,36 @@ +package uk.ac.ebi.spot.gwas.deposition.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class BackendMailConfig { + + @Value("${gwas-deposition.email-config.subject}") + private String subject; + + @Value("${gwas-deposition.email-config.emails.success}") + private String successEmail; + + @Value("${gwas-deposition.email-config.emails.fail}") + private String failEmail; + + @Value("${gwas-deposition.email-config.base-url}") + private String submissionsBaseURL; + + public String getSubmissionsBaseURL() { + return submissionsBaseURL; + } + + public String getSubject() { + return subject; + } + + public String getSuccessEmail() { + return successEmail; + } + + public String getFailEmail() { + return failEmail; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java index 1c184c4..7b37874 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/GWASDepositionBackendConfig.java @@ -30,9 +30,6 @@ public class GWASDepositionBackendConfig { @Value("${gwas-deposition.proxy-prefix:#{NULL}}") private String proxyPrefix; - @Value("${gwas-deposition.email-config.base-url}") - private String submissionsBaseURL; - @Value("${gwas-deposition.db:#{NULL}}") private String dbName; @@ -40,10 +37,6 @@ public String getDbName() { return dbName; } - public String getSubmissionsBaseURL() { - return submissionsBaseURL; - } - public boolean isAuthEnabled() { return authEnabled; } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MailConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MailConfig.java deleted file mode 100644 index e00ab6e..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MailConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component -public class MailConfig { - - @Value("${gwas-deposition.email-config.from-address}") - private String fromAddress; - - @Value("${gwas-deposition.email-config.from-name}") - private String fromName; - - @Value("${gwas-deposition.email-config.retries:3}") - private int retryCount; - - @Value("${gwas-deposition.email-config.subject}") - private String subject; - - @Value("${gwas-deposition.email-config.emails.success}") - private String successEmail; - - @Value("${gwas-deposition.email-config.emails.fail}") - private String failEmail; - - @Value("${gwas-deposition.email-config.email-enabled}") - private boolean emailEnabled; - - public String getFromAddress() { - return fromAddress; - } - - public String getFromName() { - return fromName; - } - - public String getSubject() { - return subject; - } - - public int getRetryCount() { - return retryCount; - } - - public String getSuccessEmail() { - return successEmail; - } - - public String getFailEmail() { - return failEmail; - } - - public boolean isEmailEnabled() { - return emailEnabled; - } -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java index da9e9fb..f992d42 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java @@ -12,6 +12,8 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; @@ -57,6 +59,9 @@ public class FileUploadsController { @Autowired private GWASDepositionBackendConfig gwasDepositionBackendConfig; + @Autowired + private AuditProxy auditProxy; + /* * POST /v1/submissions/{submissionId}/uploads */ @@ -79,6 +84,7 @@ public Resource uploadFile(@RequestParam MultipartFile file, } else { fileUpload = fileHandlerService.handleMetadataFile(submission, file, user); } + auditProxy.addAuditEntry(AuditHelper.fileCreated(user.getId(), fileUpload, submission)); final ControllerLinkBuilder lb = linkTo( methodOn(FileUploadsController.class).getFileUpload(submissionId, fileUpload.getId(), null)); @@ -105,6 +111,7 @@ public Resource getFileUpload(@PathVariable String submissionId, } FileUpload fileUpload = fileUploadsService.getFileUpload(fileUploadId); log.info("Returning file [{}] for submission: {}", fileUpload.getFileName(), submission.getId()); + auditProxy.addAuditEntry(AuditHelper.fileRetrieved(user.getId(), fileUpload)); final ControllerLinkBuilder lb = linkTo( methodOn(FileUploadsController.class).getFileUpload(submissionId, fileUploadId, null)); @@ -155,6 +162,7 @@ public HttpEntity downloadFile(@PathVariable String submissionId, log.info("[{}] Request to download file [{}] from submission: {}", user.getName(), fileUploadId, submissionId); Submission submission = submissionService.getSubmission(submissionId, user); FileUpload fileUpload = fileUploadsService.getFileUpload(fileUploadId); + auditProxy.addAuditEntry(AuditHelper.fileRetrieved(user.getId(), fileUpload)); byte[] payload = fileUploadsService.retrieveFileContent(fileUpload.getId()); log.info("Returning content for file [{}] for submission: {}", fileUpload.getFileName(), submission.getId()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java index 6c191a3..6209f36 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java @@ -13,6 +13,8 @@ import org.springframework.hateoas.mvc.ControllerLinkBuilder; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; @@ -49,6 +51,9 @@ public class ManuscriptController { @Autowired private UserService userService; + @Autowired + private AuditProxy auditProxy; + /** * GET /v1/manuscripts/{manuscriptId} */ @@ -59,6 +64,7 @@ public Resource getManuscript(@PathVariable String manuscriptId, User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to get manuscript: {}", user.getId(), manuscriptId); Manuscript manuscript = manuscriptService.retrieveManuscript(manuscriptId, user.getId()); + auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), manuscript)); log.info("Returning manuscript: {}", manuscript.getId()); return manuscriptDtoAssembler.toResource(manuscript); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 7e3fe70..d691c9b 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -15,6 +15,9 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditService; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; @@ -68,6 +71,9 @@ public class SubmissionsController { @Autowired private ManuscriptService manuscriptService; + @Autowired + private AuditProxy auditProxy; + /** * POST /v1/submissions */ @@ -80,16 +86,20 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to create new submission for publication: {}", user.getName(), submissionCreationDto.getPublication().getPmid()); + if (submissionCreationDto.getPublication().getPmid() == null) { log.info("Received submission based on manuscript: {}", submissionCreationDto.getPublication().getTitle()); Manuscript manuscript = ManuscriptDtoDisassembler.diassemble(submissionCreationDto.getPublication(), new Provenance(DateTime.now(), user.getId())); manuscript = manuscriptService.createManuscript(manuscript); + auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); + Submission submission = new Submission(manuscript.getId(), SubmissionProvenanceType.MANUSCRIPT.name(), new Provenance(DateTime.now(), user.getId())); submission = submissionService.createSubmission(submission); + auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), submission, manuscript)); return submissionAssemblyService.toResource(submission); } @@ -107,10 +117,12 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr user.getEmail())); if (outcome != null) { if (!outcome.isValid()) { + auditProxy.addAuditEntry(AuditHelper.globusFailed(user.getId(), submissionCreationDto.getPublication(), outcome)); log.error("Unable to create Globus folder: {}", outcome.getOutcome()); throw new EmailAccountNotLinkedToGlobusException(outcome.getOutcome()); } + auditProxy.addAuditEntry(AuditHelper.globusSuccess(user.getEmail(), submissionCreationDto.getPublication(), outcome)); submission.setGlobusFolderId(globusFolder); submission.setGlobusOriginId(outcome.getOutcome()); @@ -118,6 +130,8 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr publication.setStatus(PublicationStatus.UNDER_SUBMISSION.name()); submission.setType(SubmissionType.METADATA.name()); submission = submissionService.createSubmission(submission); + auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), + submission, submissionCreationDto.getPublication())); } if (publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { publication.setStatus(PublicationStatus.UNDER_SUMMARY_STATS_SUBMISSION.name()); @@ -129,6 +143,7 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr log.info("Returning new submission: {}", submission.getId()); return submissionAssemblyService.toResource(submission); } else { + auditProxy.addAuditEntry(AuditHelper.globusFailed(user.getId(), submissionCreationDto.getPublication(), outcome)); throw new SSGlobusFolderCreatioException("Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."); } } @@ -146,6 +161,7 @@ public Resource getSubmission(@PathVariable String submissionId, User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to retrieve submission: {}", user.getName(), submissionId); Submission submission = submissionService.getSubmission(submissionId, user); + auditProxy.addAuditEntry(AuditHelper.submissionRetrieved(user.getId(), submission)); log.info("Returning submission: {}", submission.getId()); return submissionAssemblyService.toResource(submission); } @@ -160,10 +176,12 @@ public void deleteSubmission(@PathVariable String submissionId, HttpServletReque log.info("[{}] Request to delete submission: {}", user.getName(), submissionId); Submission submission = submissionService.getSubmission(submissionId, user); if (submission.getOverallStatus().equalsIgnoreCase(Status.SUBMITTED.name())) { + auditProxy.addAuditEntry(AuditHelper.submissionDeleted(user.getId(), submission, false)); log.error("Unable to DELETE submission [{}]. Submission has already been SUBMITTED.", submissionId); throw new DeleteOnSubmittedSubmissionNotAllowedException("Unable to DELETE submission [" + submissionId + "]. Submission has already been SUBMITTED."); } + auditProxy.addAuditEntry(AuditHelper.submissionDeleted(user.getId(), submission, true)); submissionService.deleteSubmission(submissionId, user); Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); @@ -186,6 +204,7 @@ public Resource updateSubmission(@PathVariable String submissionI User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to submit submission: {}", user.getName(), submissionId); Submission submission = submissionService.updateSubmissionStatus(submissionId, Status.SUBMITTED.name(), user); + auditProxy.addAuditEntry(AuditHelper.submissionSubmit(user.getId(), submission)); log.info("Submissions successfully updated."); return submissionAssemblyService.toResource(submission); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java index fec81bc..779f0dd 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java @@ -4,6 +4,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; +import uk.ac.ebi.spot.gwas.deposition.config.BackendMailConfig; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.MailConstants; @@ -45,11 +48,17 @@ public class SSCallbackTask { private GWASDepositionBackendConfig gwasDepositionBackendConfig; @Autowired - private EmailService emailService; + private BackendEmailService backendEmailService; + + @Autowired + private BackendMailConfig backendMailConfig; @Autowired private PublicationService publicationService; + @Autowired + private AuditProxy auditProxy; + public void checkCallbackIds() { log.info("Running callback ID checks."); if (sumStatsService == null) { @@ -83,6 +92,7 @@ public void checkCallbackIds() { fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(null, fileUpload, errors, true)); callbackId.setValid(false); } } @@ -99,7 +109,7 @@ public void checkCallbackIds() { metadata.put(MailConstants.PUBLICATION_TITLE, publication.getTitle()); metadata.put(MailConstants.PMID, publication.getPmid()); metadata.put(MailConstants.FIRST_AUTHOR, publication.getFirstAuthor()); - metadata.put(MailConstants.SUBMISSION_ID, gwasDepositionBackendConfig.getSubmissionsBaseURL() + submission.getId()); + metadata.put(MailConstants.SUBMISSION_ID, backendMailConfig.getSubmissionsBaseURL() + submission.getId()); String userId = submission.getLastUpdated() != null ? submission.getLastUpdated().getUserId() : submission.getCreated().getUserId(); @@ -111,13 +121,16 @@ public void checkCallbackIds() { if (fileUpload != null) { fileUpload.setStatus(FileUploadStatus.VALID.name()); fileUploadsService.save(fileUpload); + auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(userId, fileUpload, true)); } - emailService.sendSuccessEmail(userId, publication.getPmid(), metadata); + backendEmailService.sendSuccessEmail(userId, publication.getPmid(), metadata); + auditProxy.addAuditEntry(AuditHelper.submissionSuccess(submission.getCreated().getUserId(), submission)); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); - emailService.sendFailEmail(userId, publication.getPmid(), metadata, errors); + backendEmailService.sendFailEmail(userId, publication.getPmid(), metadata, errors); + auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); } submissionService.saveSubmission(submission); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/EmailService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java similarity index 73% rename from src/main/java/uk/ac/ebi/spot/gwas/deposition/service/EmailService.java rename to src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java index 9954fc0..7f7f1a3 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/EmailService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java @@ -3,9 +3,7 @@ import java.util.List; import java.util.Map; -public interface EmailService { - - void sendMessage(String emailAddress, String content, String pubmedId); +public interface BackendEmailService { void sendSuccessEmail(String userId, String pubmedId, Map metadata); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java new file mode 100644 index 0000000..2eb3d5d --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java @@ -0,0 +1,57 @@ +package uk.ac.ebi.spot.gwas.deposition.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.config.BackendMailConfig; +import uk.ac.ebi.spot.gwas.deposition.constants.MailConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.User; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.EmailBuilder; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.EmailService; +import uk.ac.ebi.spot.gwas.deposition.service.BackendEmailService; +import uk.ac.ebi.spot.gwas.deposition.service.UserService; +import uk.ac.ebi.spot.gwas.deposition.service.impl.email.FailEmailBuilder; +import uk.ac.ebi.spot.gwas.deposition.service.impl.email.SuccessEmailBuilder; + +import java.util.List; +import java.util.Map; + +@Service +public class BackendEmailServiceImpl implements BackendEmailService { + + @Autowired(required = false) + private EmailService emailService; + + @Autowired + private BackendMailConfig backendMailConfig; + + @Autowired + private UserService userService; + + public void sendSuccessEmail(String userId, String pubmedId, Map metadata) { + User user = userService.getUser(userId); + metadata.put(MailConstants.USER_NAME, user.getName()); + + if (emailService != null) { + EmailBuilder successBuilder = new SuccessEmailBuilder(backendMailConfig.getSuccessEmail()); + emailService.sendMessage(user.getEmail(), getSubject(pubmedId), successBuilder.getEmailContent(metadata)); + } + } + + public void sendFailEmail(String userId, String pubmedId, Map metadata, List errors) { + User user = userService.getUser(userId); + metadata.put(MailConstants.USER_NAME, user.getName()); + + if (emailService != null) { + EmailBuilder failBuilder = new FailEmailBuilder(backendMailConfig.getFailEmail(), errors); + emailService.sendMessage(user.getEmail(), getSubject(pubmedId), failBuilder.getEmailContent(metadata)); + } + } + + private String getSubject(String pubmedId) { + String subject = backendMailConfig.getSubject(); + if (subject.contains("%PMID%")) { + subject = subject.replace("%PMID%", pubmedId); + } + return subject; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/EmailServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/EmailServiceImpl.java deleted file mode 100644 index 36e4dc3..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/EmailServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.service.impl; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import uk.ac.ebi.spot.gwas.deposition.config.MailConfig; -import uk.ac.ebi.spot.gwas.deposition.constants.MailConstants; -import uk.ac.ebi.spot.gwas.deposition.domain.User; -import uk.ac.ebi.spot.gwas.deposition.service.EmailService; -import uk.ac.ebi.spot.gwas.deposition.service.UserService; -import uk.ac.ebi.spot.gwas.deposition.service.impl.email.EmailBuilder; -import uk.ac.ebi.spot.gwas.deposition.service.impl.email.FailEmailBuilder; -import uk.ac.ebi.spot.gwas.deposition.service.impl.email.SuccessEmailBuilder; - -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.Map; - -@Service -public class EmailServiceImpl implements EmailService { - - private static final Logger log = LoggerFactory.getLogger(EmailService.class); - - @Autowired(required = false) - private JavaMailSender mailSender; - - @Autowired - private MailConfig mailConfig; - - @Autowired - private UserService userService; - - public void sendSuccessEmail(String userId, String pubmedId, Map metadata) { - User user = userService.getUser(userId); - metadata.put(MailConstants.USER_NAME, user.getName()); - - EmailBuilder successBuilder = new SuccessEmailBuilder(mailConfig.getSuccessEmail()); - this.sendMessage(user.getEmail(), successBuilder.getEmailContent(metadata), pubmedId); - } - - public void sendFailEmail(String userId, String pubmedId, Map metadata, List errors) { - User user = userService.getUser(userId); - metadata.put(MailConstants.USER_NAME, user.getName()); - - EmailBuilder failBuilder = new FailEmailBuilder(mailConfig.getFailEmail(), errors); - this.sendMessage(user.getEmail(), failBuilder.getEmailContent(metadata), pubmedId); - } - - @Override - @Async - public void sendMessage(String emailAddress, String content, String pubmedId) { - if (!mailConfig.isEmailEnabled()) { - log.info("Email sending is disabled."); - return; - } - - if (mailSender != null) { - if (content == null) { - log.error("Unable to send email. Content is null."); - return; - } - int retryCount = mailConfig.getRetryCount(); - for (int i = 0; i < retryCount; i++) { - try { - log.info("Building the email message to be sent"); - MimeMessage message = buildMessage(emailAddress, content, pubmedId); - log.info("Preparing to send the email: {}", message); - mailSender.send(message); - log.info("Successfully sent the email message."); - break; - } catch (Exception e) { - log.error("Exception received while trying to send out email: {}", e.getMessage(), e); - } - } - } else { - log.warn("Email sender configuration not present. Cannot send emails."); - } - } - - private MimeMessage buildMessage(String emailAddress, - String content, - String pubmedId) throws MessagingException, UnsupportedEncodingException { - log.info("Building the MimeMessage to be sent."); - MimeMessage mimeMessage = mailSender.createMimeMessage(); - mimeMessage.setFrom(new InternetAddress(mailConfig.getFromAddress(), mailConfig.getFromName())); - - mimeMessage.setContent(content, String.format("%s;%s", - doesStringContainHtml(content) ? "text/html" : "text/plain", "charset=utf-8")); - mimeMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailAddress)); - - String subject = mailConfig.getSubject(); - if (subject.contains("%PMID%")) { - subject = subject.replace("%PMID%", pubmedId); - } - mimeMessage.setSubject(subject); - return mimeMessage; - } - - private static boolean doesStringContainHtml(final String content) { - return content.replaceAll("\r\n|\n", "").matches(".*\\<[a-zA-Z]{1,}\\>.*\\.*"); - - } - -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java index 16b6491..6b51085 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java @@ -5,6 +5,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionType; @@ -21,6 +23,8 @@ import uk.ac.ebi.spot.gwas.template.validator.util.ErrorMessageTemplateProcessor; import uk.ac.ebi.spot.gwas.template.validator.util.StreamSubmissionTemplateReader; +import java.util.List; + @Service public class MetadataValidationServiceImpl implements MetadataValidationService { @@ -44,6 +48,9 @@ public class MetadataValidationServiceImpl implements MetadataValidationService @Autowired private ConversionService conversionService; + @Autowired + private AuditProxy auditProxy; + @Override @Async public void validateTemplate(String submissionId, FileUpload fileUpload, byte[] fileContent, User user) { @@ -99,16 +106,20 @@ public void validateTemplate(String submissionId, FileUpload fileUpload, byte[] } else { log.info("Validation outcome: {}", validationOutcome.getErrorMessages()); if (validationOutcome.getErrorMessages().isEmpty()) { + auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), fileUpload, false)); conversionService.convertData(submission, fileUpload, streamSubmissionTemplateReader, schema); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setMetadataStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); - fileUpload.setErrors(ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor)); + List errors = ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor); + fileUpload.setErrors(errors); fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); + auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); } } @@ -123,9 +134,12 @@ private void materializeError(Submission submission, FileUpload fileUpload, Stri submission.setMetadataStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); - fileUpload.setErrors(errorMessageTemplateProcessor.processGenericError(errorType, context)); + List errors = errorMessageTemplateProcessor.processGenericError(errorType, context); + fileUpload.setErrors(errors); fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); + auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java index a3feccf..979a04e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java @@ -8,6 +8,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; @@ -46,6 +48,9 @@ public class SubmissionServiceImpl implements SubmissionService { @Autowired private SummaryStatsEntryRepository summaryStatsEntryRepository; + @Autowired + private AuditProxy auditProxy; + @Override public Submission createSubmission(Submission submission) { log.info("Creating submission for publication: {}", submission.getPublicationId()); @@ -175,6 +180,7 @@ public void deleteSubmissionFile(Submission submission, String fileUploadId, Str submission.setSummaryStatsStatus(Status.NA.name()); submission.setLastUpdated(new Provenance(DateTime.now(), userId)); submissionRepository.save(submission); + auditProxy.addAuditEntry(AuditHelper.fileDeleted(userId, fileUpload)); } private void deleteCallbackId(String callbackId) { diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java index e2036df..b3593e2 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java @@ -5,8 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; -import uk.ac.ebi.spot.gwas.deposition.constants.PublicationStatus; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSWrapUpRequestDto; @@ -47,6 +48,9 @@ public class SummaryStatsProcessingServiceImpl implements SummaryStatsProcessing @Autowired private SSTemplateEntryPlaceholderRepository ssTemplateEntryPlaceholderRepository; + @Autowired + private AuditProxy auditProxy; + @Override @Async public void processSummaryStats(Submission submission, String fileUploadId, List summaryStatsEntries) { @@ -80,9 +84,12 @@ public void processSummaryStats(Submission submission, String fileUploadId, List submission.setSummaryStatsStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); + List errors = Arrays.asList(new String[]{"Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."}); fileUpload.setStatus(FileUploadStatus.INVALID.name()); - fileUpload.setErrors(Arrays.asList(new String[]{"Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."})); + fileUpload.setErrors(errors); fileUploadsService.save(fileUpload); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, true)); + auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); } else { log.info("Successfully registered {} summary stats with callback ID: {}", summaryStatsEntries.size(), callbackId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java index ffda2d5..4152593 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java @@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadType; import uk.ac.ebi.spot.gwas.deposition.constants.Status; @@ -55,6 +57,9 @@ public class SummaryStatsValidationServiceImpl implements SummaryStatsValidation @Autowired private ValidatorConfig validatorConfig; + @Autowired + private AuditProxy auditProxy; + @Async @Override public void validateSummaryStatsData(Submission submission) { @@ -152,18 +157,22 @@ public void validateSummaryStatsData(Submission submission) { this.markInvalidFile(dataFile, submission, ErrorType.INVALID_FILE, dataFile.getFileName(), dataReader, schemaReader); } if (validationOutcome.getErrorMessages().isEmpty()) { + auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), dataFile, false)); conversionService.convertData(submission, dataFile, dataReader, schema); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); - dataFile.setErrors(errorMessageTemplateProcessor.processGenericError(ErrorType.STUDY_DATA_MISMATCH, - StringUtils.join(validationOutcome.getErrorMessages().get(validatorConfig.getSsContentValidationSheet()), ","))); + List errors = errorMessageTemplateProcessor.processGenericError(ErrorType.STUDY_DATA_MISMATCH, + StringUtils.join(validationOutcome.getErrorMessages().get(validatorConfig.getSsContentValidationSheet()), ",")); + dataFile.setErrors(errors); dataFile.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(dataFile); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), dataFile, errors, false)); } } else { + auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), dataFile, false)); conversionService.convertData(submission, dataFile, dataReader, schema); } } else { @@ -171,11 +180,13 @@ public void validateSummaryStatsData(Submission submission) { submission.setSummaryStatsStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); - dataFile.setErrors(ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor)); + List errors = ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor); + dataFile.setErrors(errors); dataFile.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(dataFile); dataReader.close(); schemaReader.close(); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), dataFile, errors, false)); } } @@ -188,9 +199,11 @@ public void validateSummaryStatsData(Submission submission) { private void markInvalidFile(FileUpload fileUpload, Submission submission, String errorType, String context, StreamSubmissionTemplateReader dataReader, StreamSubmissionTemplateReader schemaReader) { - fileUpload.setErrors(errorMessageTemplateProcessor.processGenericError(errorType, context)); + List errors = errorMessageTemplateProcessor.processGenericError(errorType, context); + fileUpload.setErrors(errors); fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); + auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); submission.setSummaryStatsStatus(Status.INVALID.name()); submission.setOverallStatus(Status.INVALID.name()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/AbstractEmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/AbstractEmailBuilder.java deleted file mode 100644 index 0cfd918..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/AbstractEmailBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.service.impl.email; - -import org.apache.commons.io.IOUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.DefaultResourceLoader; -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.StringTemplateResolver; - -import java.io.IOException; -import java.io.InputStream; - -public abstract class AbstractEmailBuilder implements EmailBuilder { - - private static final Logger log = LoggerFactory.getLogger(EmailBuilder.class); - - protected TemplateEngine templateEngine; - - protected String emailFile; - - public AbstractEmailBuilder(String emailFile) { - templateEngine = new TemplateEngine(); - StringTemplateResolver templateResolver = new StringTemplateResolver(); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateEngine.setTemplateResolver(templateResolver); - - this.emailFile = emailFile; - } - - public String readEmailContent() { - log.info("Reading email content from: {}", emailFile); - try { - InputStream inputStream = new DefaultResourceLoader().getResource(emailFile).getInputStream(); - String emailContent = IOUtils.toString(inputStream, "UTF-8"); - return emailContent; - } catch (IOException e) { - log.error("Unable to read email content from [{}]: {}", emailFile, e.getMessage(), e); - return null; - } - } - -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/EmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/EmailBuilder.java deleted file mode 100644 index ff51a41..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/EmailBuilder.java +++ /dev/null @@ -1,9 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.service.impl.email; - -import java.util.Map; - -public interface EmailBuilder { - - String getEmailContent(Map metadata); - -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java index 7dcff7b..5682e2d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java @@ -4,6 +4,8 @@ import org.slf4j.LoggerFactory; import org.thymeleaf.context.Context; import uk.ac.ebi.spot.gwas.deposition.constants.MailConstants; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.AbstractEmailBuilder; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.EmailBuilder; import java.util.List; import java.util.Map; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java index 95ada25..d0d0f07 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java @@ -3,6 +3,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.thymeleaf.context.Context; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.AbstractEmailBuilder; +import uk.ac.ebi.spot.gwas.deposition.messaging.email.EmailBuilder; import java.util.Map; diff --git a/src/main/resources/application-prod-fallback.yml b/src/main/resources/application-prod-fallback.yml index bc78188..104fd93 100644 --- a/src/main/resources/application-prod-fallback.yml +++ b/src/main/resources/application-prod-fallback.yml @@ -36,8 +36,9 @@ gwas-deposition: db: gwasdepo solr: enabled: true - email-config: - email-enabled: true + +email: + enabled: true gwas-template-service: enabled: true diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index ce0ed09..d046dce 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -36,8 +36,9 @@ gwas-deposition: db: gwasdepo solr: enabled: true - email-config: - email-enabled: true + +email: + enabled: true gwas-template-service: enabled: true diff --git a/src/main/resources/application-sandbox.yml b/src/main/resources/application-sandbox.yml index c67477a..89206bc 100644 --- a/src/main/resources/application-sandbox.yml +++ b/src/main/resources/application-sandbox.yml @@ -36,7 +36,9 @@ gwas-deposition: enabled: true email-config: base-url: http://193.62.54.159/gwas/deposition/submission/ - email-enabled: true + +email: + enabled: true gwas-template-service: enabled: true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ed18fbe..cc8d5f0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -39,10 +39,6 @@ gwas-deposition: solr: enabled: false email-config: - email-enabled: false - from-address: no-reply@ebi.ac.uk - from-name: GWAS Curation - retries: 3 subject: GWAS Catalog submission for publication %PMID% base-url: https://www.ebi.ac.uk/gwas/deposition/submission/ emails: @@ -53,6 +49,13 @@ solr: enable: alias: false +email: + enabled: false + config: + from-address: no-reply@ebi.ac.uk + from-name: GWAS Curation + retries: 3 + audit: enabled: false url: http://gwas-audit-service:8080 diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index 321c8f6..f5abb20 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -90,11 +90,11 @@ public SumStatsService sumStatsService() { } @Configuration - public static class MockEmailServiceConfig { + public static class MockBackendEmailServiceConfig { @Bean - public EmailService emailService() { - return mock(EmailService.class); + public BackendEmailService backendEmailService() { + return mock(BackendEmailService.class); } } diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java index b4627ed..6c01460 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java @@ -18,7 +18,7 @@ import uk.ac.ebi.spot.gwas.deposition.repository.*; import uk.ac.ebi.spot.gwas.deposition.rest.IntegrationTest; import uk.ac.ebi.spot.gwas.deposition.scheduler.tasks.SSCallbackTask; -import uk.ac.ebi.spot.gwas.deposition.service.EmailService; +import uk.ac.ebi.spot.gwas.deposition.service.BackendEmailService; import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; import java.util.ArrayList; @@ -34,7 +34,7 @@ @ContextConfiguration(classes = {IntegrationTest.MockJWTServiceConfig.class, IntegrationTest.MockTaskExecutorConfig.class, IntegrationTest.MockSumStatsServiceConfig.class, - IntegrationTest.MockEmailServiceConfig.class}) + IntegrationTest.MockBackendEmailServiceConfig.class}) public class SSCallbackTaskTest extends IntegrationTest { @Autowired @@ -62,7 +62,7 @@ public class SSCallbackTaskTest extends IntegrationTest { private SummaryStatsEntryRepository summaryStatsEntryRepository; @Autowired - private EmailService emailService; + private BackendEmailService backendEmailService; @Autowired private PublicationRepository publicationRepository; @@ -119,8 +119,8 @@ public void setup() { RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10)); summaryStatsEntry = summaryStatsEntryRepository.insert(summaryStatsEntry); - doNothing().when(emailService).sendSuccessEmail(any(), any(), any()); - doNothing().when(emailService).sendFailEmail(any(), any(), any(), any()); + doNothing().when(backendEmailService).sendSuccessEmail(any(), any(), any()); + doNothing().when(backendEmailService).sendFailEmail(any(), any(), any(), any()); } @Test diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/service/GWASCatalogRESTServiceTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/service/GWASCatalogRESTServiceTest.java index 7e4d50a..573b440 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/service/GWASCatalogRESTServiceTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/service/GWASCatalogRESTServiceTest.java @@ -1,6 +1,7 @@ package uk.ac.ebi.spot.gwas.deposition.service; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateEntryDto; @@ -23,6 +24,7 @@ public void setup() { } @Test + @Ignore public void shouldRetrievePMIDData() { List list = gwasCatalogRESTService.getSSTemplateEntries(pmid); assertEquals(36, list.size()); From 1f221858037a62154a4a5aebe2539bff73914fdd Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Mon, 30 Mar 2020 21:11:59 +0800 Subject: [PATCH 04/23] WIP: GCP deployment --- .gitlab-ci.yml | 24 +++++++++-- build.sh | 5 +++ deploy.sh | 4 ++ .../gwas-deposition-backend-deployment.yaml | 5 ++- k8chart/values.yaml | 10 ++--- .../gwas/deposition/config/MongoConfig.java | 41 +++++++++++++++++++ .../resources/application-gcp-sandbox.yml | 36 ++++++++++++++++ src/main/resources/logback-spring.xml | 31 ++++++++++++++ .../resources/logging-gcp-sandbox.properties | 3 ++ .../resources/quartz/environment-config.yaml | 9 ++++ 10 files changed, 158 insertions(+), 10 deletions(-) create mode 100755 build.sh create mode 100755 deploy.sh create mode 100644 src/main/resources/application-gcp-sandbox.yml create mode 100644 src/main/resources/logging-gcp-sandbox.properties diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bd3300b..1dd4185 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,17 +53,35 @@ deploy-backend-sandbox: image: dtzar/helm-kubectl:2.13.1 stage: deploy-sandbox script: - - echo "Deploy to sandbox server" + - echo "Deploy to GCP sandbox server" - mkdir -p /root/.kube - - echo ${SANBOX_KUBECONF} | base64 -d > /root/.kube/config + - echo ${GCP_KUBECONF} | base64 -d > /root/.kube/kubeconfig.yaml + - echo ${GCP_ROBOT_CREDENTIALS} | base64 -d > /root/.kube/robot-k8-sandbox.json + - export GOOGLE_APPLICATION_CREDENTIALS=/root/.kube/tudor-k8-sandbox.json + - export KUBECONFIG=/root/.kube/kubeconfig.yaml - helm init - helm delete --purge gwas-deposition-backend || true - - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait + - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.env.envName=gcp-sandbox,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait environment: name: sandbox only: - develop +#deploy-backend-sandbox: +# image: dtzar/helm-kubectl:2.13.1 +# stage: deploy-sandbox +# script: +# - echo "Deploy to sandbox server" +# - mkdir -p /root/.kube +# - echo ${SANBOX_KUBECONF} | base64 -d > /root/.kube/config +# - helm init +# - helm delete --purge gwas-deposition-backend || true +# - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait +# environment: +# name: sandbox +# only: +# - develop + deploy-fallback: image: dtzar/helm-kubectl:2.13.1 stage: deploy-fallback diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5c19dd8 --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +docker build --force-rm=true -t gwas-deposition-backend:latest . +docker tag gwas-deposition-backend:latest ebispot/gwas-deposition-backend:latest-sandbox +docker push ebispot/gwas-deposition-backend:latest-sandbox diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..20ab19c --- /dev/null +++ b/deploy.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +kubectl delete deploy gwas-deposition-backend -n gwas +kubectl apply -f /home/tudor/Desktop/_deployment_plans_/gwas-deposition-backend-deployment.yaml diff --git a/k8chart/templates/gwas-deposition-backend-deployment.yaml b/k8chart/templates/gwas-deposition-backend-deployment.yaml index ee5ae50..70aac7b 100644 --- a/k8chart/templates/gwas-deposition-backend-deployment.yaml +++ b/k8chart/templates/gwas-deposition-backend-deployment.yaml @@ -52,8 +52,9 @@ spec: key: {{.Values.image.env.secretsKey}} volumes: - name: log - persistentVolumeClaim: - claimName: {{ .Values.image.volume.claimName }} + nfs: + server: 10.100.0.3 + path: "/var/nfs" --- kind: Service apiVersion: v1 diff --git a/k8chart/values.yaml b/k8chart/values.yaml index 45f8196..c7b5e7f 100644 --- a/k8chart/values.yaml +++ b/k8chart/values.yaml @@ -13,8 +13,8 @@ image: env: envName: "sandbox" logFileName: "deposition-service" - xms: "-Xms4096m" - xmx: "-Xmx4096m" + xms: "-Xms1024m" + xmx: "-Xmx1024m" dbUser: "" secretsName: "" secretsKey: "" @@ -49,11 +49,11 @@ k8Namespace: default resources: limits: - cpu: 250m - memory: 5120Mi + cpu: 200m + memory: 1024Mi requests: cpu: 100m - memory: 4096Mi + memory: 1024Mi nodeSelector: {} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java index b68326b..a2e46b4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/MongoConfig.java @@ -120,4 +120,45 @@ public MongoClient mongoClient() { return new MongoClient(new MongoClientURI("mongodb://" + credentials + mongoUri)); } } + + @Configuration + @EnableMongoRepositories(basePackages = {"uk.ac.ebi.spot.gwas.deposition.repository"}) + @EnableTransactionManagement + @Profile({"gcp-sandbox"}) + public static class MongoConfiGCPSandbox extends AbstractMongoConfiguration { + + @Autowired + private SystemConfigProperties systemConfigProperties; + + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + + @Override + protected String getDatabaseName() { + return gwasDepositionBackendConfig.getDbName(); + } + + @Bean + public GridFsTemplate gridFsTemplate() throws Exception { + return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter()); + } + + @Override + public MongoClient mongoClient() { + String mongoUri = systemConfigProperties.getMongoUri(); + String dbUser = systemConfigProperties.getDbUser(); + String dbPassword = systemConfigProperties.getDbPassword(); + String credentials = ""; + if (dbUser != null && dbPassword != null) { + dbUser = dbUser.trim(); + dbPassword = dbPassword.trim(); + if (!dbUser.equalsIgnoreCase("") && + !dbPassword.equalsIgnoreCase("")) { + credentials = dbUser + ":" + dbPassword + "@"; + } + } + + return new MongoClient(new MongoClientURI("mongodb+srv://" + credentials + mongoUri)); + } + } } diff --git a/src/main/resources/application-gcp-sandbox.yml b/src/main/resources/application-gcp-sandbox.yml new file mode 100644 index 0000000..5afaba2 --- /dev/null +++ b/src/main/resources/application-gcp-sandbox.yml @@ -0,0 +1,36 @@ +server: + port: 8080 + +spring: + main: + allow-bean-definition-overriding: true + data: + mongodb: + uri: deposition-sandbox-x7yjx.gcp.mongodb.net/test?retryWrites=true&w=majority + +quartz: + scheduler: + dbName: deposition-backend-sandbox + +gwas-deposition: + auth: + enabled: false + db: deposition-backend-sandbox + proxy-prefix: /gwas/deposition/api + solr: + enabled: false + email-config: + base-url: http://193.62.54.159/gwas/deposition/submission/ + +email: + enabled: false + +gwas-template-service: + enabled: true + +gwas-catalog-service: + enabled: false + +solr: + enable: + alias: true diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index baff33a..0f3399c 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -141,4 +141,35 @@ + + + + + + + ${log.file.location}${log.file.name}-%d{yyyy-MM-dd}.%i.log + + + ${log.max.file.size} + + + + ${log.pattern} + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logging-gcp-sandbox.properties b/src/main/resources/logging-gcp-sandbox.properties new file mode 100644 index 0000000..fe5aa16 --- /dev/null +++ b/src/main/resources/logging-gcp-sandbox.properties @@ -0,0 +1,3 @@ +log.max.file.size=1000MB +log.file.location=/var/log/gwas/ +log.pattern=%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"} %-5level [%thread] %property{serviceName} %logger{0}: %msg%n diff --git a/src/main/resources/quartz/environment-config.yaml b/src/main/resources/quartz/environment-config.yaml index dbec9b7..af35795 100644 --- a/src/main/resources/quartz/environment-config.yaml +++ b/src/main/resources/quartz/environment-config.yaml @@ -2,15 +2,24 @@ environments: - name: dev config: application-dev.yml dev: true + gcp: false - name: test config: application-test.yml dev: true + gcp: false - name: sandbox config: application-sandbox.yml dev: false + gcp: false - name: prod config: application-prod.yml dev: false + gcp: false - name: prod-fallback config: application-prod-fallback.yml dev: false + gcp: false +- name: gcp-sandbox + config: application-gcp-sandbox.yml + dev: false + gcp: true From 5917638f9badd78b7d76fe1b3c6db5e8b968e5df Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 1 Apr 2020 23:15:04 +0800 Subject: [PATCH 05/23] WIP: Refactoring body of work. --- pom.xml | 2 +- .../config/ExceptionHandlerAdvice.java | 7 + .../GWASDepositionBackendConstants.java | 2 +- ...ository.java => BodyOfWorkRepository.java} | 8 +- ...troller.java => BodyOfWorkController.java} | 64 +++++--- .../controllers/SubmissionsController.java | 29 ++-- .../rest/dto/BodyOfWorkDtoAssembler.java | 84 ++++++++++ .../rest/dto/BodyOfWorkDtoDisassembler.java | 43 +++++ .../rest/dto/ManuscriptDtoAssembler.java | 54 ------ .../rest/dto/ManuscriptDtoDisassembler.java | 22 --- .../rest/dto/SubmissionDtoAssembler.java | 4 +- .../deposition/service/BodyOfWorkService.java | 13 ++ .../deposition/service/ManuscriptService.java | 13 -- .../service/impl/BodyOfWorkServiceImpl.java | 51 ++++++ .../service/impl/ManuscriptServiceImpl.java | 51 ------ .../impl/SubmissionAssemblyService.java | 12 +- .../rest/AssociationsControllerTest.java | 1 + .../rest/BodyOfWorkControllerTest.java | 155 ++++++++++++++++++ .../rest/FileUploadsControllerSSTest.java | 1 + .../gwas/deposition/rest/IntegrationTest.java | 16 +- .../rest/ManuscriptControllerTest.java | 114 ------------- .../rest/SamplesControllerTest.java | 1 + .../rest/StudiesControllerTest.java | 1 + .../rest/SubmissionsControllerTest.java | 25 ++- .../spot/gwas/deposition/util/TestUtil.java | 23 ++- 25 files changed, 469 insertions(+), 327 deletions(-) rename src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/{ManuscriptRepository.java => BodyOfWorkRepository.java} (55%) rename src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/{ManuscriptController.java => BodyOfWorkController.java} (50%) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java delete mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java create mode 100644 src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java delete mode 100644 src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java diff --git a/pom.xml b/pom.xml index f0f6a76..5aca6d5 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ uk.ac.ebi.spot.gwasdepo gwasdepo-commons - 1.0.2-SNAPSHOT + 1.0.3-SNAPSHOT uk.ac.ebi.spot.gwasdepo diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java index 5cd1a28..c68c86f 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java @@ -34,6 +34,13 @@ public ResponseEntity handleSubmissionOnUnacceptedPublicationTypeExcepti return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.BAD_REQUEST); } + @ExceptionHandler(InvalidSubmissionTypeException.class) + public ResponseEntity handleInvalidSubmissionTypeExceptionException(InvalidSubmissionTypeException e) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.BAD_REQUEST); + } + @ExceptionHandler(SSGlobusFolderCreatioException.class) public ResponseEntity handleSSGlobusFolderCreatioException(SSGlobusFolderCreatioException e) { HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index 7365555..66f0e6e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -6,7 +6,7 @@ public class GWASDepositionBackendConstants { public static final String API_PUBLICATIONS = "/publications"; - public static final String API_MANUSCRIPTS = "/manuscripts"; + public static final String API_BODY_OF_WORK = "/bodyofwork"; public static final String API_SUBMISSIONS = "/submissions"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java similarity index 55% rename from src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java rename to src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java index 0ae0ae7..81552b8 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/ManuscriptRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java @@ -3,14 +3,14 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.repository.MongoRepository; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import java.util.Optional; -public interface ManuscriptRepository extends MongoRepository { +public interface BodyOfWorkRepository extends MongoRepository { - Optional findByIdAndArchivedAndCreated_UserId(String id, boolean archived, String userId); + Optional findByIdAndArchivedAndCreated_UserId(String id, boolean archived, String userId); - Page findByArchivedAndCreated_UserId(boolean archived, String userId, Pageable page); + Page findByArchivedAndCreated_UserId(boolean archived, String userId, Pageable page); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java similarity index 50% rename from src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java rename to src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index 6209f36..41bfc18 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/ManuscriptController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -1,5 +1,6 @@ package uk.ac.ebi.spot.gwas.deposition.rest.controllers; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,17 +14,18 @@ import org.springframework.hateoas.mvc.ControllerLinkBuilder; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.domain.User; -import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoDisassembler; +import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; import uk.ac.ebi.spot.gwas.deposition.service.JWTService; -import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; import uk.ac.ebi.spot.gwas.deposition.service.UserService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; import uk.ac.ebi.spot.gwas.deposition.util.HeadersUtil; @@ -31,16 +33,16 @@ import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_MANUSCRIPTS) -public class ManuscriptController { +@RequestMapping(value = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK) +public class BodyOfWorkController { private static final Logger log = LoggerFactory.getLogger(PublicationsController.class); @Autowired - private ManuscriptService manuscriptService; + private BodyOfWorkService bodyOfWorkService; @Autowired - private ManuscriptDtoAssembler manuscriptDtoAssembler; + private BodyOfWorkDtoAssembler bodyOfWorkDtoAssembler; @Autowired private GWASDepositionBackendConfig gwasDepositionBackendConfig; @@ -55,36 +57,52 @@ public class ManuscriptController { private AuditProxy auditProxy; /** - * GET /v1/manuscripts/{manuscriptId} + * POST /v1/bodyofwork */ - @GetMapping(value = "/{manuscriptId}", produces = "application/hal+json") + @PostMapping(produces = "application/hal+json") + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public Resource createBodyOfWork(@RequestBody BodyOfWorkDto bodyOfWorkDto, HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to create body of work: {}", user.getId(), bodyOfWorkDto.getTitle()); + BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(bodyOfWorkDto, new Provenance(DateTime.now(), user.getId())); + bodyOfWork = bodyOfWorkService.createBodyOfWork(bodyOfWork); +// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + log.info("Body of work created: {}", bodyOfWork.getId()); + return bodyOfWorkDtoAssembler.toResource(bodyOfWork); + } + + /** + * GET /v1/bodyofwork/{bodyofworkId} + */ + @GetMapping(value = "/{bodyofworkId}", produces = "application/hal+json") @ResponseStatus(HttpStatus.OK) - public Resource getManuscript(@PathVariable String manuscriptId, + public Resource getBodyOfWork(@PathVariable String bodyofworkId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); - log.info("[{}] Request to get manuscript: {}", user.getId(), manuscriptId); - Manuscript manuscript = manuscriptService.retrieveManuscript(manuscriptId, user.getId()); - auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), manuscript)); - log.info("Returning manuscript: {}", manuscript.getId()); - return manuscriptDtoAssembler.toResource(manuscript); + log.info("[{}] Request to get body of work: {}", user.getId(), bodyofworkId); + BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user.getId()); +// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + log.info("Returning body of work: {}", bodyOfWork.getId()); + return bodyOfWorkDtoAssembler.toResource(bodyOfWork); } /** - * GET /v1/manuscripts + * GET /v1/bodyofwork */ @GetMapping(produces = "application/hal+json") @ResponseStatus(HttpStatus.OK) - public PagedResources getManuscripts(@PageableDefault(size = 20, page = 0) Pageable pageable, + public PagedResources getBodyOfWorks(@PageableDefault(size = 20, page = 0) Pageable pageable, PagedResourcesAssembler assembler, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); - log.info("[{}] Request to retrieve manuscripts.", user.getId()); - Page facetedManuscripts = manuscriptService.retrieveManuscripts(user.getId(), pageable); + log.info("[{}] Request to retrieve body of works.", user.getId()); + Page facetedBodyOfWorks = bodyOfWorkService.retrieveBodyOfWorks(user.getId(), pageable); final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( - ControllerLinkBuilder.methodOn(ManuscriptController.class).getManuscripts(pageable, assembler, null)); + ControllerLinkBuilder.methodOn(BodyOfWorkController.class).getBodyOfWorks(pageable, assembler, null)); - return assembler.toResource(facetedManuscripts, manuscriptDtoAssembler, + return assembler.toResource(facetedBodyOfWorks, bodyOfWorkDtoAssembler, new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index d691c9b..3d8e5a5 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -17,18 +17,14 @@ import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; -import uk.ac.ebi.spot.gwas.deposition.audit.AuditService; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSGlobusFolderDto; -import uk.ac.ebi.spot.gwas.deposition.exception.DeleteOnSubmittedSubmissionNotAllowedException; -import uk.ac.ebi.spot.gwas.deposition.exception.EmailAccountNotLinkedToGlobusException; -import uk.ac.ebi.spot.gwas.deposition.exception.SSGlobusFolderCreatioException; -import uk.ac.ebi.spot.gwas.deposition.exception.SubmissionOnUnacceptedPublicationTypeException; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoDisassembler; +import uk.ac.ebi.spot.gwas.deposition.exception.*; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoDisassembler; import uk.ac.ebi.spot.gwas.deposition.service.*; import uk.ac.ebi.spot.gwas.deposition.service.impl.SubmissionAssemblyService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; @@ -69,7 +65,7 @@ public class SubmissionsController { private SumStatsService sumStatsService; @Autowired - private ManuscriptService manuscriptService; + private BodyOfWorkService bodyOfWorkService; @Autowired private AuditProxy auditProxy; @@ -87,19 +83,22 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr log.info("[{}] Request to create new submission for publication: {}", user.getName(), submissionCreationDto.getPublication().getPmid()); - if (submissionCreationDto.getPublication().getPmid() == null) { - log.info("Received submission based on manuscript: {}", submissionCreationDto.getPublication().getTitle()); - Manuscript manuscript = ManuscriptDtoDisassembler.diassemble(submissionCreationDto.getPublication(), + if (submissionCreationDto.getPublication() == null) { + if (submissionCreationDto.getBodyOfWork() == null) { + throw new InvalidSubmissionTypeException("Submission is missing body payload."); + } + log.info("Received submission based on body of work: {}", submissionCreationDto.getBodyOfWork().getTitle()); + BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(submissionCreationDto.getBodyOfWork(), new Provenance(DateTime.now(), user.getId())); - manuscript = manuscriptService.createManuscript(manuscript); - auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); + bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getId(), user.getId()); +// auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); - Submission submission = new Submission(manuscript.getId(), - SubmissionProvenanceType.MANUSCRIPT.name(), + Submission submission = new Submission(bodyOfWork.getId(), + SubmissionProvenanceType.BODY_OF_WORK.name(), new Provenance(DateTime.now(), user.getId())); submission = submissionService.createSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), submission, manuscript)); +// auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), submission, manuscript)); return submissionAssemblyService.toResource(submission); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java new file mode 100644 index 0000000..bf32681 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java @@ -0,0 +1,84 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Resource; +import org.springframework.hateoas.ResourceAssembler; +import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; +import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; +import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; +import uk.ac.ebi.spot.gwas.deposition.rest.controllers.BodyOfWorkController; +import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class BodyOfWorkDtoAssembler implements ResourceAssembler> { + + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + + public static BodyOfWorkDto assemble(BodyOfWork bodyOfWork) { + List correspondingAuthorDtoList = new ArrayList<>(); + if (bodyOfWork.getCorrespondingAuthors() != null) { + for (CorrespondingAuthor correspondingAuthor : bodyOfWork.getCorrespondingAuthors()) { + correspondingAuthorDtoList.add(new CorrespondingAuthorDto(correspondingAuthor.getAuthorName(), + correspondingAuthor.getEmail())); + } + } + + return new BodyOfWorkDto(bodyOfWork.getId(), + bodyOfWork.getTitle(), + bodyOfWork.getDescription(), + bodyOfWork.getFirstAuthorFirstName(), + bodyOfWork.getFirstAuthorLastName(), + bodyOfWork.getJournal(), + bodyOfWork.getDoi(), + bodyOfWork.getUrl(), + correspondingAuthorDtoList, + bodyOfWork.getPrePrintServer(), + bodyOfWork.getPreprintServerDOI(), + bodyOfWork.getEmbargoDate(), + bodyOfWork.getEmbargoUntilPublished(), + bodyOfWork.getPmids(), + bodyOfWork.getStatus()); + } + + @Override + public Resource toResource(BodyOfWork bodyOfWork) { + List correspondingAuthorDtoList = new ArrayList<>(); + if (bodyOfWork.getCorrespondingAuthors() != null) { + for (CorrespondingAuthor correspondingAuthor : bodyOfWork.getCorrespondingAuthors()) { + correspondingAuthorDtoList.add(new CorrespondingAuthorDto(correspondingAuthor.getAuthorName(), + correspondingAuthor.getEmail())); + } + } + + BodyOfWorkDto bodyOfWorkDto = new BodyOfWorkDto(bodyOfWork.getId(), + bodyOfWork.getTitle(), + bodyOfWork.getDescription(), + bodyOfWork.getFirstAuthorFirstName(), + bodyOfWork.getFirstAuthorLastName(), + bodyOfWork.getJournal(), + bodyOfWork.getDoi(), + bodyOfWork.getUrl(), + correspondingAuthorDtoList, + bodyOfWork.getPrePrintServer(), + bodyOfWork.getPreprintServerDOI(), + bodyOfWork.getEmbargoDate(), + bodyOfWork.getEmbargoUntilPublished(), + bodyOfWork.getPmids(), + bodyOfWork.getStatus()); + + final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( + ControllerLinkBuilder.methodOn(BodyOfWorkController.class).getBodyOfWork(bodyOfWork.getId(), null)); + + Resource resource = new Resource<>(bodyOfWorkDto); + resource.add(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).withSelfRel()); + return resource; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java new file mode 100644 index 0000000..8e5da4a --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java @@ -0,0 +1,43 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; +import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; + +import java.util.ArrayList; +import java.util.List; + +public class BodyOfWorkDtoDisassembler { + + public static BodyOfWork disassemble(BodyOfWorkDto bodyOfWorkDto, Provenance provenance) { + List correspondingAuthorList = new ArrayList<>(); + if (bodyOfWorkDto.getCorrespondingAuthors() != null) { + for (CorrespondingAuthorDto correspondingAuthor : bodyOfWorkDto.getCorrespondingAuthors()) { + correspondingAuthorList.add(new CorrespondingAuthor(correspondingAuthor.getAuthorName(), + correspondingAuthor.getEmail())); + } + } + + BodyOfWork bodyOfWork = new BodyOfWork(bodyOfWorkDto.getTitle(), + bodyOfWorkDto.getDescription(), + bodyOfWorkDto.getJournal(), + bodyOfWorkDto.getDoi(), + bodyOfWorkDto.getUrl(), + bodyOfWorkDto.getFirstAuthorFirstName(), + bodyOfWorkDto.getFirstAuthorLastName(), + correspondingAuthorList, + bodyOfWorkDto.getPmids(), + bodyOfWorkDto.getPrePrintServer(), + bodyOfWorkDto.getPreprintServerDOI(), + bodyOfWorkDto.getEmbargoDate(), + bodyOfWorkDto.getEmbargoUntilPublished(), + provenance); + if (bodyOfWorkDto.getBodyOfWorkId() != null) { + bodyOfWork.setId(bodyOfWorkDto.getBodyOfWorkId()); + } + return bodyOfWork; + } + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java deleted file mode 100644 index 8320f17..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoAssembler.java +++ /dev/null @@ -1,54 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.rest.dto; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.ResourceAssembler; -import org.springframework.hateoas.mvc.ControllerLinkBuilder; -import org.springframework.stereotype.Component; -import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; -import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; -import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; -import uk.ac.ebi.spot.gwas.deposition.rest.controllers.ManuscriptController; -import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; - -@Component -public class ManuscriptDtoAssembler implements ResourceAssembler> { - - @Autowired - private GWASDepositionBackendConfig gwasDepositionBackendConfig; - - public static ManuscriptDto assemble(Manuscript manuscript) { - return new ManuscriptDto(manuscript.getId(), - manuscript.getTitle(), - manuscript.getJournal(), - manuscript.getFirstAuthor(), - manuscript.getSubmissionDate(), - manuscript.getAcceptanceDate(), - manuscript.getCorrespondingAuthor() != null ? - new CorrespondingAuthorDto(manuscript.getCorrespondingAuthor().getAuthorName(), - manuscript.getCorrespondingAuthor().getEmail()) : null, - manuscript.getStatus()); - } - - @Override - public Resource toResource(Manuscript manuscript) { - ManuscriptDto manuscriptDto = new ManuscriptDto(manuscript.getId(), - manuscript.getTitle(), - manuscript.getJournal(), - manuscript.getFirstAuthor(), - manuscript.getSubmissionDate(), - manuscript.getAcceptanceDate(), - manuscript.getCorrespondingAuthor() != null ? - new CorrespondingAuthorDto(manuscript.getCorrespondingAuthor().getAuthorName(), - manuscript.getCorrespondingAuthor().getEmail()) : null, - manuscript.getStatus()); - - final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( - ControllerLinkBuilder.methodOn(ManuscriptController.class).getManuscript(manuscript.getId(), null)); - - Resource resource = new Resource<>(manuscriptDto); - resource.add(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).withSelfRel()); - return resource; - } -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java deleted file mode 100644 index d30f93a..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/ManuscriptDtoDisassembler.java +++ /dev/null @@ -1,22 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.rest.dto; - -import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; -import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; -import uk.ac.ebi.spot.gwas.deposition.dto.PublicationDto; - -public class ManuscriptDtoDisassembler { - - public static Manuscript diassemble(PublicationDto publicationDto, Provenance provenance) { - return new Manuscript(publicationDto.getTitle(), - publicationDto.getFirstAuthor(), - publicationDto.getJournal(), - publicationDto.getPublicationDate(), - publicationDto.getPublicationDate(), - publicationDto.getCorrespondingAuthor() != null ? - new CorrespondingAuthor(publicationDto.getCorrespondingAuthor().getAuthorName(), - publicationDto.getCorrespondingAuthor().getEmail()) : null, - provenance); - } - -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java index e051606..a4882e2 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SubmissionDtoAssembler.java @@ -9,13 +9,13 @@ public class SubmissionDtoAssembler { public static SubmissionDto assemble(Submission submission, PublicationDto publication, - ManuscriptDto manuscript, + BodyOfWorkDto bodyOfWork, List fileUploads, ProvenanceDto created, ProvenanceDto lastUpdated) { return new SubmissionDto(submission.getId(), publication, - manuscript, + bodyOfWork, fileUploads, submission.getGlobusFolderId(), submission.getGlobusOriginId(), diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java new file mode 100644 index 0000000..08bbb32 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -0,0 +1,13 @@ +package uk.ac.ebi.spot.gwas.deposition.service; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; + +public interface BodyOfWorkService { + BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork); + + BodyOfWork retrieveBodyOfWork(String bodyOfWork, String userId); + + Page retrieveBodyOfWorks(String userId, Pageable pageable); +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java deleted file mode 100644 index 0a56648..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/ManuscriptService.java +++ /dev/null @@ -1,13 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.service; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; - -public interface ManuscriptService { - Manuscript createManuscript(Manuscript manuscript); - - Manuscript retrieveManuscript(String manuscriptId, String userId); - - Page retrieveManuscripts(String userId, Pageable pageable); -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java new file mode 100644 index 0000000..70e645b --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -0,0 +1,51 @@ +package uk.ac.ebi.spot.gwas.deposition.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; +import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; +import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; + +import java.util.Optional; + +@Service +public class BodyOfWorkServiceImpl implements BodyOfWorkService { + + private static final Logger log = LoggerFactory.getLogger(BodyOfWorkService.class); + + @Autowired + private BodyOfWorkRepository bodyOfWorkRepository; + + @Override + public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { + log.info("Creating body of work: {}", bodyOfWork.getTitle()); + bodyOfWork = bodyOfWorkRepository.insert(bodyOfWork); + log.info("Body of work created: {}", bodyOfWork.getId()); + return bodyOfWork; + } + + @Override + public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { + log.info("[{}] Retrieving body of work: {}", userId, bodyOfWorkId); + Optional optionalBodyOfWork = bodyOfWorkRepository.findByIdAndArchivedAndCreated_UserId(bodyOfWorkId, false, userId); + if (!optionalBodyOfWork.isPresent()) { + log.error("Unable to find body of work with ID: {}", bodyOfWorkId); + throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyOfWorkId); + } + + log.info("Returning body of work: {}", optionalBodyOfWork.get().getId()); + return optionalBodyOfWork.get(); + } + + @Override + public Page retrieveBodyOfWorks(String userId, Pageable pageable) { + log.info("[{}] Retrieving body of works.", userId); + Page bodyOfWorks = bodyOfWorkRepository.findByArchivedAndCreated_UserId(false, userId, pageable); + return bodyOfWorks; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java deleted file mode 100644 index 39a7a5b..0000000 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ManuscriptServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.service.impl; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; -import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; -import uk.ac.ebi.spot.gwas.deposition.repository.ManuscriptRepository; -import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; - -import java.util.Optional; - -@Service -public class ManuscriptServiceImpl implements ManuscriptService { - - private static final Logger log = LoggerFactory.getLogger(ManuscriptService.class); - - @Autowired - private ManuscriptRepository manuscriptRepository; - - @Override - public Manuscript createManuscript(Manuscript manuscript) { - log.info("Creating manuscript: {}", manuscript.getTitle()); - manuscript = manuscriptRepository.insert(manuscript); - log.info("Manuscript created: {}", manuscript.getId()); - return manuscript; - } - - @Override - public Manuscript retrieveManuscript(String manuscriptId, String userId) { - log.info("[{}] Retrieving manuscript: {}", userId, manuscriptId); - Optional optionalManuscript = manuscriptRepository.findByIdAndArchivedAndCreated_UserId(manuscriptId, false, userId); - if (!optionalManuscript.isPresent()) { - log.error("Unable to find manuscript with ID: {}", manuscriptId); - throw new EntityNotFoundException("Unable to find manuscript with ID: " + manuscriptId); - } - - log.info("Returning manuscript: {}", optionalManuscript.get().getId()); - return optionalManuscript.get(); - } - - @Override - public Page retrieveManuscripts(String userId, Pageable pageable) { - log.info("[{}] Retrieving manuscripts.", userId); - Page manuscripts = manuscriptRepository.findByArchivedAndCreated_UserId(false, userId, pageable); - return manuscripts; - } -} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java index 08e73bb..7c8886d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java @@ -9,16 +9,16 @@ import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionProvenanceType; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import uk.ac.ebi.spot.gwas.deposition.domain.FileUpload; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; import uk.ac.ebi.spot.gwas.deposition.domain.Publication; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.dto.FileUploadDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; import uk.ac.ebi.spot.gwas.deposition.rest.controllers.*; import uk.ac.ebi.spot.gwas.deposition.rest.dto.*; +import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; import uk.ac.ebi.spot.gwas.deposition.service.FileUploadsService; -import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; import uk.ac.ebi.spot.gwas.deposition.service.PublicationService; import uk.ac.ebi.spot.gwas.deposition.service.UserService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; @@ -45,16 +45,16 @@ public class SubmissionAssemblyService implements ResourceAssembler toResource(Submission submission) { Publication publication = null; - Manuscript manuscript = null; + BodyOfWork bodyOfWork = null; if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.PUBLICATION.name())) { publication = publicationService.retrievePublication(submission.getPublicationId(), true); } else { - manuscript = manuscriptService.retrieveManuscript(submission.getManuscriptId(), submission.getCreated().getUserId()); + bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(submission.getBodyOfWorks().get(0), submission.getCreated().getUserId()); } List fileUploads = fileUploadsService.getFileUploads(submission.getFileUploads()); @@ -65,7 +65,7 @@ public Resource toResource(Submission submission) { SubmissionDto submissionDto = SubmissionDtoAssembler.assemble(submission, publication != null ? PublicationDtoAssembler.assemble(publication) : null, - manuscript != null ? ManuscriptDtoAssembler.assemble(manuscript) : null, + bodyOfWork != null ? BodyOfWorkDtoAssembler.assemble(bodyOfWork) : null, fileUploadDtos, ProvenanceDtoAssembler.assemble(submission.getCreated(), userService.getUser(submission.getCreated().getUserId())), submission.getLastUpdated() != null ? diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java index 5bac8ac..e55f53c 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/AssociationsControllerTest.java @@ -60,6 +60,7 @@ public void setup() { @Test public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java new file mode 100644 index 0000000..dc6c44f --- /dev/null +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java @@ -0,0 +1,155 @@ +package uk.ac.ebi.spot.gwas.deposition.rest; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.jayway.jsonpath.JsonPath; +import net.minidev.json.JSONArray; +import org.apache.commons.lang3.RandomStringUtils; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Resource; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; +import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; +import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; + +import java.util.ArrayList; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ContextConfiguration(classes = {IntegrationTest.MockJWTServiceConfig.class, + IntegrationTest.MockTaskExecutorConfig.class, + IntegrationTest.MockGWASCatalogRESTServiceConfig.class, + IntegrationTest.MockTemplateServiceConfig.class, + IntegrationTest.MockSumStatsServiceConfig.class}) +public class BodyOfWorkControllerTest extends IntegrationTest { + + @Autowired + private SumStatsService sumStatsService; + + private BodyOfWork bodyOfWork; + + @Autowired + private BodyOfWorkService bodyOfWorkService; + + @Before + public void setup() { + super.setup(); + reset(sumStatsService); + when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); + + bodyOfWork = new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + new ArrayList<>(), + new ArrayList<>(), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + LocalDate.now(), + true, + new Provenance(DateTime.now(), user.getId())); + bodyOfWork = bodyOfWorkService.createBodyOfWork(bodyOfWork); + } + + private void create() throws Exception { + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK; + + String response = mockMvc.perform(post(endpoint) + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(BodyOfWorkDtoAssembler.assemble(bodyOfWork)))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + BodyOfWorkDto actual = actualResource.getContent(); + + assertEquals(bodyOfWork.getTitle(), actual.getTitle()); + assertEquals(bodyOfWork.getJournal(), actual.getJournal()); + assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getFirstAuthorFirstName()); + assertEquals(bodyOfWork.getFirstAuthorLastName(), actual.getFirstAuthorLastName()); + } + + /** + * POST /v1/bodyofwork + */ + @Test + public void shouldCreateBodyOfWork() throws Exception { + create(); + } + + /** + * GET /v1/bodyofwork/{bodyofworkId} + */ + @Test + public void shouldGetBodyOfWork() throws Exception { + String endpoint = GeneralCommon.API_V1 + + GWASDepositionBackendConstants.API_BODY_OF_WORK + + "/" + bodyOfWork.getId(); + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + BodyOfWorkDto actual = actualResource.getContent(); + + assertEquals(bodyOfWork.getTitle(), actual.getTitle()); + assertEquals(bodyOfWork.getJournal(), actual.getJournal()); + assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getFirstAuthorFirstName()); + assertEquals(bodyOfWork.getFirstAuthorLastName(), actual.getFirstAuthorLastName()); + } + + /** + * GET /v1/bodyofwork + */ + @Test + public void shouldBodyOfWorks() throws Exception { + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK; + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + + Map objectMap = JsonPath.read(response, "$.page"); + assertEquals(1, objectMap.get("totalElements")); + JSONArray jsonArray = JsonPath.read(response, "$._embedded.bodyofworks[*]"); + assertEquals(1, jsonArray.size()); + Map submissionData = JsonPath.read(response, "$._embedded.bodyofworks[0]"); + assertEquals(bodyOfWork.getId(), submissionData.get("bodyofworkId")); + assertEquals(bodyOfWork.getTitle(), submissionData.get("title")); + assertEquals(bodyOfWork.getJournal(), submissionData.get("journal")); + + } + +} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java index b799ed3..a1c6136 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/FileUploadsControllerSSTest.java @@ -388,6 +388,7 @@ public void shouldHandleSummaryStats() throws Exception { private SubmissionDto createSubmissionFromPublished() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(publishedPublication), + null, RandomStringUtils.randomAlphanumeric(10)); SSTemplateEntryDto ssTemplateEntryDto = new SSTemplateEntryDto(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index f5abb20..da74b33 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.RandomStringUtils; -import org.joda.time.LocalDate; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -134,6 +133,9 @@ public SSCallbackTask ssCallbackTask() { @Autowired protected NoteRepository noteRepository; + @Autowired + protected BodyOfWorkRepository bodyOfWorkRepository; + protected MockMvc mockMvc; protected ObjectMapper mapper; @@ -144,7 +146,7 @@ public SSCallbackTask ssCallbackTask() { protected Publication publishedPublication; - protected Publication manuscriptPublication; + protected BodyOfWork bodyOfWork; protected Study study; @@ -167,14 +169,7 @@ public void setup() { user = userRepository.insert(TestUtil.user()); eligiblePublication = publicationRepository.insert(TestUtil.eligiblePublication()); publishedPublication = publicationRepository.insert(TestUtil.publishedPublication()); - manuscriptPublication = new Publication(null, - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10) + " " + RandomStringUtils.randomAlphanumeric(10), - LocalDate.now(), - new CorrespondingAuthor(RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10)), - null); + bodyOfWork = bodyOfWorkRepository.insert(TestUtil.bodyOfWork(user.getId())); when(jwtService.extractUser(any())).thenReturn(user); @@ -240,6 +235,7 @@ private void createPrerequisites() { protected SubmissionDto createSubmissionFromEligible() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java deleted file mode 100644 index 5b9671e..0000000 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/ManuscriptControllerTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package uk.ac.ebi.spot.gwas.deposition.rest; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.jayway.jsonpath.JsonPath; -import net.minidev.json.JSONArray; -import org.apache.commons.lang3.RandomStringUtils; -import org.joda.time.DateTime; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.Resource; -import org.springframework.http.MediaType; -import org.springframework.test.context.ContextConfiguration; -import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; -import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; -import uk.ac.ebi.spot.gwas.deposition.domain.Manuscript; -import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; -import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; -import uk.ac.ebi.spot.gwas.deposition.dto.ManuscriptDto; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.ManuscriptDtoDisassembler; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.service.ManuscriptService; -import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; - -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@ContextConfiguration(classes = {IntegrationTest.MockJWTServiceConfig.class, - IntegrationTest.MockTaskExecutorConfig.class, - IntegrationTest.MockGWASCatalogRESTServiceConfig.class, - IntegrationTest.MockTemplateServiceConfig.class, - IntegrationTest.MockSumStatsServiceConfig.class}) -public class ManuscriptControllerTest extends IntegrationTest { - - @Autowired - private SumStatsService sumStatsService; - - private Manuscript manuscript; - - @Autowired - private ManuscriptService manuscriptService; - - @Before - public void setup() { - super.setup(); - reset(sumStatsService); - when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); - - manuscript = ManuscriptDtoDisassembler.diassemble(PublicationDtoAssembler.assemble(manuscriptPublication), - new Provenance(DateTime.now(), user.getId())); - manuscript = manuscriptService.createManuscript(manuscript); - } - - /** - * GET /v1/manuscripts/{manuscriptId} - */ - @Test - public void shouldGetManuscript() throws Exception { - String endpoint = GeneralCommon.API_V1 + - GWASDepositionBackendConstants.API_MANUSCRIPTS + - "/" + manuscript.getId(); - - String response = mockMvc.perform(get(endpoint) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - - Resource actualResource = mapper.readValue(response, new TypeReference>() { - }); - ManuscriptDto actual = actualResource.getContent(); - - assertEquals(manuscript.getTitle(), actual.getTitle()); - assertEquals(manuscript.getJournal(), actual.getJournal()); - assertEquals(manuscript.getFirstAuthor(), actual.getFirstAuthor()); - assertEquals(manuscript.getCorrespondingAuthor().getAuthorName(), actual.getCorrespondingAuthor().getAuthorName()); - } - - /** - * GET /v1/manuscripts - */ - @Test - public void shouldGetManuscripts() throws Exception { - String endpoint = GeneralCommon.API_V1 + - GWASDepositionBackendConstants.API_MANUSCRIPTS; - - String response = mockMvc.perform(get(endpoint) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - - - Map objectMap = JsonPath.read(response, "$.page"); - assertEquals(1, objectMap.get("totalElements")); - JSONArray jsonArray = JsonPath.read(response, "$._embedded.manuscripts[*]"); - assertEquals(1, jsonArray.size()); - Map submissionData = JsonPath.read(response, "$._embedded.manuscripts[0]"); - assertEquals(manuscript.getId(), submissionData.get("manuscriptId")); - assertEquals(manuscript.getTitle(), submissionData.get("title")); - assertEquals(manuscript.getJournal(), submissionData.get("journal")); - assertEquals(manuscript.getFirstAuthor(), submissionData.get("firstAuthor")); - - } - -} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java index 2a62f7e..06ae123 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SamplesControllerTest.java @@ -60,6 +60,7 @@ public void setup() { @Test public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java index d5b24de..08c7441 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java @@ -60,6 +60,7 @@ public void setup() { @Test public void shouldGetSamples() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index d8cc4b0..308ba69 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -17,7 +17,8 @@ import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionCreationDto; import uk.ac.ebi.spot.gwas.deposition.dto.SubmissionDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateEntryDto; -import uk.ac.ebi.spot.gwas.deposition.repository.ManuscriptRepository; +import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.service.*; @@ -61,7 +62,7 @@ public class SubmissionsControllerTest extends IntegrationTest { private SumStatsService sumStatsService; @Autowired - private ManuscriptRepository manuscriptRepository; + private BodyOfWorkRepository bodyOfWorkRepository; @Before public void setup() { @@ -77,6 +78,7 @@ public void setup() { public void shouldCreateEligibleSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) @@ -109,6 +111,7 @@ public void shouldCreateEligibleSubmission() throws Exception { public void shouldCreatePublishedSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(publishedPublication), + null, RandomStringUtils.randomAlphanumeric(10)); SSTemplateEntryDto ssTemplateEntryDto = new SSTemplateEntryDto(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), @@ -159,7 +162,8 @@ public void shouldCreatePublishedSubmission() throws Exception { public void shouldCreateManuscriptSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); - SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(manuscriptPublication), + SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(null, + BodyOfWorkDtoAssembler.assemble(bodyOfWork), RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) @@ -175,15 +179,15 @@ public void shouldCreateManuscriptSubmission() throws Exception { SubmissionDto actual = actualResource.getContent(); assertNull(actual.getPublication()); - assertEquals(SubmissionProvenanceType.MANUSCRIPT.name(), actual.getProvenanceType()); + assertEquals(SubmissionProvenanceType.BODY_OF_WORK.name(), actual.getProvenanceType()); assertEquals(user.getName(), actual.getCreated().getUser().getName()); assertEquals(user.getEmail(), actual.getCreated().getUser().getEmail()); - assertEquals(manuscriptPublication.getJournal(), actual.getManuscript().getJournal()); - assertEquals(manuscriptPublication.getTitle(), actual.getManuscript().getTitle()); - assertEquals(manuscriptPublication.getFirstAuthor(), actual.getManuscript().getFirstAuthor()); + assertEquals(bodyOfWork.getJournal(), actual.getBodyOfWork().getJournal()); + assertEquals(bodyOfWork.getTitle(), actual.getBodyOfWork().getTitle()); + assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getBodyOfWork().getFirstAuthorFirstName()); assertTrue(actual.getFiles().isEmpty()); - assertEquals(1, manuscriptRepository.findAll().size()); + assertEquals(1, bodyOfWorkRepository.findAll().size()); verify(sumStatsService, times(0)).createGlobusFolder(any()); } @@ -193,6 +197,7 @@ public void shouldCreateManuscriptSubmission() throws Exception { @Test public void shouldGetSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) @@ -250,6 +255,7 @@ public void shouldGetSubmission() throws Exception { @Test public void shouldDeleteSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) @@ -284,6 +290,7 @@ public void shouldDeleteSubmission() throws Exception { */ public void shouldDeleteSubmissionOfPublishedPublication() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(publishedPublication), + null, RandomStringUtils.randomAlphanumeric(10)); SSTemplateEntryDto ssTemplateEntryDto = new SSTemplateEntryDto(RandomStringUtils.randomAlphanumeric(10), @@ -333,6 +340,7 @@ public void shouldDeleteSubmissionOfPublishedPublication() throws Exception { @Test public void shouldSubmitSubmission() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) @@ -370,6 +378,7 @@ public void shouldSubmitSubmission() throws Exception { @Test public void shouldGetSubmissions() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, RandomStringUtils.randomAlphanumeric(10)); String response = mockMvc.perform(post(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java index df244b2..35d1887 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java @@ -1,17 +1,17 @@ package uk.ac.ebi.spot.gwas.deposition.util; import org.apache.commons.lang3.RandomStringUtils; +import org.joda.time.DateTime; import org.joda.time.LocalDate; import uk.ac.ebi.spot.gwas.deposition.constants.PublicationStatus; -import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; -import uk.ac.ebi.spot.gwas.deposition.domain.Publication; -import uk.ac.ebi.spot.gwas.deposition.domain.User; +import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsRequestDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsRequestEntryDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsResponseDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsStatusDto; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.*; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -23,6 +23,23 @@ public static User user() { RandomStringUtils.randomAlphanumeric(10)); } + public static BodyOfWork bodyOfWork(String userId) { + return new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + new ArrayList<>(), + new ArrayList<>(), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + LocalDate.now(), + true, + new Provenance(DateTime.now(), userId)); + } + public static Publication eligiblePublication() { return publication(PublicationStatus.ELIGIBLE.name()); } From 127215793981d163824764affff8acf0ef116e58 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 2 Apr 2020 19:20:44 +0800 Subject: [PATCH 06/23] Fixed BodyOfWork tests. --- pom.xml | 2 +- .../controllers/SubmissionsController.java | 3 +- .../rest/BodyOfWorkControllerTest.java | 48 +++++-------------- .../gwas/deposition/rest/IntegrationTest.java | 19 +++++++- .../rest/SubmissionsControllerTest.java | 3 +- .../resources/quartz/environment-config.yaml | 4 ++ 6 files changed, 38 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index 5aca6d5..3f5d1a6 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ uk.ac.ebi.spot.gwasdepo gwasdepo-master - 1.0.0 + 1.0.1-SNAPSHOT diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 3d8e5a5..732ddc2 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -80,8 +80,7 @@ public class SubmissionsController { public Resource createSubmission(@Valid @RequestBody SubmissionCreationDto submissionCreationDto, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); - log.info("[{}] Request to create new submission for publication: {}", user.getName(), - submissionCreationDto.getPublication().getPmid()); + log.info("[{}] Request to create new submission.", user.getName()); if (submissionCreationDto.getPublication() == null) { if (submissionCreationDto.getBodyOfWork() == null) { diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java index dc6c44f..7169282 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java @@ -4,8 +4,6 @@ import com.jayway.jsonpath.JsonPath; import net.minidev.json.JSONArray; import org.apache.commons.lang3.RandomStringUtils; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -14,15 +12,11 @@ import org.springframework.test.context.ContextConfiguration; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; -import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; -import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; -import java.util.ArrayList; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -43,41 +37,20 @@ public class BodyOfWorkControllerTest extends IntegrationTest { @Autowired private SumStatsService sumStatsService; - private BodyOfWork bodyOfWork; - - @Autowired - private BodyOfWorkService bodyOfWorkService; - @Before public void setup() { super.setup(); reset(sumStatsService); when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); - - bodyOfWork = new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - new ArrayList<>(), - new ArrayList<>(), - RandomStringUtils.randomAlphanumeric(10), - RandomStringUtils.randomAlphanumeric(10), - LocalDate.now(), - true, - new Provenance(DateTime.now(), user.getId())); - bodyOfWork = bodyOfWorkService.createBodyOfWork(bodyOfWork); } - private void create() throws Exception { + private BodyOfWorkDto create() throws Exception { String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK; String response = mockMvc.perform(post(endpoint) .contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(BodyOfWorkDtoAssembler.assemble(bodyOfWork)))) - .andExpect(status().isOk()) + .andExpect(status().isCreated()) .andReturn() .getResponse() .getContentAsString(); @@ -90,6 +63,7 @@ private void create() throws Exception { assertEquals(bodyOfWork.getJournal(), actual.getJournal()); assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getFirstAuthorFirstName()); assertEquals(bodyOfWork.getFirstAuthorLastName(), actual.getFirstAuthorLastName()); + return actual; } /** @@ -105,9 +79,10 @@ public void shouldCreateBodyOfWork() throws Exception { */ @Test public void shouldGetBodyOfWork() throws Exception { + BodyOfWorkDto bodyOfWorkDto = create(); String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK + - "/" + bodyOfWork.getId(); + "/" + bodyOfWorkDto.getBodyOfWorkId(); String response = mockMvc.perform(get(endpoint) .contentType(MediaType.APPLICATION_JSON)) @@ -130,7 +105,8 @@ public void shouldGetBodyOfWork() throws Exception { * GET /v1/bodyofwork */ @Test - public void shouldBodyOfWorks() throws Exception { + public void shouldGetBodyOfWorks() throws Exception { + BodyOfWorkDto bodyOfWorkDto = create(); String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK; String response = mockMvc.perform(get(endpoint) @@ -143,12 +119,12 @@ public void shouldBodyOfWorks() throws Exception { Map objectMap = JsonPath.read(response, "$.page"); assertEquals(1, objectMap.get("totalElements")); - JSONArray jsonArray = JsonPath.read(response, "$._embedded.bodyofworks[*]"); + JSONArray jsonArray = JsonPath.read(response, "$._embedded.bodyOfWorks[*]"); assertEquals(1, jsonArray.size()); - Map submissionData = JsonPath.read(response, "$._embedded.bodyofworks[0]"); - assertEquals(bodyOfWork.getId(), submissionData.get("bodyofworkId")); - assertEquals(bodyOfWork.getTitle(), submissionData.get("title")); - assertEquals(bodyOfWork.getJournal(), submissionData.get("journal")); + Map submissionData = JsonPath.read(response, "$._embedded.bodyOfWorks[0]"); + assertEquals(bodyOfWorkDto.getBodyOfWorkId(), submissionData.get("bodyOfWorkId")); + assertEquals(bodyOfWorkDto.getTitle(), submissionData.get("title")); + assertEquals(bodyOfWorkDto.getJournal(), submissionData.get("journal")); } diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index da74b33..219b21f 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.RandomStringUtils; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +34,8 @@ import uk.ac.ebi.spot.gwas.deposition.service.*; import uk.ac.ebi.spot.gwas.deposition.util.TestUtil; +import java.util.ArrayList; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -169,9 +173,22 @@ public void setup() { user = userRepository.insert(TestUtil.user()); eligiblePublication = publicationRepository.insert(TestUtil.eligiblePublication()); publishedPublication = publicationRepository.insert(TestUtil.publishedPublication()); - bodyOfWork = bodyOfWorkRepository.insert(TestUtil.bodyOfWork(user.getId())); when(jwtService.extractUser(any())).thenReturn(user); + bodyOfWork = new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + new ArrayList<>(), + new ArrayList<>(), + RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10), + LocalDate.now(), + true, + new Provenance(DateTime.now(), user.getId())); createPrerequisites(); } diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 308ba69..9c24ceb 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -161,7 +161,8 @@ public void shouldCreatePublishedSubmission() throws Exception { @Test public void shouldCreateManuscriptSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); - + bodyOfWorkRepository.insert(bodyOfWork); + SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(null, BodyOfWorkDtoAssembler.assemble(bodyOfWork), RandomStringUtils.randomAlphanumeric(10)); diff --git a/src/test/resources/quartz/environment-config.yaml b/src/test/resources/quartz/environment-config.yaml index aa2d233..247a9cd 100644 --- a/src/test/resources/quartz/environment-config.yaml +++ b/src/test/resources/quartz/environment-config.yaml @@ -2,12 +2,16 @@ environments: - name: dev config: application-dev.yml dev: true + gcp: false - name: test config: application-test.yml dev: true + gcp: false - name: sandbox config: application-sandbox.yml dev: false + gcp: false - name: prod config: application-prod.yml dev: false + gcp: false \ No newline at end of file From c17e737b7a1a13feadda14d194a891c2700e14e9 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Fri, 3 Apr 2020 19:25:20 +0800 Subject: [PATCH 07/23] Changed Author modeling. --- .../controllers/BodyOfWorkController.java | 12 +++++ .../rest/dto/AuthorDtoAssembler.java | 27 +++++++++++ .../rest/dto/BodyOfWorkDtoAssembler.java | 26 ++++------- .../rest/dto/BodyOfWorkDtoDisassembler.java | 16 +++---- .../deposition/service/BodyOfWorkService.java | 2 + .../service/impl/BodyOfWorkServiceImpl.java | 14 ++++++ .../rest/BodyOfWorkControllerTest.java | 46 ++++++++++++++++--- .../gwas/deposition/rest/IntegrationTest.java | 7 ++- .../rest/SubmissionsControllerTest.java | 2 +- .../spot/gwas/deposition/util/TestUtil.java | 7 ++- 10 files changed, 125 insertions(+), 34 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/AuthorDtoAssembler.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index 41bfc18..72a9b89 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -107,4 +107,16 @@ public PagedResources getBodyOfWorks(@PageableDefault(size = 20, } + /** + * DELETE /v1/bodyofwork/{bodyofworkId} + */ + @DeleteMapping(value = "/{bodyofworkId}") + @ResponseStatus(HttpStatus.OK) + public void deleteBodyOfWork(@PathVariable String bodyofworkId, + HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to delete body of work: {}", user.getId(), bodyofworkId); + bodyOfWorkService.deleteBodyOfWork(bodyofworkId, user.getId()); +// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/AuthorDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/AuthorDtoAssembler.java new file mode 100644 index 0000000..a459036 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/AuthorDtoAssembler.java @@ -0,0 +1,27 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import uk.ac.ebi.spot.gwas.deposition.domain.Author; +import uk.ac.ebi.spot.gwas.deposition.dto.AuthorDto; + +public class AuthorDtoAssembler { + + public static AuthorDto assemble(Author author) { + if (author == null) { + return null; + } + return new AuthorDto(author.getFirstName(), + author.getLastName(), + author.getGroup(), + author.getEmail()); + } + + public static Author disassemble(AuthorDto author) { + if (author == null) { + return null; + } + return new Author(author.getFirstName(), + author.getLastName(), + author.getGroup(), + author.getEmail()); + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java index bf32681..9483a05 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java @@ -7,14 +7,14 @@ import org.springframework.stereotype.Component; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; -import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; +import uk.ac.ebi.spot.gwas.deposition.dto.AuthorDto; import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; -import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; import uk.ac.ebi.spot.gwas.deposition.rest.controllers.BodyOfWorkController; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Component public class BodyOfWorkDtoAssembler implements ResourceAssembler> { @@ -23,19 +23,16 @@ public class BodyOfWorkDtoAssembler implements ResourceAssembler correspondingAuthorDtoList = new ArrayList<>(); + List correspondingAuthorDtoList = new ArrayList<>(); if (bodyOfWork.getCorrespondingAuthors() != null) { - for (CorrespondingAuthor correspondingAuthor : bodyOfWork.getCorrespondingAuthors()) { - correspondingAuthorDtoList.add(new CorrespondingAuthorDto(correspondingAuthor.getAuthorName(), - correspondingAuthor.getEmail())); - } + correspondingAuthorDtoList = bodyOfWork.getCorrespondingAuthors().stream().map(AuthorDtoAssembler::assemble).collect(Collectors.toList()); } return new BodyOfWorkDto(bodyOfWork.getId(), bodyOfWork.getTitle(), bodyOfWork.getDescription(), - bodyOfWork.getFirstAuthorFirstName(), - bodyOfWork.getFirstAuthorLastName(), + AuthorDtoAssembler.assemble(bodyOfWork.getFirstAuthor()), + AuthorDtoAssembler.assemble(bodyOfWork.getLastAuthor()), bodyOfWork.getJournal(), bodyOfWork.getDoi(), bodyOfWork.getUrl(), @@ -50,19 +47,16 @@ public static BodyOfWorkDto assemble(BodyOfWork bodyOfWork) { @Override public Resource toResource(BodyOfWork bodyOfWork) { - List correspondingAuthorDtoList = new ArrayList<>(); + List correspondingAuthorDtoList = new ArrayList<>(); if (bodyOfWork.getCorrespondingAuthors() != null) { - for (CorrespondingAuthor correspondingAuthor : bodyOfWork.getCorrespondingAuthors()) { - correspondingAuthorDtoList.add(new CorrespondingAuthorDto(correspondingAuthor.getAuthorName(), - correspondingAuthor.getEmail())); - } + correspondingAuthorDtoList = bodyOfWork.getCorrespondingAuthors().stream().map(AuthorDtoAssembler::assemble).collect(Collectors.toList()); } BodyOfWorkDto bodyOfWorkDto = new BodyOfWorkDto(bodyOfWork.getId(), bodyOfWork.getTitle(), bodyOfWork.getDescription(), - bodyOfWork.getFirstAuthorFirstName(), - bodyOfWork.getFirstAuthorLastName(), + AuthorDtoAssembler.assemble(bodyOfWork.getFirstAuthor()), + AuthorDtoAssembler.assemble(bodyOfWork.getLastAuthor()), bodyOfWork.getJournal(), bodyOfWork.getDoi(), bodyOfWork.getUrl(), diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java index 8e5da4a..ff3aac0 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java @@ -1,23 +1,21 @@ package uk.ac.ebi.spot.gwas.deposition.rest.dto; +import uk.ac.ebi.spot.gwas.deposition.domain.Author; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; -import uk.ac.ebi.spot.gwas.deposition.domain.CorrespondingAuthor; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; -import uk.ac.ebi.spot.gwas.deposition.dto.CorrespondingAuthorDto; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class BodyOfWorkDtoDisassembler { public static BodyOfWork disassemble(BodyOfWorkDto bodyOfWorkDto, Provenance provenance) { - List correspondingAuthorList = new ArrayList<>(); + List correspondingAuthorList = new ArrayList<>(); if (bodyOfWorkDto.getCorrespondingAuthors() != null) { - for (CorrespondingAuthorDto correspondingAuthor : bodyOfWorkDto.getCorrespondingAuthors()) { - correspondingAuthorList.add(new CorrespondingAuthor(correspondingAuthor.getAuthorName(), - correspondingAuthor.getEmail())); - } + correspondingAuthorList = bodyOfWorkDto.getCorrespondingAuthors().stream() + .map(AuthorDtoAssembler::disassemble).collect(Collectors.toList()); } BodyOfWork bodyOfWork = new BodyOfWork(bodyOfWorkDto.getTitle(), @@ -25,8 +23,8 @@ public static BodyOfWork disassemble(BodyOfWorkDto bodyOfWorkDto, Provenance pro bodyOfWorkDto.getJournal(), bodyOfWorkDto.getDoi(), bodyOfWorkDto.getUrl(), - bodyOfWorkDto.getFirstAuthorFirstName(), - bodyOfWorkDto.getFirstAuthorLastName(), + AuthorDtoAssembler.disassemble(bodyOfWorkDto.getFirstAuthor()), + AuthorDtoAssembler.disassemble(bodyOfWorkDto.getLastAuthor()), correspondingAuthorList, bodyOfWorkDto.getPmids(), bodyOfWorkDto.getPrePrintServer(), diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java index 08bbb32..44210ed 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -10,4 +10,6 @@ public interface BodyOfWorkService { BodyOfWork retrieveBodyOfWork(String bodyOfWork, String userId); Page retrieveBodyOfWorks(String userId, Pageable pageable); + + void deleteBodyOfWork(String bodyofworkId, String id); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 70e645b..294d51d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -48,4 +48,18 @@ public Page retrieveBodyOfWorks(String userId, Pageable pageable) { Page bodyOfWorks = bodyOfWorkRepository.findByArchivedAndCreated_UserId(false, userId, pageable); return bodyOfWorks; } + + @Override + public void deleteBodyOfWork(String bodyofworkId, String userId) { + log.info("[{}] Deleting body of work: {}", userId, bodyofworkId); + Optional optionalBodyOfWork = bodyOfWorkRepository.findByIdAndArchivedAndCreated_UserId(bodyofworkId, false, userId); + if (!optionalBodyOfWork.isPresent()) { + log.error("Unable to find body of work with ID: {}", bodyofworkId); + throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyofworkId); + } + BodyOfWork bodyOfWork = optionalBodyOfWork.get(); + bodyOfWork.setArchived(true); + bodyOfWorkRepository.save(bodyOfWork); + log.info("Body of work successfully deleted: {}", bodyOfWork.getId()); + } } diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java index 7169282..304f873 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java @@ -23,8 +23,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ContextConfiguration(classes = {IntegrationTest.MockJWTServiceConfig.class, @@ -61,8 +60,8 @@ private BodyOfWorkDto create() throws Exception { assertEquals(bodyOfWork.getTitle(), actual.getTitle()); assertEquals(bodyOfWork.getJournal(), actual.getJournal()); - assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getFirstAuthorFirstName()); - assertEquals(bodyOfWork.getFirstAuthorLastName(), actual.getFirstAuthorLastName()); + assertEquals(bodyOfWork.getFirstAuthor().getFirstName(), actual.getFirstAuthor().getFirstName()); + assertEquals(bodyOfWork.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); return actual; } @@ -97,8 +96,43 @@ public void shouldGetBodyOfWork() throws Exception { assertEquals(bodyOfWork.getTitle(), actual.getTitle()); assertEquals(bodyOfWork.getJournal(), actual.getJournal()); - assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getFirstAuthorFirstName()); - assertEquals(bodyOfWork.getFirstAuthorLastName(), actual.getFirstAuthorLastName()); + assertEquals(bodyOfWork.getFirstAuthor().getFirstName(), actual.getFirstAuthor().getFirstName()); + assertEquals(bodyOfWork.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); + } + + /** + * DELETE /v1/bodyofwork/{bodyofworkId} + */ + @Test + public void shouldDeleteBodyOfWork() throws Exception { + BodyOfWorkDto bodyOfWorkDto = create(); + String endpoint = GeneralCommon.API_V1 + + GWASDepositionBackendConstants.API_BODY_OF_WORK + + "/" + bodyOfWorkDto.getBodyOfWorkId(); + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + BodyOfWorkDto actual = actualResource.getContent(); + + assertEquals(bodyOfWork.getTitle(), actual.getTitle()); + assertEquals(bodyOfWork.getJournal(), actual.getJournal()); + assertEquals(bodyOfWork.getFirstAuthor().getFirstName(), actual.getFirstAuthor().getFirstName()); + assertEquals(bodyOfWork.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); + + mockMvc.perform(delete(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); } /** diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java index 219b21f..441154d 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/IntegrationTest.java @@ -175,13 +175,18 @@ public void setup() { publishedPublication = publicationRepository.insert(TestUtil.publishedPublication()); when(jwtService.extractUser(any())).thenReturn(user); - bodyOfWork = new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), + + Author author = new Author(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10)); + bodyOfWork = new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), + author, + author, new ArrayList<>(), new ArrayList<>(), RandomStringUtils.randomAlphanumeric(10), diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 9c24ceb..105eaaa 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -185,7 +185,7 @@ public void shouldCreateManuscriptSubmission() throws Exception { assertEquals(user.getEmail(), actual.getCreated().getUser().getEmail()); assertEquals(bodyOfWork.getJournal(), actual.getBodyOfWork().getJournal()); assertEquals(bodyOfWork.getTitle(), actual.getBodyOfWork().getTitle()); - assertEquals(bodyOfWork.getFirstAuthorFirstName(), actual.getBodyOfWork().getFirstAuthorFirstName()); + assertEquals(bodyOfWork.getFirstAuthor().getFirstName(), actual.getBodyOfWork().getFirstAuthor().getFirstName()); assertTrue(actual.getFiles().isEmpty()); assertEquals(1, bodyOfWorkRepository.findAll().size()); diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java index 35d1887..d18fb96 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/util/TestUtil.java @@ -24,13 +24,18 @@ public static User user() { } public static BodyOfWork bodyOfWork(String userId) { - return new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), + Author author = new Author(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), + RandomStringUtils.randomAlphanumeric(10)); + + return new BodyOfWork(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(10), + author, + author, new ArrayList<>(), new ArrayList<>(), RandomStringUtils.randomAlphanumeric(10), From 82ace49d6c2c5b9c7bac2ff47e0e513d6281bb89 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Mon, 6 Apr 2020 21:24:17 +0800 Subject: [PATCH 08/23] Added capability to ming GCST IDs. --- .../GWASDepositionBackendConstants.java | 2 + .../deposition/domain/GCSTCounterItem.java | 37 ++++++++++++++ .../repository/GCSTCounterItemRepository.java | 8 ++++ .../service/impl/ConversionServiceImpl.java | 7 +++ .../impl/SubmissionAssemblyService.java | 4 +- .../gwas/deposition/util/GCSTCounter.java | 48 +++++++++++++++++++ 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCSTCounterItem.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCSTCounterItemRepository.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCSTCounter.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index 66f0e6e..c516c15 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -44,6 +44,8 @@ public class GWASDepositionBackendConstants { public static final String FILE_TEMPLATE_EXAMPLE = "template_example.xlsx"; + public static final String PREFIX_GCST = "GCST"; + public static final String PREFIX_LABEL = "LABEL"; public static final String PROFILE_PRODUCTION = "prod"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCSTCounterItem.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCSTCounterItem.java new file mode 100644 index 0000000..14cd9f7 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCSTCounterItem.java @@ -0,0 +1,37 @@ +package uk.ac.ebi.spot.gwas.deposition.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "gcstCounter") +public class GCSTCounterItem { + + @Id + private String id; + + private int currentValue; + + public GCSTCounterItem() { + + } + + public GCSTCounterItem(int newValue) { + this.currentValue = newValue; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getCurrentValue() { + return currentValue; + } + + public void setCurrentValue(int currentValue) { + this.currentValue = currentValue; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCSTCounterItemRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCSTCounterItemRepository.java new file mode 100644 index 0000000..f761b4e --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCSTCounterItemRepository.java @@ -0,0 +1,8 @@ +package uk.ac.ebi.spot.gwas.deposition.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import uk.ac.ebi.spot.gwas.deposition.domain.GCSTCounterItem; + +public interface GCSTCounterItemRepository extends MongoRepository { + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java index c3487b9..9c3185c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java @@ -23,6 +23,7 @@ import uk.ac.ebi.spot.gwas.deposition.service.SubmissionService; import uk.ac.ebi.spot.gwas.deposition.service.SummaryStatsProcessingService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; +import uk.ac.ebi.spot.gwas.deposition.util.GCSTCounter; import uk.ac.ebi.spot.gwas.template.validator.service.TemplateConverterService; import uk.ac.ebi.spot.gwas.template.validator.util.StreamSubmissionTemplateReader; import uk.ac.ebi.spot.gwas.template.validator.util.SubmissionConverter; @@ -59,6 +60,9 @@ public class ConversionServiceImpl implements ConversionService { @Autowired private SummaryStatsProcessingService summaryStatsProcessingService; + @Autowired + private GCSTCounter gcstCounter; + @Async @Override public void convertData(Submission submission, FileUpload fileUpload, @@ -73,6 +77,9 @@ public void convertData(Submission submission, FileUpload fileUpload, log.info("Found {} studies.", submissionDataDto.getStudies().size()); for (StudyDto studyDto : submissionDataDto.getStudies()) { Study study = StudyDtoAssembler.disassemble(studyDto); + if (study.getAccession() == null) { + study.setAccession(gcstCounter.getNext()); + } study.setSubmissionId(submission.getId()); study = studyRepository.insert(study); submission.addStudy(study.getId()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java index 7c8886d..785e74d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionAssemblyService.java @@ -54,7 +54,9 @@ public Resource toResource(Submission submission) { if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.PUBLICATION.name())) { publication = publicationService.retrievePublication(submission.getPublicationId(), true); } else { - bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(submission.getBodyOfWorks().get(0), submission.getCreated().getUserId()); + if (!submission.getBodyOfWorks().isEmpty()) { + bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(submission.getBodyOfWorks().get(0), submission.getCreated().getUserId()); + } } List fileUploads = fileUploadsService.getFileUploads(submission.getFileUploads()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCSTCounter.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCSTCounter.java new file mode 100644 index 0000000..d199bc7 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCSTCounter.java @@ -0,0 +1,48 @@ +package uk.ac.ebi.spot.gwas.deposition.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.GCSTCounterItem; +import uk.ac.ebi.spot.gwas.deposition.repository.GCSTCounterItemRepository; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +@Component +public class GCSTCounter { + + private AtomicInteger counter; + + @Autowired + private GCSTCounterItemRepository gcstCounterItemRepository; + + @PostConstruct + public void initialize() { + List gcstCounterItemList = gcstCounterItemRepository.findAll(); + if (gcstCounterItemList.isEmpty()) { + counter = new AtomicInteger(90000000); + } else { + counter = new AtomicInteger(gcstCounterItemList.get(0).getCurrentValue()); + } + } + + public String getNext() { + int currentValue = counter.get(); + this.increment(); + return GWASDepositionBackendConstants.PREFIX_GCST + Integer.toString(currentValue); + } + + public void increment() { + while (true) { + int existingValue = counter.get(); + int newValue = existingValue + 1; + if (counter.compareAndSet(existingValue, newValue)) { + gcstCounterItemRepository.deleteAll(); + gcstCounterItemRepository.insert(new GCSTCounterItem(newValue)); + return; + } + } + } +} From 42dd04f151b8fb96001390ef62c3d1b0c5775008 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 8 Apr 2020 21:17:17 +0800 Subject: [PATCH 09/23] Changed BOW identification mechanism. --- .../GWASDepositionBackendConstants.java | 2 + .../deposition/domain/GCPCounterItem.java | 37 ++++++++++++ .../repository/BodyOfWorkRepository.java | 2 +- .../repository/GCPCounterItemRepository.java | 8 +++ .../controllers/SubmissionsController.java | 4 +- .../rest/dto/BodyOfWorkDtoAssembler.java | 4 +- .../rest/dto/BodyOfWorkDtoDisassembler.java | 2 +- .../service/impl/BodyOfWorkServiceImpl.java | 13 ++-- .../spot/gwas/deposition/util/GCPCounter.java | 60 +++++++++++++++++++ .../rest/SubmissionsControllerTest.java | 7 ++- 10 files changed, 128 insertions(+), 11 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCPCounterItem.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCPCounterItemRepository.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCPCounter.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index c516c15..99fbd34 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -46,6 +46,8 @@ public class GWASDepositionBackendConstants { public static final String PREFIX_GCST = "GCST"; + public static final String PREFIX_GCP = "GCP"; + public static final String PREFIX_LABEL = "LABEL"; public static final String PROFILE_PRODUCTION = "prod"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCPCounterItem.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCPCounterItem.java new file mode 100644 index 0000000..4f4c92c --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/domain/GCPCounterItem.java @@ -0,0 +1,37 @@ +package uk.ac.ebi.spot.gwas.deposition.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "gcpCounter") +public class GCPCounterItem { + + @Id + private String id; + + private int currentValue; + + public GCPCounterItem() { + + } + + public GCPCounterItem(int newValue) { + this.currentValue = newValue; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getCurrentValue() { + return currentValue; + } + + public void setCurrentValue(int currentValue) { + this.currentValue = currentValue; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java index 81552b8..6fdda71 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java @@ -9,7 +9,7 @@ public interface BodyOfWorkRepository extends MongoRepository { - Optional findByIdAndArchivedAndCreated_UserId(String id, boolean archived, String userId); + Optional findByBowIdAndArchivedAndCreated_UserId(String bowId, boolean archived, String userId); Page findByArchivedAndCreated_UserId(boolean archived, String userId, Pageable page); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCPCounterItemRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCPCounterItemRepository.java new file mode 100644 index 0000000..3b8d114 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/GCPCounterItemRepository.java @@ -0,0 +1,8 @@ +package uk.ac.ebi.spot.gwas.deposition.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import uk.ac.ebi.spot.gwas.deposition.domain.GCPCounterItem; + +public interface GCPCounterItemRepository extends MongoRepository { + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 732ddc2..62e66f4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -89,10 +89,10 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr log.info("Received submission based on body of work: {}", submissionCreationDto.getBodyOfWork().getTitle()); BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(submissionCreationDto.getBodyOfWork(), new Provenance(DateTime.now(), user.getId())); - bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getId(), user.getId()); + bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getBowId(), user.getId()); // auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); - Submission submission = new Submission(bodyOfWork.getId(), + Submission submission = new Submission(bodyOfWork.getBowId(), SubmissionProvenanceType.BODY_OF_WORK.name(), new Provenance(DateTime.now(), user.getId())); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java index 9483a05..1305bb0 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoAssembler.java @@ -28,7 +28,7 @@ public static BodyOfWorkDto assemble(BodyOfWork bodyOfWork) { correspondingAuthorDtoList = bodyOfWork.getCorrespondingAuthors().stream().map(AuthorDtoAssembler::assemble).collect(Collectors.toList()); } - return new BodyOfWorkDto(bodyOfWork.getId(), + return new BodyOfWorkDto(bodyOfWork.getBowId(), bodyOfWork.getTitle(), bodyOfWork.getDescription(), AuthorDtoAssembler.assemble(bodyOfWork.getFirstAuthor()), @@ -52,7 +52,7 @@ public Resource toResource(BodyOfWork bodyOfWork) { correspondingAuthorDtoList = bodyOfWork.getCorrespondingAuthors().stream().map(AuthorDtoAssembler::assemble).collect(Collectors.toList()); } - BodyOfWorkDto bodyOfWorkDto = new BodyOfWorkDto(bodyOfWork.getId(), + BodyOfWorkDto bodyOfWorkDto = new BodyOfWorkDto(bodyOfWork.getBowId(), bodyOfWork.getTitle(), bodyOfWork.getDescription(), AuthorDtoAssembler.assemble(bodyOfWork.getFirstAuthor()), diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java index ff3aac0..b5aaea3 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/BodyOfWorkDtoDisassembler.java @@ -33,7 +33,7 @@ public static BodyOfWork disassemble(BodyOfWorkDto bodyOfWorkDto, Provenance pro bodyOfWorkDto.getEmbargoUntilPublished(), provenance); if (bodyOfWorkDto.getBodyOfWorkId() != null) { - bodyOfWork.setId(bodyOfWorkDto.getBodyOfWorkId()); + bodyOfWork.setBowId(bodyOfWorkDto.getBodyOfWorkId()); } return bodyOfWork; } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 294d51d..429ee10 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -10,6 +10,7 @@ import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; +import uk.ac.ebi.spot.gwas.deposition.util.GCPCounter; import java.util.Optional; @@ -21,9 +22,13 @@ public class BodyOfWorkServiceImpl implements BodyOfWorkService { @Autowired private BodyOfWorkRepository bodyOfWorkRepository; + @Autowired + private GCPCounter gcpCounter; + @Override public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { log.info("Creating body of work: {}", bodyOfWork.getTitle()); + bodyOfWork.setBowId(gcpCounter.getNext()); bodyOfWork = bodyOfWorkRepository.insert(bodyOfWork); log.info("Body of work created: {}", bodyOfWork.getId()); return bodyOfWork; @@ -32,13 +37,13 @@ public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { @Override public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { log.info("[{}] Retrieving body of work: {}", userId, bodyOfWorkId); - Optional optionalBodyOfWork = bodyOfWorkRepository.findByIdAndArchivedAndCreated_UserId(bodyOfWorkId, false, userId); + Optional optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyOfWorkId, false, userId); if (!optionalBodyOfWork.isPresent()) { log.error("Unable to find body of work with ID: {}", bodyOfWorkId); throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyOfWorkId); } - log.info("Returning body of work: {}", optionalBodyOfWork.get().getId()); + log.info("Returning body of work: {}", optionalBodyOfWork.get().getBowId()); return optionalBodyOfWork.get(); } @@ -52,7 +57,7 @@ public Page retrieveBodyOfWorks(String userId, Pageable pageable) { @Override public void deleteBodyOfWork(String bodyofworkId, String userId) { log.info("[{}] Deleting body of work: {}", userId, bodyofworkId); - Optional optionalBodyOfWork = bodyOfWorkRepository.findByIdAndArchivedAndCreated_UserId(bodyofworkId, false, userId); + Optional optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyofworkId, false, userId); if (!optionalBodyOfWork.isPresent()) { log.error("Unable to find body of work with ID: {}", bodyofworkId); throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyofworkId); @@ -60,6 +65,6 @@ public void deleteBodyOfWork(String bodyofworkId, String userId) { BodyOfWork bodyOfWork = optionalBodyOfWork.get(); bodyOfWork.setArchived(true); bodyOfWorkRepository.save(bodyOfWork); - log.info("Body of work successfully deleted: {}", bodyOfWork.getId()); + log.info("Body of work successfully deleted: {}", bodyOfWork.getBowId()); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCPCounter.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCPCounter.java new file mode 100644 index 0000000..0b96189 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/GCPCounter.java @@ -0,0 +1,60 @@ +package uk.ac.ebi.spot.gwas.deposition.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.GCPCounterItem; +import uk.ac.ebi.spot.gwas.deposition.repository.GCPCounterItemRepository; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +@Component +public class GCPCounter { + + private static final int PADDING_LENGTH = 6; + + private AtomicInteger counter; + + @Autowired + private GCPCounterItemRepository gcpCounterItemRepository; + + @PostConstruct + public void initialize() { + List gcpCounterItemList = gcpCounterItemRepository.findAll(); + if (gcpCounterItemList.isEmpty()) { + counter = new AtomicInteger(1); + } else { + counter = new AtomicInteger(gcpCounterItemList.get(0).getCurrentValue()); + } + } + + public String getNext() { + int currentValue = counter.get(); + this.increment(); + return GWASDepositionBackendConstants.PREFIX_GCP + padCounter(currentValue); + } + + public void increment() { + while (true) { + int existingValue = counter.get(); + int newValue = existingValue + 1; + if (counter.compareAndSet(existingValue, newValue)) { + gcpCounterItemRepository.deleteAll(); + gcpCounterItemRepository.insert(new GCPCounterItem(newValue)); + return; + } + } + } + + private String padCounter(int value) { + String sValue = Integer.toString(value); + int padding = PADDING_LENGTH - sValue.length(); + String sPadding = ""; + for (int i = 0; i < padding; i++) { + sPadding += "0"; + } + return sPadding + sValue; + } +} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 105eaaa..2bab132 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -21,6 +21,7 @@ import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.rest.dto.PublicationDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.service.*; +import uk.ac.ebi.spot.gwas.deposition.util.GCPCounter; import java.io.InputStream; import java.util.Arrays; @@ -64,6 +65,9 @@ public class SubmissionsControllerTest extends IntegrationTest { @Autowired private BodyOfWorkRepository bodyOfWorkRepository; + @Autowired + private GCPCounter gcpCounter; + @Before public void setup() { super.setup(); @@ -159,8 +163,9 @@ public void shouldCreatePublishedSubmission() throws Exception { * POST /v1/submissions */ @Test - public void shouldCreateManuscriptSubmission() throws Exception { + public void shouldCreateBodyOfWorkSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); + bodyOfWork.setBowId(gcpCounter.getNext()); bodyOfWorkRepository.insert(bodyOfWork); SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(null, From a405eafb9202c27f0c58363a17ac155815d18177 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Tue, 14 Apr 2020 17:45:45 +0800 Subject: [PATCH 10/23] Improved handling of deletion of body of work. --- .../deposition/config/ExceptionHandlerAdvice.java | 14 ++++++++++++++ .../repository/SubmissionRepository.java | 2 ++ .../rest/controllers/BodyOfWorkController.java | 11 +++++++++++ .../rest/controllers/SubmissionsController.java | 6 ++++++ .../gwas/deposition/service/SubmissionService.java | 2 ++ .../service/impl/BodyOfWorkServiceImpl.java | 3 +++ .../service/impl/SubmissionServiceImpl.java | 14 ++++++++++++++ .../deposition/rest/SubmissionsControllerTest.java | 8 +++++++- 8 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java index c68c86f..3e3cd8e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/ExceptionHandlerAdvice.java @@ -62,6 +62,20 @@ public ResponseEntity handleCannotDeleteSSTemplateFileException(CannotDe return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.BAD_REQUEST); } + @ExceptionHandler(CannotDeleteBodyOfWorkException.class) + public ResponseEntity handleCannotDeleteBodyOfWorkException(CannotDeleteBodyOfWorkException e) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(CannotCreateSubmissionOnExistingBodyOfWork.class) + public ResponseEntity handleCannotCreateSubmissionOnExistingBodyOfWork(CannotCreateSubmissionOnExistingBodyOfWork e) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.BAD_REQUEST); + } + @ExceptionHandler(DeleteOnSubmittedSubmissionNotAllowedException.class) public ResponseEntity handleDeleteOnSubmittedSubmissionNotAllowedException(DeleteOnSubmittedSubmissionNotAllowedException e) { HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java index f00adf6..c429e7e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java @@ -22,6 +22,8 @@ public interface SubmissionRepository extends MongoRepository findByPublicationIdAndArchived(String publicationId, boolean archived); + Optional findByBodyOfWorksContainsAndCreated_UserIdAndArchived(String bodyOfWorkId, String userId, boolean archived); + Page findByPublicationIdAndArchived(String publicationId, boolean archived, Pageable page); Page findByPublicationIdAndArchivedAndCreated_UserId(String publicationId, boolean b, String userId, Pageable page); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index 72a9b89..ebf539c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -20,12 +20,15 @@ import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; +import uk.ac.ebi.spot.gwas.deposition.exception.CannotDeleteBodyOfWorkException; import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoDisassembler; import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; import uk.ac.ebi.spot.gwas.deposition.service.JWTService; +import uk.ac.ebi.spot.gwas.deposition.service.SubmissionService; import uk.ac.ebi.spot.gwas.deposition.service.UserService; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; import uk.ac.ebi.spot.gwas.deposition.util.HeadersUtil; @@ -56,6 +59,9 @@ public class BodyOfWorkController { @Autowired private AuditProxy auditProxy; + @Autowired + private SubmissionService submissionService; + /** * POST /v1/bodyofwork */ @@ -116,6 +122,11 @@ public void deleteBodyOfWork(@PathVariable String bodyofworkId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to delete body of work: {}", user.getId(), bodyofworkId); + Submission submission = submissionService.findByBodyOfWork(bodyofworkId, user.getId()); + if (submission != null) { + log.error("Unable to delete body of work {} because a submission already exists on it: {}", bodyofworkId, submission.getId()); + throw new CannotDeleteBodyOfWorkException("Unable to delete body of work: " + bodyofworkId + ". A submission was created using this artefact."); + } bodyOfWorkService.deleteBodyOfWork(bodyofworkId, user.getId()); // auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 62e66f4..2cadd37 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -92,6 +92,12 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getBowId(), user.getId()); // auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); + Submission existing = submissionService.findByBodyOfWork(bodyOfWork.getBowId(), user.getId()); + if (existing != null) { + log.error("Unable to create submission using: {}. A submission already exists."); + throw new CannotCreateSubmissionOnExistingBodyOfWork("Unable to create submission using: " + bodyOfWork.getBowId() + ". A submission already exists."); + } + Submission submission = new Submission(bodyOfWork.getBowId(), SubmissionProvenanceType.BODY_OF_WORK.name(), new Provenance(DateTime.now(), user.getId())); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java index 153d866..5753ee9 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java @@ -17,6 +17,8 @@ public interface SubmissionService { Page getSubmissions(String pmid, Pageable page, User user); + Submission findByBodyOfWork(String bodyOfWorkId, String userId); + void deleteSubmission(String submissionId, User user); Submission updateSubmissionStatus(String submissionId, String status, User user); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 429ee10..8754908 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -1,5 +1,6 @@ package uk.ac.ebi.spot.gwas.deposition.service.impl; +import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -7,6 +8,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; @@ -63,6 +65,7 @@ public void deleteBodyOfWork(String bodyofworkId, String userId) { throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyofworkId); } BodyOfWork bodyOfWork = optionalBodyOfWork.get(); + bodyOfWork.setLastUpdated(new Provenance(DateTime.now(), userId)); bodyOfWork.setArchived(true); bodyOfWorkRepository.save(bodyOfWork); log.info("Body of work successfully deleted: {}", bodyOfWork.getBowId()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java index 979a04e..362cfe8 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java @@ -121,6 +121,19 @@ public Submission updateSubmissionStatus(String submissionId, String status, Use return submission; } + @Override + public Submission findByBodyOfWork(String bodyOfWorkId, String userId) { + log.info("Retrieving submission for: {} | {}", bodyOfWorkId, userId); + Optional submissionOptional = submissionRepository.findByBodyOfWorksContainsAndCreated_UserIdAndArchived(bodyOfWorkId, userId, false); + if (submissionOptional.isPresent()) { + log.info("Found submission {} for: {} | {}", submissionOptional.get().getId(), bodyOfWorkId, userId); + return submissionOptional.get(); + } + + log.info("No submission found for: {} | {}", bodyOfWorkId, userId); + return null; + } + @Override public void deleteSubmission(String submissionId, User user) { log.info("Deleting submission: {}", submissionId); @@ -143,6 +156,7 @@ public void deleteSubmission(String submissionId, User user) { submission.setSamples(new ArrayList<>()); submission.setNotes(new ArrayList<>()); submission.setFileUploads(new ArrayList<>()); + submission.setLastUpdated(new Provenance(DateTime.now(), user.getId())); submissionRepository.save(submission); } diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 2bab132..4f5921e 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -167,7 +167,7 @@ public void shouldCreateBodyOfWorkSubmission() throws Exception { when(sumStatsService.createGlobusFolder(any())).thenReturn(new SSGlobusResponse(true, RandomStringUtils.randomAlphanumeric(10))); bodyOfWork.setBowId(gcpCounter.getNext()); bodyOfWorkRepository.insert(bodyOfWork); - + SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(null, BodyOfWorkDtoAssembler.assemble(bodyOfWork), RandomStringUtils.randomAlphanumeric(10)); @@ -195,6 +195,12 @@ public void shouldCreateBodyOfWorkSubmission() throws Exception { assertTrue(actual.getFiles().isEmpty()); assertEquals(1, bodyOfWorkRepository.findAll().size()); verify(sumStatsService, times(0)).createGlobusFolder(any()); + + mockMvc.perform(delete(GeneralCommon.API_V1 + + GWASDepositionBackendConstants.API_BODY_OF_WORK + + "/" + bodyOfWork.getBowId()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); } /** From a5dd6ee92de536307243090cb8d4e27b36ebacbe Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Tue, 14 Apr 2020 20:53:54 +0800 Subject: [PATCH 11/23] Fixed all audit entries. --- .../controllers/BodyOfWorkController.java | 10 +++-- .../controllers/FileUploadsController.java | 8 ++-- .../controllers/SubmissionsController.java | 37 +++++++++++-------- .../scheduler/tasks/SSCallbackTask.java | 12 ++++-- .../deposition/service/BodyOfWorkService.java | 2 +- .../service/impl/ConversionServiceImpl.java | 6 +++ .../service/impl/FileHandlerServiceImpl.java | 10 +++++ .../impl/MetadataValidationServiceImpl.java | 11 +++--- .../service/impl/SubmissionServiceImpl.java | 6 --- .../SummaryStatsProcessingServiceImpl.java | 5 ++- .../SummaryStatsValidationServiceImpl.java | 12 +++--- 11 files changed, 75 insertions(+), 44 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index ebf539c..e214eb0 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -14,6 +14,7 @@ import org.springframework.hateoas.mvc.ControllerLinkBuilder; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; @@ -73,7 +74,7 @@ public Resource createBodyOfWork(@RequestBody BodyOfWorkDto bodyO log.info("[{}] Request to create body of work: {}", user.getId(), bodyOfWorkDto.getTitle()); BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(bodyOfWorkDto, new Provenance(DateTime.now(), user.getId())); bodyOfWork = bodyOfWorkService.createBodyOfWork(bodyOfWork); -// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + auditProxy.addAuditEntry(AuditHelper.bowCreate(user.getId(), bodyOfWork)); log.info("Body of work created: {}", bodyOfWork.getId()); return bodyOfWorkDtoAssembler.toResource(bodyOfWork); } @@ -88,7 +89,7 @@ public Resource getBodyOfWork(@PathVariable String bodyofworkId, User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to get body of work: {}", user.getId(), bodyofworkId); BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user.getId()); -// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + auditProxy.addAuditEntry(AuditHelper.bowRetrieve(user.getId(), bodyOfWork)); log.info("Returning body of work: {}", bodyOfWork.getId()); return bodyOfWorkDtoAssembler.toResource(bodyOfWork); } @@ -104,6 +105,7 @@ public PagedResources getBodyOfWorks(@PageableDefault(size = 20, User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to retrieve body of works.", user.getId()); Page facetedBodyOfWorks = bodyOfWorkService.retrieveBodyOfWorks(user.getId(), pageable); + auditProxy.addAuditEntry(AuditHelper.bowRetrieve(user.getId(), null)); final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( ControllerLinkBuilder.methodOn(BodyOfWorkController.class).getBodyOfWorks(pageable, assembler, null)); @@ -122,12 +124,14 @@ public void deleteBodyOfWork(@PathVariable String bodyofworkId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to delete body of work: {}", user.getId(), bodyofworkId); + BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user.getId()); Submission submission = submissionService.findByBodyOfWork(bodyofworkId, user.getId()); if (submission != null) { + auditProxy.addAuditEntry(AuditHelper.bowDelete(user.getId(), bodyOfWork, false)); log.error("Unable to delete body of work {} because a submission already exists on it: {}", bodyofworkId, submission.getId()); throw new CannotDeleteBodyOfWorkException("Unable to delete body of work: " + bodyofworkId + ". A submission was created using this artefact."); } bodyOfWorkService.deleteBodyOfWork(bodyofworkId, user.getId()); -// auditProxy.addAuditEntry(AuditHelper.manuscriptRetrieved(user.getId(), bodyOfWork)); + auditProxy.addAuditEntry(AuditHelper.bowDelete(user.getId(), bodyOfWork, true)); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java index f992d42..7ac1cf6 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/FileUploadsController.java @@ -84,7 +84,7 @@ public Resource uploadFile(@RequestParam MultipartFile file, } else { fileUpload = fileHandlerService.handleMetadataFile(submission, file, user); } - auditProxy.addAuditEntry(AuditHelper.fileCreated(user.getId(), fileUpload, submission)); + auditProxy.addAuditEntry(AuditHelper.fileCreate(submission.getCreated().getUserId(), fileUpload, submission, true, null)); final ControllerLinkBuilder lb = linkTo( methodOn(FileUploadsController.class).getFileUpload(submissionId, fileUpload.getId(), null)); @@ -111,7 +111,7 @@ public Resource getFileUpload(@PathVariable String submissionId, } FileUpload fileUpload = fileUploadsService.getFileUpload(fileUploadId); log.info("Returning file [{}] for submission: {}", fileUpload.getFileName(), submission.getId()); - auditProxy.addAuditEntry(AuditHelper.fileRetrieved(user.getId(), fileUpload)); + auditProxy.addAuditEntry(AuditHelper.fileRetrieve(submission.getCreated().getUserId(), fileUpload, submission)); final ControllerLinkBuilder lb = linkTo( methodOn(FileUploadsController.class).getFileUpload(submissionId, fileUploadId, null)); @@ -162,7 +162,7 @@ public HttpEntity downloadFile(@PathVariable String submissionId, log.info("[{}] Request to download file [{}] from submission: {}", user.getName(), fileUploadId, submissionId); Submission submission = submissionService.getSubmission(submissionId, user); FileUpload fileUpload = fileUploadsService.getFileUpload(fileUploadId); - auditProxy.addAuditEntry(AuditHelper.fileRetrieved(user.getId(), fileUpload)); + auditProxy.addAuditEntry(AuditHelper.fileRetrieve(user.getId(), fileUpload, submission)); byte[] payload = fileUploadsService.retrieveFileContent(fileUpload.getId()); log.info("Returning content for file [{}] for submission: {}", fileUpload.getFileName(), submission.getId()); @@ -182,8 +182,10 @@ public void deleteFileUpload(@PathVariable String submissionId, @PathVariable String fileUploadId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to delete file [{}] from submission: {}", user.getName(), fileUploadId, submissionId); + FileUpload fileUpload = fileUploadsService.getFileUpload(fileUploadId); Submission submission = submissionService.getSubmission(submissionId, user); submissionService.deleteSubmissionFile(submission, fileUploadId, user.getId()); + auditProxy.addAuditEntry(AuditHelper.fileDelete(submission.getCreated().getUserId(), fileUpload, submission)); // submissionDataCleaningService.cleanSubmission(submission, fileUploadId); log.info("File [{}] successfully removed from submission: {}", fileUploadId, submission.getId()); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 2cadd37..97bccc9 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -90,20 +90,21 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(submissionCreationDto.getBodyOfWork(), new Provenance(DateTime.now(), user.getId())); bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getBowId(), user.getId()); -// auditProxy.addAuditEntry(AuditHelper.manuscriptCreated(user.getId(), manuscript)); + + Submission submission = new Submission(bodyOfWork.getBowId(), + SubmissionProvenanceType.BODY_OF_WORK.name(), + new Provenance(DateTime.now(), user.getId())); + auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, true, true)); Submission existing = submissionService.findByBodyOfWork(bodyOfWork.getBowId(), user.getId()); if (existing != null) { log.error("Unable to create submission using: {}. A submission already exists."); + auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, false, false)); throw new CannotCreateSubmissionOnExistingBodyOfWork("Unable to create submission using: " + bodyOfWork.getBowId() + ". A submission already exists."); } - Submission submission = new Submission(bodyOfWork.getBowId(), - SubmissionProvenanceType.BODY_OF_WORK.name(), - new Provenance(DateTime.now(), user.getId())); - submission = submissionService.createSubmission(submission); -// auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), submission, manuscript)); + auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, false, true)); return submissionAssemblyService.toResource(submission); } @@ -114,6 +115,7 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr Submission submission = new Submission(publication.getId(), SubmissionProvenanceType.PUBLICATION.name(), new Provenance(DateTime.now(), user.getId())); + String globusFolder = UUID.randomUUID().toString(); SSGlobusResponse outcome = sumStatsService.createGlobusFolder(new SSGlobusFolderDto(globusFolder, submissionCreationDto.getGlobusIdentity() != null ? @@ -121,33 +123,38 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr user.getEmail())); if (outcome != null) { if (!outcome.isValid()) { - auditProxy.addAuditEntry(AuditHelper.globusFailed(user.getId(), submissionCreationDto.getPublication(), outcome)); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), true, false, outcome.getOutcome())); log.error("Unable to create Globus folder: {}", outcome.getOutcome()); throw new EmailAccountNotLinkedToGlobusException(outcome.getOutcome()); } - - auditProxy.addAuditEntry(AuditHelper.globusSuccess(user.getEmail(), submissionCreationDto.getPublication(), outcome)); submission.setGlobusFolderId(globusFolder); submission.setGlobusOriginId(outcome.getOutcome()); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), true, true, null)); + if (publication.getStatus().equals(PublicationStatus.ELIGIBLE.name())) { publication.setStatus(PublicationStatus.UNDER_SUBMISSION.name()); submission.setType(SubmissionType.METADATA.name()); submission = submissionService.createSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionCreated(user.getId(), - submission, submissionCreationDto.getPublication())); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), false, true, null)); } if (publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { publication.setStatus(PublicationStatus.UNDER_SUMMARY_STATS_SUBMISSION.name()); submission.setType(SubmissionType.SUMMARY_STATS.name()); submission = submissionService.createSubmission(submission); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), false, true, null)); fileHandlerService.handleSummaryStatsTemplate(submission, publication); } publicationService.savePublication(publication); log.info("Returning new submission: {}", submission.getId()); return submissionAssemblyService.toResource(submission); } else { - auditProxy.addAuditEntry(AuditHelper.globusFailed(user.getId(), submissionCreationDto.getPublication(), outcome)); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), true, false, null)); throw new SSGlobusFolderCreatioException("Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."); } } @@ -165,7 +172,7 @@ public Resource getSubmission(@PathVariable String submissionId, User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to retrieve submission: {}", user.getName(), submissionId); Submission submission = submissionService.getSubmission(submissionId, user); - auditProxy.addAuditEntry(AuditHelper.submissionRetrieved(user.getId(), submission)); + auditProxy.addAuditEntry(AuditHelper.submissionRetrieve(user.getId(), submission)); log.info("Returning submission: {}", submission.getId()); return submissionAssemblyService.toResource(submission); } @@ -180,12 +187,12 @@ public void deleteSubmission(@PathVariable String submissionId, HttpServletReque log.info("[{}] Request to delete submission: {}", user.getName(), submissionId); Submission submission = submissionService.getSubmission(submissionId, user); if (submission.getOverallStatus().equalsIgnoreCase(Status.SUBMITTED.name())) { - auditProxy.addAuditEntry(AuditHelper.submissionDeleted(user.getId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionDelete(user.getId(), submission, false)); log.error("Unable to DELETE submission [{}]. Submission has already been SUBMITTED.", submissionId); throw new DeleteOnSubmittedSubmissionNotAllowedException("Unable to DELETE submission [" + submissionId + "]. Submission has already been SUBMITTED."); } - auditProxy.addAuditEntry(AuditHelper.submissionDeleted(user.getId(), submission, true)); + auditProxy.addAuditEntry(AuditHelper.submissionDelete(user.getId(), submission, true)); submissionService.deleteSubmission(submissionId, user); Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java index 779f0dd..0afa9c5 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java @@ -92,7 +92,11 @@ public void checkCallbackIds() { fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(null, fileUpload, errors, true)); + Submission submission = submissionService.getSubmission(callbackId.getSubmissionId(), + new User(gwasDepositionBackendConfig.getAutoCuratorServiceAccount(), + gwasDepositionBackendConfig.getAutoCuratorServiceAccount())); + + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, false, errors)); callbackId.setValid(false); } } @@ -121,16 +125,16 @@ public void checkCallbackIds() { if (fileUpload != null) { fileUpload.setStatus(FileUploadStatus.VALID.name()); fileUploadsService.save(fileUpload); - auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(userId, fileUpload, true)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, true, null)); } backendEmailService.sendSuccessEmail(userId, publication.getPmid(), metadata); - auditProxy.addAuditEntry(AuditHelper.submissionSuccess(submission.getCreated().getUserId(), submission)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true)); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); backendEmailService.sendFailEmail(userId, publication.getPmid(), metadata, errors); - auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); } submissionService.saveSubmission(submission); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java index 44210ed..484dcf2 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -11,5 +11,5 @@ public interface BodyOfWorkService { Page retrieveBodyOfWorks(String userId, Pageable pageable); - void deleteBodyOfWork(String bodyofworkId, String id); + void deleteBodyOfWork(String bodyofworkId, String userId); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java index 9c3185c..05277f0 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java @@ -5,6 +5,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.domain.*; @@ -63,6 +65,9 @@ public class ConversionServiceImpl implements ConversionService { @Autowired private GCSTCounter gcstCounter; + @Autowired + private AuditProxy auditProxy; + @Async @Override public void convertData(Submission submission, FileUpload fileUpload, @@ -123,6 +128,7 @@ public void convertData(Submission submission, FileUpload fileUpload, submission.setOverallStatus(Status.VALIDATING.name()); submission.setMetadataStatus(Status.VALID.name()); submissionService.saveSubmission(submission); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true)); fileUpload.setStatus(FileUploadStatus.VALID.name()); fileUploadsService.save(fileUpload); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/FileHandlerServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/FileHandlerServiceImpl.java index be03fa2..9aec083 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/FileHandlerServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/FileHandlerServiceImpl.java @@ -6,6 +6,8 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; +import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadType; import uk.ac.ebi.spot.gwas.deposition.constants.Status; @@ -50,6 +52,9 @@ public class FileHandlerServiceImpl implements FileHandlerService { @Autowired private ErrorMessageTemplateProcessor errorMessageTemplateProcessor; + @Autowired + private AuditProxy auditProxy; + @Override @Async public void handleSummaryStatsTemplate(Submission submission, Publication publication) { @@ -71,6 +76,8 @@ public void handleSummaryStatsTemplate(Submission submission, Publication public log.error("No summary stats data available for publication: {}", publication.getPmid()); fileUpload = fileUploadsService.storeFile(null, null, null, 0, FileUploadType.SUMMARY_STATS_TEMPLATE.name()); submission.addFileUpload(fileUpload.getId()); + auditProxy.addAuditEntry(AuditHelper.fileCreate(submission.getCreated().getUserId(), fileUpload, submission, false, + "No summary stats data available for publication: {}" + publication.getPmid())); submissionService.saveSubmission(submission); markInvalidFile(fileUpload, submission, ErrorType.NO_SS_DATA, publication.getPmid()); return; @@ -80,6 +87,7 @@ public void handleSummaryStatsTemplate(Submission submission, Publication public log.error("Template service not available."); fileUpload = fileUploadsService.storeFile(null, null, null, 0, FileUploadType.SUMMARY_STATS_TEMPLATE.name()); submission.addFileUpload(fileUpload.getId()); + auditProxy.addAuditEntry(AuditHelper.fileCreate(submission.getCreated().getUserId(), fileUpload, submission, false, "Template service not available.")); submissionService.saveSubmission(submission); markInvalidFile(fileUpload, submission, ErrorType.NO_TEMPLATE_SERVICE, null); } else { @@ -89,6 +97,7 @@ public void handleSummaryStatsTemplate(Submission submission, Publication public log.error("No file object received from the template service!"); fileUpload = fileUploadsService.storeFile(null, null, null, 0, FileUploadType.SUMMARY_STATS_TEMPLATE.name()); submission.addFileUpload(fileUpload.getId()); + auditProxy.addAuditEntry(AuditHelper.fileCreate(submission.getCreated().getUserId(), fileUpload, submission, false, "No file object received from the template service!")); submissionService.saveSubmission(submission); markInvalidFile(fileUpload, submission, ErrorType.UNUSABLE_DATA, null); return; @@ -99,6 +108,7 @@ public void handleSummaryStatsTemplate(Submission submission, Publication public fileObject.getContent().length, FileUploadType.SUMMARY_STATS_TEMPLATE.name()); fileUpload.setStatus(FileUploadStatus.VALID.name()); fileUploadsService.save(fileUpload); + auditProxy.addAuditEntry(AuditHelper.fileCreate(submission.getCreated().getUserId(), fileUpload, submission, true, null)); log.info("File upload created: {}", fileUpload.getId()); submission.addFileUpload(fileUpload.getId()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java index 6b51085..d7d6e77 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java @@ -106,7 +106,8 @@ public void validateTemplate(String submissionId, FileUpload fileUpload, byte[] } else { log.info("Validation outcome: {}", validationOutcome.getErrorMessages()); if (validationOutcome.getErrorMessages().isEmpty()) { - auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), fileUpload, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, + false, true, null)); conversionService.convertData(submission, fileUpload, streamSubmissionTemplateReader, schema); } else { submission.setOverallStatus(Status.INVALID.name()); @@ -118,8 +119,8 @@ public void validateTemplate(String submissionId, FileUpload fileUpload, byte[] fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); - auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, false, false, errors)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); } } @@ -139,7 +140,7 @@ private void materializeError(Submission submission, FileUpload fileUpload, Stri fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); - auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, false, false, errors)); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java index 362cfe8..916badd 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java @@ -8,8 +8,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import uk.ac.ebi.spot.gwas.deposition.audit.AuditHelper; -import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.Status; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; @@ -48,9 +46,6 @@ public class SubmissionServiceImpl implements SubmissionService { @Autowired private SummaryStatsEntryRepository summaryStatsEntryRepository; - @Autowired - private AuditProxy auditProxy; - @Override public Submission createSubmission(Submission submission) { log.info("Creating submission for publication: {}", submission.getPublicationId()); @@ -194,7 +189,6 @@ public void deleteSubmissionFile(Submission submission, String fileUploadId, Str submission.setSummaryStatsStatus(Status.NA.name()); submission.setLastUpdated(new Provenance(DateTime.now(), userId)); submissionRepository.save(submission); - auditProxy.addAuditEntry(AuditHelper.fileDeleted(userId, fileUpload)); } private void deleteCallbackId(String callbackId) { diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java index b3593e2..31119a9 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java @@ -88,8 +88,9 @@ public void processSummaryStats(Submission submission, String fileUploadId, List fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUpload.setErrors(errors); fileUploadsService.save(fileUpload); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, true)); - auditProxy.addAuditEntry(AuditHelper.submissionFailed(submission.getCreated().getUserId(), submission)); + + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, false, errors)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); } else { log.info("Successfully registered {} summary stats with callback ID: {}", summaryStatsEntries.size(), callbackId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java index 4152593..034ec72 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java @@ -157,7 +157,7 @@ public void validateSummaryStatsData(Submission submission) { this.markInvalidFile(dataFile, submission, ErrorType.INVALID_FILE, dataFile.getFileName(), dataReader, schemaReader); } if (validationOutcome.getErrorMessages().isEmpty()) { - auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), dataFile, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), dataFile, submission, true, true, null)); conversionService.convertData(submission, dataFile, dataReader, schema); } else { submission.setOverallStatus(Status.INVALID.name()); @@ -169,16 +169,17 @@ public void validateSummaryStatsData(Submission submission) { dataFile.setErrors(errors); dataFile.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(dataFile); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), dataFile, errors, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), dataFile, submission, true, false, errors)); } } else { - auditProxy.addAuditEntry(AuditHelper.fileValidationSuccess(submission.getCreated().getUserId(), dataFile, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), dataFile, submission, true, true, null)); conversionService.convertData(submission, dataFile, dataReader, schema); } } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); List errors = ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor); dataFile.setErrors(errors); @@ -186,7 +187,7 @@ public void validateSummaryStatsData(Submission submission) { fileUploadsService.save(dataFile); dataReader.close(); schemaReader.close(); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), dataFile, errors, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), dataFile, submission, true, false, errors)); } } @@ -203,10 +204,11 @@ private void markInvalidFile(FileUpload fileUpload, Submission submission, Strin fileUpload.setErrors(errors); fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); - auditProxy.addAuditEntry(AuditHelper.fileValidationFailed(submission.getCreated().getUserId(), fileUpload, errors, false)); + auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, false, errors)); submission.setSummaryStatsStatus(Status.INVALID.name()); submission.setOverallStatus(Status.INVALID.name()); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); submissionService.saveSubmission(submission); if (dataReader != null) { dataReader.close(); From 7ce34592f29f2da0f2b56a11fd555b33b581e40f Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 15 Apr 2020 21:09:43 +0800 Subject: [PATCH 12/23] Added GET /v1/submissions?bowId= --- .../GWASDepositionBackendConstants.java | 2 ++ .../repository/SubmissionRepository.java | 4 ++++ .../controllers/SubmissionsController.java | 11 ++++++---- .../deposition/service/SubmissionService.java | 2 +- .../service/impl/SubmissionServiceImpl.java | 22 +++++++++++++------ 5 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index 99fbd34..b477b4c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -28,6 +28,8 @@ public class GWASDepositionBackendConstants { public static final String PARAM_PMID = "pmid"; + public static final String PARAM_BOWID = "bowId"; + public static final String PARAM_AUTHOR = "author"; public static final String PARAM_TITLE = "title"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java index c429e7e..a443fba 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/SubmissionRepository.java @@ -24,6 +24,10 @@ public interface SubmissionRepository extends MongoRepository findByBodyOfWorksContainsAndCreated_UserIdAndArchived(String bodyOfWorkId, String userId, boolean archived); + Page findByBodyOfWorksContainsAndCreated_UserIdAndArchived(String bodyOfWorkId, String userId, boolean archived, Pageable page); + + Page findByBodyOfWorksContainsAndArchived(String bodyOfWorkId, boolean archived, Pageable page); + Page findByPublicationIdAndArchived(String publicationId, boolean archived, Pageable page); Page findByPublicationIdAndArchivedAndCreated_UserId(String publicationId, boolean b, String userId, Pageable page); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 97bccc9..7e089a7 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -229,18 +229,21 @@ public PagedResources getSubmissions(HttpServletRequest request, @RequestParam(value = GWASDepositionBackendConstants.PARAM_PMID, required = false) String pmid, + @RequestParam(value = GWASDepositionBackendConstants.PARAM_BOWID, + required = false) + String bowId, @PageableDefault(size = 20, page = 0) Pageable pageable, PagedResourcesAssembler assembler) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); - log.info("[{}] Request to retrieve submissions: {} - {} - {} - {}", user.getName(), - pmid, pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort().toString()); + log.info("[{}] Request to retrieve submissions: {} - {} - {} - {} - {}", user.getName(), + pmid, bowId, pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort().toString()); Publication publication = pmid != null ? publicationService.retrievePublication(pmid, false) : null; Page facetedSearchSubmissions = submissionService.getSubmissions(publication != null ? - publication.getId() : null, pageable, user); + publication.getId() : null, bowId, pageable, user); log.info("Returning {} submissions.", facetedSearchSubmissions.getTotalElements()); final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( - ControllerLinkBuilder.methodOn(SubmissionsController.class).getSubmissions(null, pmid, pageable, assembler)); + ControllerLinkBuilder.methodOn(SubmissionsController.class).getSubmissions(null, pmid, bowId, pageable, assembler)); return assembler.toResource(facetedSearchSubmissions, submissionAssemblyService, new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java index 5753ee9..bac918f 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/SubmissionService.java @@ -15,7 +15,7 @@ public interface SubmissionService { Submission saveSubmission(Submission submission); - Page getSubmissions(String pmid, Pageable page, User user); + Page getSubmissions(String pmid, String bowId, Pageable page, User user); Submission findByBodyOfWork(String bodyOfWorkId, String userId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java index 916badd..7c9f425 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java @@ -90,17 +90,25 @@ public Submission saveSubmission(Submission submission) { } @Override - public Page getSubmissions(String publicationId, Pageable page, User user) { + public Page getSubmissions(String publicationId, String bowId, Pageable page, User user) { log.info("Retrieving submissions: {} - {} - {}", page.getPageNumber(), page.getPageSize(), page.getSort().toString()); if (curatorAuthService.isCurator(user)) { - return publicationId != null ? - submissionRepository.findByPublicationIdAndArchived(publicationId, false, page) : - submissionRepository.findByArchived(false, page); + if (publicationId != null) { + return submissionRepository.findByPublicationIdAndArchived(publicationId, false, page); + } + if (bowId != null) { + return submissionRepository.findByBodyOfWorksContainsAndArchived(bowId, false, page); + } + return submissionRepository.findByArchived(false, page); } - return publicationId != null ? - submissionRepository.findByPublicationIdAndArchivedAndCreated_UserId(publicationId, false, user.getId(), page) : - submissionRepository.findByArchivedAndCreated_UserId(false, user.getId(), page); + if (publicationId != null) { + return submissionRepository.findByPublicationIdAndArchivedAndCreated_UserId(publicationId, false, user.getId(), page); + } + if (bowId != null) { + return submissionRepository.findByBodyOfWorksContainsAndCreated_UserIdAndArchived(bowId, user.getId(), false, page); + } + return submissionRepository.findByArchivedAndCreated_UserId(false, user.getId(), page); } @Override From 8e20a07bfb36580f3b37cece9c08a84c1252862c Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 15 Apr 2020 21:41:48 +0800 Subject: [PATCH 13/23] Fixed various audit-related aspects. --- .../deposition/rest/controllers/SubmissionsController.java | 2 ++ .../gwas/deposition/scheduler/tasks/SSCallbackTask.java | 4 ++-- .../ebi/spot/gwas/deposition/service/BodyOfWorkService.java | 2 ++ .../gwas/deposition/service/impl/BodyOfWorkServiceImpl.java | 6 ++++++ .../gwas/deposition/service/impl/ConversionServiceImpl.java | 2 +- .../service/impl/MetadataValidationServiceImpl.java | 4 ++-- .../service/impl/SummaryStatsProcessingServiceImpl.java | 2 +- .../service/impl/SummaryStatsValidationServiceImpl.java | 4 ++-- 8 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 7e089a7..fa9c9a4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -104,6 +104,8 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr } submission = submissionService.createSubmission(submission); + bodyOfWork.setStatus(BodyOfWorkStatus.SUBMISSION_EXISTS.name()); + bodyOfWorkService.save(bodyOfWork); auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, false, true)); return submissionAssemblyService.toResource(submission); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java index 0afa9c5..818e240 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java @@ -129,12 +129,12 @@ public void checkCallbackIds() { } backendEmailService.sendSuccessEmail(userId, publication.getPmid(), metadata); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true, null)); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); backendEmailService.sendFailEmail(userId, publication.getPmid(), metadata, errors); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); } submissionService.saveSubmission(submission); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java index 484dcf2..eb97c07 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -12,4 +12,6 @@ public interface BodyOfWorkService { Page retrieveBodyOfWorks(String userId, Pageable pageable); void deleteBodyOfWork(String bodyofworkId, String userId); + + void save(BodyOfWork bodyOfWork); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 8754908..294429d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -70,4 +70,10 @@ public void deleteBodyOfWork(String bodyofworkId, String userId) { bodyOfWorkRepository.save(bodyOfWork); log.info("Body of work successfully deleted: {}", bodyOfWork.getBowId()); } + + @Override + public void save(BodyOfWork bodyOfWork) { + log.info("Saving: {}", bodyOfWork.getBowId()); + bodyOfWorkRepository.save(bodyOfWork); + } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java index 05277f0..6ba132d 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java @@ -128,7 +128,7 @@ public void convertData(Submission submission, FileUpload fileUpload, submission.setOverallStatus(Status.VALIDATING.name()); submission.setMetadataStatus(Status.VALID.name()); submissionService.saveSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true, null)); fileUpload.setStatus(FileUploadStatus.VALID.name()); fileUploadsService.save(fileUpload); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java index d7d6e77..b4ec800 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/MetadataValidationServiceImpl.java @@ -120,7 +120,7 @@ public void validateTemplate(String submissionId, FileUpload fileUpload, byte[] fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, false, false, errors)); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); } } @@ -140,7 +140,7 @@ private void materializeError(Submission submission, FileUpload fileUpload, Stri fileUpload.setStatus(FileUploadStatus.INVALID.name()); fileUploadsService.save(fileUpload); streamSubmissionTemplateReader.close(); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, false, false, errors)); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java index 31119a9..cbafad0 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsProcessingServiceImpl.java @@ -90,7 +90,7 @@ public void processSummaryStats(Submission submission, String fileUploadId, List fileUploadsService.save(fileUpload); auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, false, errors)); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); } else { log.info("Successfully registered {} summary stats with callback ID: {}", summaryStatsEntries.size(), callbackId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java index 034ec72..b7aee04 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SummaryStatsValidationServiceImpl.java @@ -179,7 +179,6 @@ public void validateSummaryStatsData(Submission submission) { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); submissionService.saveSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); List errors = ErrorUtil.transform(validationOutcome.getErrorMessages(), errorMessageTemplateProcessor); dataFile.setErrors(errors); @@ -188,6 +187,7 @@ public void validateSummaryStatsData(Submission submission) { dataReader.close(); schemaReader.close(); auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), dataFile, submission, true, false, errors)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); } } @@ -208,7 +208,7 @@ private void markInvalidFile(FileUpload fileUpload, Submission submission, Strin submission.setSummaryStatsStatus(Status.INVALID.name()); submission.setOverallStatus(Status.INVALID.name()); - auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false)); + auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); submissionService.saveSubmission(submission); if (dataReader != null) { dataReader.close(); From 662bd6fa57e2a8032002c1b79741a66ab9f744c1 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Tue, 21 Apr 2020 19:35:13 +0800 Subject: [PATCH 14/23] Enabled auditing. --- .../spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java | 2 +- .../ebi/spot/gwas/deposition/service/BackendEmailService.java | 4 ++-- .../gwas/deposition/service/impl/BackendEmailServiceImpl.java | 4 ++-- .../gwas/deposition/service/impl/email/FailEmailBuilder.java | 4 ++-- .../deposition/service/impl/email/SuccessEmailBuilder.java | 4 ++-- src/main/resources/application-sandbox.yml | 3 +++ 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java index 818e240..ac6444c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java @@ -109,7 +109,7 @@ public void checkCallbackIds() { new User(gwasDepositionBackendConfig.getAutoCuratorServiceAccount(), gwasDepositionBackendConfig.getAutoCuratorServiceAccount())); Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); - Map metadata = new HashMap<>(); + Map metadata = new HashMap<>(); metadata.put(MailConstants.PUBLICATION_TITLE, publication.getTitle()); metadata.put(MailConstants.PMID, publication.getPmid()); metadata.put(MailConstants.FIRST_AUTHOR, publication.getFirstAuthor()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java index 7f7f1a3..cc9a445 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BackendEmailService.java @@ -5,8 +5,8 @@ public interface BackendEmailService { - void sendSuccessEmail(String userId, String pubmedId, Map metadata); + void sendSuccessEmail(String userId, String pubmedId, Map metadata); - void sendFailEmail(String userId, String pubmedId, Map metadata, List errors); + void sendFailEmail(String userId, String pubmedId, Map metadata, List errors); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java index 2eb3d5d..573914e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BackendEmailServiceImpl.java @@ -27,7 +27,7 @@ public class BackendEmailServiceImpl implements BackendEmailService { @Autowired private UserService userService; - public void sendSuccessEmail(String userId, String pubmedId, Map metadata) { + public void sendSuccessEmail(String userId, String pubmedId, Map metadata) { User user = userService.getUser(userId); metadata.put(MailConstants.USER_NAME, user.getName()); @@ -37,7 +37,7 @@ public void sendSuccessEmail(String userId, String pubmedId, Map } } - public void sendFailEmail(String userId, String pubmedId, Map metadata, List errors) { + public void sendFailEmail(String userId, String pubmedId, Map metadata, List errors) { User user = userService.getUser(userId); metadata.put(MailConstants.USER_NAME, user.getName()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java index 5682e2d..6058552 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/FailEmailBuilder.java @@ -22,13 +22,13 @@ public FailEmailBuilder(String emailFile, List errors) { } @Override - public String getEmailContent(Map metadata) { + public String getEmailContent(Map metadata) { log.info("Building fail email from: {}", emailFile); String content = super.readEmailContent(); if (content != null) { Context context = new Context(); for (String variable : metadata.keySet()) { - String variableValue = metadata.get(variable); + Object variableValue = metadata.get(variable); context.setVariable(variable, variableValue); } context.setVariable(MailConstants.ERRORS, errors); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java index d0d0f07..75f86c3 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/email/SuccessEmailBuilder.java @@ -17,13 +17,13 @@ public SuccessEmailBuilder(String emailFile) { } @Override - public String getEmailContent(Map metadata) { + public String getEmailContent(Map metadata) { log.info("Building success email from: {}", emailFile); String content = super.readEmailContent(); if (content != null) { Context context = new Context(); for (String variable : metadata.keySet()) { - String variableValue = metadata.get(variable); + Object variableValue = metadata.get(variable); context.setVariable(variable, variableValue); } return templateEngine.process(content, context); diff --git a/src/main/resources/application-sandbox.yml b/src/main/resources/application-sandbox.yml index 89206bc..cbb17ef 100644 --- a/src/main/resources/application-sandbox.yml +++ b/src/main/resources/application-sandbox.yml @@ -23,6 +23,9 @@ spring: starttls: enable: true +audit: + enabled: true + quartz: scheduler: dbName: deposition-backend-sandbox From dffe5a1f1fb325490d8203bf3d1151a62013c6b0 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 22 Apr 2020 19:46:50 +0800 Subject: [PATCH 15/23] Added Completed submissions check. --- .../CompletedSubmissionRepository.java | 8 ++++ .../config/CompleteSubmissionsConfig.java | 45 +++++++++++++++++++ .../jobs/CompleteSubmissionsJob.java | 24 ++++++++++ .../tasks/CompleteSubmissionsTask.java | 42 +++++++++++++++++ src/main/resources/application.yml | 2 + 5 files changed, 121 insertions(+) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/CompletedSubmissionRepository.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/config/CompleteSubmissionsConfig.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/jobs/CompleteSubmissionsJob.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/CompletedSubmissionRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/CompletedSubmissionRepository.java new file mode 100644 index 0000000..36ef6a1 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/CompletedSubmissionRepository.java @@ -0,0 +1,8 @@ +package uk.ac.ebi.spot.gwas.deposition.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import uk.ac.ebi.spot.gwas.deposition.domain.CompletedSubmission; + +public interface CompletedSubmissionRepository extends MongoRepository { + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/config/CompleteSubmissionsConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/config/CompleteSubmissionsConfig.java new file mode 100644 index 0000000..2ab10bc --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/config/CompleteSubmissionsConfig.java @@ -0,0 +1,45 @@ +package uk.ac.ebi.spot.gwas.deposition.scheduler.config; + +import org.quartz.*; +import org.quartz.impl.JobDetailImpl; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import uk.ac.ebi.spot.gwas.deposition.scheduler.jobs.CompleteSubmissionsJob; + +import java.util.Date; + +@Configuration +@ConditionalOnProperty(name = "gwas-sumstats-service.callback-schedule.enabled", havingValue = "true") +public class CompleteSubmissionsConfig extends AbstractQuartzConfig { + + private static final String JK_COMPLETESUB = "JK_COMPLETESUB"; + + private static final String PG_COMPLETESUB = "PG_COMPLETESUB"; + + private static final String TK_COMPLETESUB = "TK_COMPLETESUB"; + + @Value("${quartz.jobs.complete-submissions.schedule}") + private String completeSubmissionsSchedule; + + public CompleteSubmissionsConfig() { + super(TK_COMPLETESUB, PG_COMPLETESUB); + } + + public JobDetail getjobDetail() { + JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setKey(new JobKey(JK_COMPLETESUB, PG_COMPLETESUB)); + jobDetail.setJobClass(CompleteSubmissionsJob.class); + jobDetail.setDurability(true); + return jobDetail; + } + + public Trigger createNewTrigger(Date startTime) { + return TriggerBuilder.newTrigger() + .forJob(this.getjobDetail()) + .withIdentity(TK_COMPLETESUB, PG_COMPLETESUB) + .withPriority(50) + .withSchedule(CronScheduleBuilder.cronSchedule(completeSubmissionsSchedule)) + .startAt(startTime).build(); + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/jobs/CompleteSubmissionsJob.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/jobs/CompleteSubmissionsJob.java new file mode 100644 index 0000000..d3ab18e --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/jobs/CompleteSubmissionsJob.java @@ -0,0 +1,24 @@ +package uk.ac.ebi.spot.gwas.deposition.scheduler.jobs; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.PersistJobDataAfterExecution; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.quartz.QuartzJobBean; +import uk.ac.ebi.spot.gwas.deposition.scheduler.tasks.CompleteSubmissionsTask; + +@PersistJobDataAfterExecution +@DisallowConcurrentExecution +public class CompleteSubmissionsJob extends QuartzJobBean { + + private ApplicationContext applicationContext; + + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + @Override + protected void executeInternal(JobExecutionContext context) { + applicationContext.getBean(CompleteSubmissionsTask.class).checkCompletedSubmissions(); + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java new file mode 100644 index 0000000..814ebaa --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java @@ -0,0 +1,42 @@ +package uk.ac.ebi.spot.gwas.deposition.scheduler.tasks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.domain.CompletedSubmission; +import uk.ac.ebi.spot.gwas.deposition.domain.Publication; +import uk.ac.ebi.spot.gwas.deposition.repository.CompletedSubmissionRepository; +import uk.ac.ebi.spot.gwas.deposition.service.PublicationService; +import uk.ac.ebi.spot.gwas.deposition.service.SummaryStatsProcessingService; + +import java.util.List; + +@Component +public class CompleteSubmissionsTask { + + private static final Logger log = LoggerFactory.getLogger(CompleteSubmissionsTask.class); + + @Autowired + private PublicationService publicationService; + + @Autowired + private CompletedSubmissionRepository completedSubmissionRepository; + + @Autowired + private SummaryStatsProcessingService summaryStatsProcessingService; + + public void checkCompletedSubmissions() { + log.info("Verifying for completed submissions ..."); + List completedSubmissionList = completedSubmissionRepository.findAll(); + log.info("Found {} completed submissions.", completedSubmissionList.size()); + for (CompletedSubmission completedSubmission : completedSubmissionList) { + Publication publication = publicationService.retrievePublication(completedSubmission.getPublicationId(), true); + if (publication != null) { + log.info("Calling SS Service to wrap up Globus for publication: {}", publication.getPmid()); + summaryStatsProcessingService.callGlobusWrapUp(publication); + } + } + log.info("Completed submissions check done."); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index cc8d5f0..bc08f65 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -22,6 +22,8 @@ quartz: schedule: 0 0 0 0 * ? solr-check: schedule: 0 */1 * * * ? + complete-submissions: + schedule: 0 */10 * * * ? gwas-deposition: auth: From c9b2eda6b9cef3f18d64c3158015be43ae22221e Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 23 Apr 2020 19:04:30 +0800 Subject: [PATCH 16/23] Fixed file handling for body of work submisssions. Enabled completed submissions task. --- .../config/BackendQuartzConfig.java | 6 ++ .../controllers/SubmissionsController.java | 86 ++++++++++--------- .../scheduler/tasks/SSCallbackTask.java | 33 ++++--- src/main/resources/application.yml | 2 +- src/main/resources/emails/fail.email | 4 +- src/main/resources/emails/success.email | 4 +- 6 files changed, 78 insertions(+), 57 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendQuartzConfig.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendQuartzConfig.java index bf48fe4..12cef26 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendQuartzConfig.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/config/BackendQuartzConfig.java @@ -31,6 +31,9 @@ public class BackendQuartzConfig { @Autowired(required = false) private SOLRDocumentStatusCheckConfigSandbox solrDocumentStatusCheckConfigSandbox; + @Autowired(required = false) + private CompleteSubmissionsConfig completeSubmissionsConfig; + @PostConstruct private void initialize() throws SchedulerException { if (statsConfig != null) { @@ -51,6 +54,9 @@ private void initialize() throws SchedulerException { if (solrDocumentStatusCheckConfigSandbox != null) { quartzSchedulerJobConfig.addJob(solrDocumentStatusCheckConfigSandbox); } + if (completeSubmissionsConfig != null) { + quartzSchedulerJobConfig.addJob(completeSubmissionsConfig); + } quartzSchedulerJobConfig.initializeJobs(); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index fa9c9a4..c52bcdc 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -81,11 +81,28 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to create new submission.", user.getName()); + if (submissionCreationDto.getPublication() == null && submissionCreationDto.getBodyOfWork() == null) { + log.error("Submission is missing body payload."); + throw new InvalidSubmissionTypeException("Submission is missing body payload."); + } - if (submissionCreationDto.getPublication() == null) { - if (submissionCreationDto.getBodyOfWork() == null) { - throw new InvalidSubmissionTypeException("Submission is missing body payload."); + String globusFolder = UUID.randomUUID().toString(); + SSGlobusResponse outcome = sumStatsService.createGlobusFolder(new SSGlobusFolderDto(globusFolder, + submissionCreationDto.getGlobusIdentity() != null ? + submissionCreationDto.getGlobusIdentity() : + user.getEmail())); + if (outcome != null) { + if (!outcome.isValid()) { + auditProxy.addAuditEntry(AuditHelper.globusCreate(user.getId(), false, outcome)); + log.error("Unable to create Globus folder: {}", outcome.getOutcome()); + throw new EmailAccountNotLinkedToGlobusException(outcome.getOutcome()); } + } else { + auditProxy.addAuditEntry(AuditHelper.globusCreate(user.getId(), false, null)); + throw new SSGlobusFolderCreatioException("Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."); + } + + if (submissionCreationDto.getBodyOfWork() != null) { log.info("Received submission based on body of work: {}", submissionCreationDto.getBodyOfWork().getTitle()); BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(submissionCreationDto.getBodyOfWork(), new Provenance(DateTime.now(), user.getId())); @@ -94,11 +111,14 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr Submission submission = new Submission(bodyOfWork.getBowId(), SubmissionProvenanceType.BODY_OF_WORK.name(), new Provenance(DateTime.now(), user.getId())); + submission.setGlobusFolderId(globusFolder); + submission.setGlobusOriginId(outcome.getOutcome()); + submission.setType(SubmissionType.METADATA.name()); auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, true, true)); Submission existing = submissionService.findByBodyOfWork(bodyOfWork.getBowId(), user.getId()); if (existing != null) { - log.error("Unable to create submission using: {}. A submission already exists."); + log.error("Unable to create submission using: {}. A submission already exists.", bodyOfWork.getBowId()); auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, false, false)); throw new CannotCreateSubmissionOnExistingBodyOfWork("Unable to create submission using: " + bodyOfWork.getBowId() + ". A submission already exists."); } @@ -118,47 +138,29 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr SubmissionProvenanceType.PUBLICATION.name(), new Provenance(DateTime.now(), user.getId())); - String globusFolder = UUID.randomUUID().toString(); - SSGlobusResponse outcome = sumStatsService.createGlobusFolder(new SSGlobusFolderDto(globusFolder, - submissionCreationDto.getGlobusIdentity() != null ? - submissionCreationDto.getGlobusIdentity() : - user.getEmail())); - if (outcome != null) { - if (!outcome.isValid()) { - auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), true, false, outcome.getOutcome())); - log.error("Unable to create Globus folder: {}", outcome.getOutcome()); - throw new EmailAccountNotLinkedToGlobusException(outcome.getOutcome()); - } - submission.setGlobusFolderId(globusFolder); - submission.setGlobusOriginId(outcome.getOutcome()); + submission.setGlobusFolderId(globusFolder); + submission.setGlobusOriginId(outcome.getOutcome()); + auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), + submission, submissionCreationDto.getPublication(), true, true, null)); + + if (publication.getStatus().equals(PublicationStatus.ELIGIBLE.name())) { + publication.setStatus(PublicationStatus.UNDER_SUBMISSION.name()); + submission.setType(SubmissionType.METADATA.name()); + submission = submissionService.createSubmission(submission); auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), true, true, null)); - - - if (publication.getStatus().equals(PublicationStatus.ELIGIBLE.name())) { - publication.setStatus(PublicationStatus.UNDER_SUBMISSION.name()); - submission.setType(SubmissionType.METADATA.name()); - submission = submissionService.createSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), false, true, null)); - } - if (publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { - publication.setStatus(PublicationStatus.UNDER_SUMMARY_STATS_SUBMISSION.name()); - submission.setType(SubmissionType.SUMMARY_STATS.name()); - submission = submissionService.createSubmission(submission); - auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), false, true, null)); - fileHandlerService.handleSummaryStatsTemplate(submission, publication); - } - publicationService.savePublication(publication); - log.info("Returning new submission: {}", submission.getId()); - return submissionAssemblyService.toResource(submission); - } else { + submission, submissionCreationDto.getPublication(), false, true, null)); + } + if (publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { + publication.setStatus(PublicationStatus.UNDER_SUMMARY_STATS_SUBMISSION.name()); + submission.setType(SubmissionType.SUMMARY_STATS.name()); + submission = submissionService.createSubmission(submission); auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), true, false, null)); - throw new SSGlobusFolderCreatioException("Sorry! There is a fault on our end. Please contact gwas-info@ebi.ac.uk for help."); + submission, submissionCreationDto.getPublication(), false, true, null)); + fileHandlerService.handleSummaryStatsTemplate(submission, publication); } + publicationService.savePublication(publication); + log.info("Returning new submission: {}", submission.getId()); + return submissionAssemblyService.toResource(submission); } throw new SubmissionOnUnacceptedPublicationTypeException("Submissions are only accepted on ELIGIBLE or PUBLISHED publications."); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java index ac6444c..6e4e951 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/SSCallbackTask.java @@ -8,10 +8,7 @@ import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.config.BackendMailConfig; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; -import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; -import uk.ac.ebi.spot.gwas.deposition.constants.MailConstants; -import uk.ac.ebi.spot.gwas.deposition.constants.Status; -import uk.ac.ebi.spot.gwas.deposition.constants.SummaryStatsEntryStatus; +import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsResponseDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsStatusDto; @@ -56,6 +53,9 @@ public class SSCallbackTask { @Autowired private PublicationService publicationService; + @Autowired + private BodyOfWorkService bodyOfWorkService; + @Autowired private AuditProxy auditProxy; @@ -108,11 +108,24 @@ public void checkCallbackIds() { Submission submission = submissionService.getSubmission(callbackId.getSubmissionId(), new User(gwasDepositionBackendConfig.getAutoCuratorServiceAccount(), gwasDepositionBackendConfig.getAutoCuratorServiceAccount())); - Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); + Map metadata = new HashMap<>(); - metadata.put(MailConstants.PUBLICATION_TITLE, publication.getTitle()); - metadata.put(MailConstants.PMID, publication.getPmid()); - metadata.put(MailConstants.FIRST_AUTHOR, publication.getFirstAuthor()); + String workId; + if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.PUBLICATION.name())) { + Publication publication = publicationService.retrievePublication(submission.getPublicationId(), true); + metadata.put(MailConstants.PUBLICATION_TITLE, publication.getTitle()); + metadata.put(MailConstants.PMID, publication.getPmid()); + metadata.put(MailConstants.FIRST_AUTHOR, publication.getFirstAuthor()); + workId = publication.getPmid(); + } else { + BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(submission.getBodyOfWorks().get(0), + submission.getCreated().getUserId()); + metadata.put(MailConstants.PUBLICATION_TITLE, bodyOfWork.getTitle()); + metadata.put(MailConstants.PMID, bodyOfWork.getBowId()); + metadata.put(MailConstants.FIRST_AUTHOR, bodyOfWork.getFirstAuthor()); + workId = bodyOfWork.getBowId(); + } + metadata.put(MailConstants.SUBMISSION_ID, backendMailConfig.getSubmissionsBaseURL() + submission.getId()); String userId = submission.getLastUpdated() != null ? submission.getLastUpdated().getUserId() : @@ -128,12 +141,12 @@ public void checkCallbackIds() { auditProxy.addAuditEntry(AuditHelper.fileValidate(submission.getCreated().getUserId(), fileUpload, submission, true, true, null)); } - backendEmailService.sendSuccessEmail(userId, publication.getPmid(), metadata); + backendEmailService.sendSuccessEmail(userId, workId, metadata); auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, true, null)); } else { submission.setOverallStatus(Status.INVALID.name()); submission.setSummaryStatsStatus(Status.INVALID.name()); - backendEmailService.sendFailEmail(userId, publication.getPmid(), metadata, errors); + backendEmailService.sendFailEmail(userId, workId, metadata, errors); auditProxy.addAuditEntry(AuditHelper.submissionValidate(submission.getCreated().getUserId(), submission, false, errors)); } submissionService.saveSubmission(submission); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bc08f65..f581ee3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -41,7 +41,7 @@ gwas-deposition: solr: enabled: false email-config: - subject: GWAS Catalog submission for publication %PMID% + subject: GWAS Catalog submission for %PMID% base-url: https://www.ebi.ac.uk/gwas/deposition/submission/ emails: success: emails/success.email diff --git a/src/main/resources/emails/fail.email b/src/main/resources/emails/fail.email index c50498a..8431e3b 100644 --- a/src/main/resources/emails/fail.email +++ b/src/main/resources/emails/fail.email @@ -349,9 +349,9 @@

Dear ,

-

We were unable to validate your submission of summary statistics for the publication +

We were unable to validate your submission of summary statistics for - by et al., PMID .

+ by et al., ID .

This is a list of errors we have encountered:

    diff --git a/src/main/resources/emails/success.email b/src/main/resources/emails/success.email index 6a19ed1..79026af 100644 --- a/src/main/resources/emails/success.email +++ b/src/main/resources/emails/success.email @@ -350,8 +350,8 @@

    Dear ,

    -

    The summary statistics for the publication - by et al., PMID were successfully validated.

    +

    The summary statistics for + by et al., ID were successfully validated.

    Please review the submission report to confirm the submission details. To finalise the submission process, click "Submit".

    From 7b130c528b99f59a1fe5dfdda11b15b7d5745ed7 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 23 Apr 2020 19:22:29 +0800 Subject: [PATCH 17/23] Fixed failing tests. --- .../gwas/deposition/rest/SubmissionsControllerTest.java | 2 +- .../spot/gwas/deposition/scheduler/SSCallbackTaskTest.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java index 4f5921e..e89cea5 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/SubmissionsControllerTest.java @@ -194,7 +194,7 @@ public void shouldCreateBodyOfWorkSubmission() throws Exception { assertTrue(actual.getFiles().isEmpty()); assertEquals(1, bodyOfWorkRepository.findAll().size()); - verify(sumStatsService, times(0)).createGlobusFolder(any()); + verify(sumStatsService, times(1)).createGlobusFolder(any()); mockMvc.perform(delete(GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_BODY_OF_WORK + diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java index 6c01460..7ad3fc1 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/scheduler/SSCallbackTaskTest.java @@ -8,10 +8,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; -import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; -import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadType; -import uk.ac.ebi.spot.gwas.deposition.constants.Status; -import uk.ac.ebi.spot.gwas.deposition.constants.SummaryStatsEntryStatus; +import uk.ac.ebi.spot.gwas.deposition.constants.*; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsResponseDto; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SummaryStatsStatusDto; @@ -100,6 +97,7 @@ public void setup() { submission.setSamples(new ArrayList<>()); submission.setAssociations(new ArrayList<>()); submission.setNotes(new ArrayList<>()); + submission.setProvenanceType(SubmissionProvenanceType.PUBLICATION.name()); submission = submissionRepository.insert(submission); callbackId = new CallbackId(RandomStringUtils.randomAlphanumeric(10), submission.getId()); From eb376d0babc440ffc7faa07b91afecce5cbf9042 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 23 Apr 2020 21:23:57 +0800 Subject: [PATCH 18/23] Fixed CompleteSubmissionTask. --- .../gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java index 814ebaa..28f4ac5 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/scheduler/tasks/CompleteSubmissionsTask.java @@ -36,6 +36,7 @@ public void checkCompletedSubmissions() { log.info("Calling SS Service to wrap up Globus for publication: {}", publication.getPmid()); summaryStatsProcessingService.callGlobusWrapUp(publication); } + completedSubmissionRepository.delete(completedSubmission); } log.info("Completed submissions check done."); } From 364842a2c609c1aa010bb8b54578fa6fb8ff99ed Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Tue, 28 Apr 2020 17:54:15 +0800 Subject: [PATCH 19/23] Added filter by status to body of work API. --- .../GWASDepositionBackendConstants.java | 2 ++ .../repository/BodyOfWorkRepository.java | 5 +++++ .../controllers/BodyOfWorkController.java | 7 ++++-- .../controllers/SubmissionsController.java | 11 +++++----- .../deposition/service/BodyOfWorkService.java | 3 ++- .../service/impl/BodyOfWorkServiceImpl.java | 22 +++++++++++++++---- 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index b477b4c..e960012 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -28,6 +28,8 @@ public class GWASDepositionBackendConstants { public static final String PARAM_PMID = "pmid"; + public static final String PARAM_STATUS = "status"; + public static final String PARAM_BOWID = "bowId"; public static final String PARAM_AUTHOR = "author"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java index 6fdda71..6e1bf2c 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java @@ -13,4 +13,9 @@ public interface BodyOfWorkRepository extends MongoRepository findByArchivedAndCreated_UserId(boolean archived, String userId, Pageable page); + Page findByStatusAndArchived(String status, boolean archived, Pageable page); + + Page findByArchived(boolean archived, Pageable pageable); + + Page findByStatusAndArchivedAndCreated_UserId(String status, boolean archived, String userId, Pageable pageable); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index e214eb0..c98279f 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -100,15 +100,18 @@ public Resource getBodyOfWork(@PathVariable String bodyofworkId, @GetMapping(produces = "application/hal+json") @ResponseStatus(HttpStatus.OK) public PagedResources getBodyOfWorks(@PageableDefault(size = 20, page = 0) Pageable pageable, + @RequestParam(value = GWASDepositionBackendConstants.PARAM_STATUS, + required = false) + String status, PagedResourcesAssembler assembler, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to retrieve body of works.", user.getId()); - Page facetedBodyOfWorks = bodyOfWorkService.retrieveBodyOfWorks(user.getId(), pageable); + Page facetedBodyOfWorks = bodyOfWorkService.retrieveBodyOfWorks(user, status, pageable); auditProxy.addAuditEntry(AuditHelper.bowRetrieve(user.getId(), null)); final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( - ControllerLinkBuilder.methodOn(BodyOfWorkController.class).getBodyOfWorks(pageable, assembler, null)); + ControllerLinkBuilder.methodOn(BodyOfWorkController.class).getBodyOfWorks(pageable, status, assembler, null)); return assembler.toResource(facetedBodyOfWorks, bodyOfWorkDtoAssembler, new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index c52bcdc..6643ef8 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -124,7 +124,7 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr } submission = submissionService.createSubmission(submission); - bodyOfWork.setStatus(BodyOfWorkStatus.SUBMISSION_EXISTS.name()); + bodyOfWork.setStatus(BodyOfWorkStatus.UNDER_SUBMISSION.name()); bodyOfWorkService.save(bodyOfWork); auditProxy.addAuditEntry(AuditHelper.submissionCreateBOW(user.getId(), submission, bodyOfWork, false, true)); return submissionAssemblyService.toResource(submission); @@ -141,24 +141,25 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr submission.setGlobusFolderId(globusFolder); submission.setGlobusOriginId(outcome.getOutcome()); auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), true, true, null)); + submission, publication, true, true, null)); if (publication.getStatus().equals(PublicationStatus.ELIGIBLE.name())) { publication.setStatus(PublicationStatus.UNDER_SUBMISSION.name()); submission.setType(SubmissionType.METADATA.name()); submission = submissionService.createSubmission(submission); auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), false, true, null)); + submission, publication, false, true, null)); + publicationService.savePublication(publication); } if (publication.getStatus().equals(PublicationStatus.PUBLISHED.name())) { publication.setStatus(PublicationStatus.UNDER_SUMMARY_STATS_SUBMISSION.name()); submission.setType(SubmissionType.SUMMARY_STATS.name()); submission = submissionService.createSubmission(submission); auditProxy.addAuditEntry(AuditHelper.submissionCreatePub(user.getId(), - submission, submissionCreationDto.getPublication(), false, true, null)); + submission, publication, false, true, null)); + publicationService.savePublication(publication); fileHandlerService.handleSummaryStatsTemplate(submission, publication); } - publicationService.savePublication(publication); log.info("Returning new submission: {}", submission.getId()); return submissionAssemblyService.toResource(submission); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java index eb97c07..0975c3b 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -3,13 +3,14 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.User; public interface BodyOfWorkService { BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork); BodyOfWork retrieveBodyOfWork(String bodyOfWork, String userId); - Page retrieveBodyOfWorks(String userId, Pageable pageable); + Page retrieveBodyOfWorks(User user, String status, Pageable pageable); void deleteBodyOfWork(String bodyofworkId, String userId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 294429d..44c3834 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -9,9 +9,11 @@ import org.springframework.stereotype.Service; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; +import uk.ac.ebi.spot.gwas.deposition.service.CuratorAuthService; import uk.ac.ebi.spot.gwas.deposition.util.GCPCounter; import java.util.Optional; @@ -27,6 +29,9 @@ public class BodyOfWorkServiceImpl implements BodyOfWorkService { @Autowired private GCPCounter gcpCounter; + @Autowired + private CuratorAuthService curatorAuthService; + @Override public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { log.info("Creating body of work: {}", bodyOfWork.getTitle()); @@ -50,10 +55,19 @@ public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { } @Override - public Page retrieveBodyOfWorks(String userId, Pageable pageable) { - log.info("[{}] Retrieving body of works.", userId); - Page bodyOfWorks = bodyOfWorkRepository.findByArchivedAndCreated_UserId(false, userId, pageable); - return bodyOfWorks; + public Page retrieveBodyOfWorks(User user, String status, Pageable pageable) { + log.info("[{}] Retrieving body of works.", user.getId()); + if (curatorAuthService.isCurator(user)) { + if (status != null) { + return bodyOfWorkRepository.findByStatusAndArchived(status, false, pageable); + } + return bodyOfWorkRepository.findByArchived(false, pageable); + } + if (status != null) { + return bodyOfWorkRepository.findByStatusAndArchivedAndCreated_UserId(status, false, user.getId(), pageable); + } + + return bodyOfWorkRepository.findByArchivedAndCreated_UserId(false, user.getId(), pageable); } @Override From c0b7328b67b903de875caccda24c393b8829eeba Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 29 Apr 2020 19:39:50 +0800 Subject: [PATCH 20/23] Added PUT to body of work. --- .../repository/BodyOfWorkRepository.java | 2 + .../repository/StudyRepository.java | 2 + .../controllers/BodyOfWorkController.java | 23 ++++- .../controllers/SubmissionsController.java | 2 +- .../deposition/service/BodyOfWorkService.java | 6 +- .../service/impl/BodyOfWorkServiceImpl.java | 90 +++++++++++++++++-- .../service/impl/ConversionServiceImpl.java | 32 ++++++- .../rest/BodyOfWorkControllerTest.java | 66 ++++++++++++++ 8 files changed, 207 insertions(+), 16 deletions(-) diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java index 6e1bf2c..757ff94 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkRepository.java @@ -18,4 +18,6 @@ public interface BodyOfWorkRepository extends MongoRepository findByArchived(boolean archived, Pageable pageable); Page findByStatusAndArchivedAndCreated_UserId(String status, boolean archived, String userId, Pageable pageable); + + Optional findByBowIdAndArchived(String bodyOfWorkId, boolean archived); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java index cfc99ff..cb4d36e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java @@ -12,4 +12,6 @@ public interface StudyRepository extends MongoRepository { Page findBySubmissionId(String submissionId, Pageable page); List findByIdIn(List ids); + + List findByBodyOfWorkListContains(String bowId); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java index c98279f..fbe49af 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/BodyOfWorkController.java @@ -88,7 +88,7 @@ public Resource getBodyOfWork(@PathVariable String bodyofworkId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to get body of work: {}", user.getId(), bodyofworkId); - BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user.getId()); + BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user); auditProxy.addAuditEntry(AuditHelper.bowRetrieve(user.getId(), bodyOfWork)); log.info("Returning body of work: {}", bodyOfWork.getId()); return bodyOfWorkDtoAssembler.toResource(bodyOfWork); @@ -118,6 +118,23 @@ public PagedResources getBodyOfWorks(@PageableDefault(size = 20, } + /** + * PUT /v1/bodyofwork/{bodyofworkId} + */ + @PutMapping(value = "/{bodyofworkId}", produces = "application/hal+json") + @ResponseStatus(HttpStatus.OK) + public Resource updateBodyOfWork(@PathVariable String bodyofworkId, + @RequestBody BodyOfWorkDto bodyOfWorkDto, + HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to update body of work: {}", user.getId(), bodyofworkId); + BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(bodyOfWorkDto, new Provenance(DateTime.now(), user.getId())); + BodyOfWork updated = bodyOfWorkService.updateBodyOfWork(bodyofworkId, bodyOfWork, user); + auditProxy.addAuditEntry(AuditHelper.bowUpdate(user.getId(), updated)); + log.info("Returning body of work: {}", updated.getId()); + return bodyOfWorkDtoAssembler.toResource(updated); + } + /** * DELETE /v1/bodyofwork/{bodyofworkId} */ @@ -127,14 +144,14 @@ public void deleteBodyOfWork(@PathVariable String bodyofworkId, HttpServletRequest request) { User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); log.info("[{}] Request to delete body of work: {}", user.getId(), bodyofworkId); - BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user.getId()); + BodyOfWork bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyofworkId, user); Submission submission = submissionService.findByBodyOfWork(bodyofworkId, user.getId()); if (submission != null) { auditProxy.addAuditEntry(AuditHelper.bowDelete(user.getId(), bodyOfWork, false)); log.error("Unable to delete body of work {} because a submission already exists on it: {}", bodyofworkId, submission.getId()); throw new CannotDeleteBodyOfWorkException("Unable to delete body of work: " + bodyofworkId + ". A submission was created using this artefact."); } - bodyOfWorkService.deleteBodyOfWork(bodyofworkId, user.getId()); + bodyOfWorkService.deleteBodyOfWork(bodyofworkId, user); auditProxy.addAuditEntry(AuditHelper.bowDelete(user.getId(), bodyOfWork, true)); } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index 6643ef8..d0827fd 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -106,7 +106,7 @@ public Resource createSubmission(@Valid @RequestBody SubmissionCr log.info("Received submission based on body of work: {}", submissionCreationDto.getBodyOfWork().getTitle()); BodyOfWork bodyOfWork = BodyOfWorkDtoDisassembler.disassemble(submissionCreationDto.getBodyOfWork(), new Provenance(DateTime.now(), user.getId())); - bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getBowId(), user.getId()); + bodyOfWork = bodyOfWorkService.retrieveBodyOfWork(bodyOfWork.getBowId(), user); Submission submission = new Submission(bodyOfWork.getBowId(), SubmissionProvenanceType.BODY_OF_WORK.name(), diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java index 0975c3b..4ef78a4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/BodyOfWorkService.java @@ -8,11 +8,15 @@ public interface BodyOfWorkService { BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork); + BodyOfWork retrieveBodyOfWork(String bodyOfWork, User user); + BodyOfWork retrieveBodyOfWork(String bodyOfWork, String userId); Page retrieveBodyOfWorks(User user, String status, Pageable pageable); - void deleteBodyOfWork(String bodyofworkId, String userId); + void deleteBodyOfWork(String bodyofworkId, User user); void save(BodyOfWork bodyOfWork); + + BodyOfWork updateBodyOfWork(String bodyofworkId, BodyOfWork bodyOfWork, User user); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 44c3834..872d4d6 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -9,13 +9,18 @@ import org.springframework.stereotype.Service; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; +import uk.ac.ebi.spot.gwas.deposition.domain.Study; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkRepository; +import uk.ac.ebi.spot.gwas.deposition.repository.StudyRepository; import uk.ac.ebi.spot.gwas.deposition.service.BodyOfWorkService; import uk.ac.ebi.spot.gwas.deposition.service.CuratorAuthService; +import uk.ac.ebi.spot.gwas.deposition.service.UserService; import uk.ac.ebi.spot.gwas.deposition.util.GCPCounter; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; @Service @@ -32,6 +37,12 @@ public class BodyOfWorkServiceImpl implements BodyOfWorkService { @Autowired private CuratorAuthService curatorAuthService; + @Autowired + private UserService userService; + + @Autowired + private StudyRepository studyRepository; + @Override public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { log.info("Creating body of work: {}", bodyOfWork.getTitle()); @@ -42,9 +53,14 @@ public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { } @Override - public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { - log.info("[{}] Retrieving body of work: {}", userId, bodyOfWorkId); - Optional optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyOfWorkId, false, userId); + public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, User user) { + log.info("[{}] Retrieving body of work: {}", user.getId(), bodyOfWorkId); + Optional optionalBodyOfWork; + if (curatorAuthService.isCurator(user)) { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchived(bodyOfWorkId, false); + } else { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyOfWorkId, false, user.getId()); + } if (!optionalBodyOfWork.isPresent()) { log.error("Unable to find body of work with ID: {}", bodyOfWorkId); throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyOfWorkId); @@ -54,6 +70,12 @@ public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { return optionalBodyOfWork.get(); } + @Override + public BodyOfWork retrieveBodyOfWork(String bodyOfWorkId, String userId) { + User user = userService.getUser(userId); + return this.retrieveBodyOfWork(bodyOfWorkId, user); + } + @Override public Page retrieveBodyOfWorks(User user, String status, Pageable pageable) { log.info("[{}] Retrieving body of works.", user.getId()); @@ -71,15 +93,20 @@ public Page retrieveBodyOfWorks(User user, String status, Pageable p } @Override - public void deleteBodyOfWork(String bodyofworkId, String userId) { - log.info("[{}] Deleting body of work: {}", userId, bodyofworkId); - Optional optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyofworkId, false, userId); + public void deleteBodyOfWork(String bodyofworkId, User user) { + log.info("[{}] Deleting body of work: {}", user.getId(), bodyofworkId); + Optional optionalBodyOfWork; + if (curatorAuthService.isCurator(user)) { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchived(bodyofworkId, false); + } else { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyofworkId, false, user.getId()); + } if (!optionalBodyOfWork.isPresent()) { log.error("Unable to find body of work with ID: {}", bodyofworkId); throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyofworkId); } BodyOfWork bodyOfWork = optionalBodyOfWork.get(); - bodyOfWork.setLastUpdated(new Provenance(DateTime.now(), userId)); + bodyOfWork.setLastUpdated(new Provenance(DateTime.now(), user.getId())); bodyOfWork.setArchived(true); bodyOfWorkRepository.save(bodyOfWork); log.info("Body of work successfully deleted: {}", bodyOfWork.getBowId()); @@ -90,4 +117,53 @@ public void save(BodyOfWork bodyOfWork) { log.info("Saving: {}", bodyOfWork.getBowId()); bodyOfWorkRepository.save(bodyOfWork); } + + @Override + public BodyOfWork updateBodyOfWork(String bodyofworkId, BodyOfWork bodyOfWork, User user) { + log.info("[{}] Retrieving body of work: {}", user.getId(), bodyofworkId); + Optional optionalBodyOfWork; + if (curatorAuthService.isCurator(user)) { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchived(bodyofworkId, false); + } else { + optionalBodyOfWork = bodyOfWorkRepository.findByBowIdAndArchivedAndCreated_UserId(bodyofworkId, false, user.getId()); + } + if (!optionalBodyOfWork.isPresent()) { + log.error("Unable to find body of work with ID: {}", bodyofworkId); + throw new EntityNotFoundException("Unable to find body of work with ID: " + bodyofworkId); + } + BodyOfWork existing = optionalBodyOfWork.get(); + existing.setCorrespondingAuthors(bodyOfWork.getCorrespondingAuthors()); + existing.setDescription(bodyOfWork.getDescription()); + existing.setDoi(bodyOfWork.getDoi()); + existing.setEmbargoDate(bodyOfWork.getEmbargoDate()); + existing.setEmbargoUntilPublished(bodyOfWork.getEmbargoUntilPublished()); + existing.setFirstAuthor(bodyOfWork.getFirstAuthor()); + existing.setJournal(bodyOfWork.getJournal()); + existing.setLastAuthor(bodyOfWork.getLastAuthor()); + existing.setPmids(bodyOfWork.getPmids() != null ? bodyOfWork.getPmids() : existing.getPmids()); + existing.setPrePrintServer(bodyOfWork.getPrePrintServer()); + existing.setPreprintServerDOI(bodyOfWork.getPreprintServerDOI()); + existing.setTitle(bodyOfWork.getTitle()); + existing.setUrl(bodyOfWork.getUrl()); + + if (existing.getPmids() != null) { + if (!existing.getPmids().isEmpty()) { + List studyList = studyRepository.findByBodyOfWorkListContains(bodyofworkId); + for (Study study : studyList) { + List pmids = study.getPmids() != null ? study.getPmids() : new ArrayList<>(); + for (String pmid : existing.getPmids()) { + if (!pmids.contains(pmid)) { + pmids.add(pmid); + } + } + + study.setPmids(pmids); + studyRepository.save(study); + } + } + } + + existing = bodyOfWorkRepository.save(existing); + return existing; + } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java index 6ba132d..3cb20a4 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/ConversionServiceImpl.java @@ -9,13 +9,11 @@ import uk.ac.ebi.spot.gwas.deposition.audit.AuditProxy; import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; import uk.ac.ebi.spot.gwas.deposition.constants.Status; +import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionProvenanceType; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.dto.*; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.TemplateSchemaDto; -import uk.ac.ebi.spot.gwas.deposition.repository.AssociationRepository; -import uk.ac.ebi.spot.gwas.deposition.repository.NoteRepository; -import uk.ac.ebi.spot.gwas.deposition.repository.SampleRepository; -import uk.ac.ebi.spot.gwas.deposition.repository.StudyRepository; +import uk.ac.ebi.spot.gwas.deposition.repository.*; import uk.ac.ebi.spot.gwas.deposition.rest.dto.AssociationDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.rest.dto.NoteDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.rest.dto.SampleDtoAssembler; @@ -32,6 +30,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service public class ConversionServiceImpl implements ConversionService { @@ -65,6 +64,12 @@ public class ConversionServiceImpl implements ConversionService { @Autowired private GCSTCounter gcstCounter; + @Autowired + private PublicationRepository publicationRepository; + + @Autowired + private BodyOfWorkRepository bodyOfWorkRepository; + @Autowired private AuditProxy auditProxy; @@ -86,6 +91,25 @@ public void convertData(Submission submission, FileUpload fileUpload, study.setAccession(gcstCounter.getNext()); } study.setSubmissionId(submission.getId()); + if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.BODY_OF_WORK.name())) { + if (!submission.getBodyOfWorks().isEmpty()) { + study.setBodyOfWorkList(submission.getBodyOfWorks()); + + Optional bodyOfWorkOptional = bodyOfWorkRepository.findByBowIdAndArchived(submission.getBodyOfWorks().get(0), false); + if (bodyOfWorkOptional.isPresent()) { + if (bodyOfWorkOptional.get().getPmids() != null) { + study.setPmids(bodyOfWorkOptional.get().getPmids()); + } + } + } + } else { + Optional publicationOptional = publicationRepository.findById(submission.getPublicationId()); + if (publicationOptional.isPresent()) { + List pmids = new ArrayList<>(); + pmids.add(publicationOptional.get().getPmid()); + study.setPmids(pmids); + } + } study = studyRepository.insert(study); submission.addStudy(study.getId()); diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java index 304f873..2cbbe43 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/BodyOfWorkControllerTest.java @@ -13,10 +13,12 @@ import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; import uk.ac.ebi.spot.gwas.deposition.domain.SSGlobusResponse; +import uk.ac.ebi.spot.gwas.deposition.dto.AuthorDto; import uk.ac.ebi.spot.gwas.deposition.dto.BodyOfWorkDto; import uk.ac.ebi.spot.gwas.deposition.rest.dto.BodyOfWorkDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.service.SumStatsService; +import java.util.Arrays; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -100,6 +102,70 @@ public void shouldGetBodyOfWork() throws Exception { assertEquals(bodyOfWork.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); } + /** + * GET /v1/bodyofwork/{bodyofworkId} + */ + @Test + public void shouldPutBodyOfWork() throws Exception { + BodyOfWorkDto bodyOfWorkDto = create(); + String endpoint = GeneralCommon.API_V1 + + GWASDepositionBackendConstants.API_BODY_OF_WORK + + "/" + bodyOfWorkDto.getBodyOfWorkId(); + + String response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actualResource = mapper.readValue(response, new TypeReference>() { + }); + BodyOfWorkDto actual = actualResource.getContent(); + + assertEquals(bodyOfWork.getTitle(), actual.getTitle()); + assertEquals(bodyOfWork.getJournal(), actual.getJournal()); + assertEquals(bodyOfWork.getFirstAuthor().getFirstName(), actual.getFirstAuthor().getFirstName()); + assertEquals(bodyOfWork.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); + + BodyOfWorkDto updated = new BodyOfWorkDto(actual.getBodyOfWorkId(), + "Updated title", + actual.getDescription(), + new AuthorDto("1", "2", "group", "email"), + actual.getLastAuthor(), + actual.getJournal(), + actual.getDoi(), + actual.getUrl(), + actual.getCorrespondingAuthors(), + actual.getPrePrintServer(), + actual.getPreprintServerDOI(), + actual.getEmbargoDate(), + actual.getEmbargoUntilPublished(), + Arrays.asList(new String[]{ + "1", + "2" + }), + actual.getStatus()); + + response = mockMvc.perform(put(endpoint) + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(updated))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + actualResource = mapper.readValue(response, new TypeReference>() { + }); + actual = actualResource.getContent(); + + assertEquals(updated.getTitle(), actual.getTitle()); + assertEquals(updated.getJournal(), actual.getJournal()); + assertEquals(updated.getPmids(), actual.getPmids()); + assertEquals(updated.getFirstAuthor().getFirstName(), actual.getFirstAuthor().getFirstName()); + assertEquals(updated.getLastAuthor().getFirstName(), actual.getLastAuthor().getFirstName()); + } + /** * DELETE /v1/bodyofwork/{bodyofworkId} */ From bb02f6a23c5fed11e426e603bec7edd7ad5c2e0a Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Tue, 5 May 2020 22:13:01 +0800 Subject: [PATCH 21/23] Added listener for updated body of works. --- .../components/BodyOfWorkListener.java | 37 +++++++++++++++++++ .../repository/BodyOfWorkWatchRepository.java | 12 ++++++ .../service/impl/BodyOfWorkServiceImpl.java | 5 +++ .../service/impl/SubmissionServiceImpl.java | 8 ++++ 4 files changed, 62 insertions(+) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/components/BodyOfWorkListener.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkWatchRepository.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/components/BodyOfWorkListener.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/components/BodyOfWorkListener.java new file mode 100644 index 0000000..9299641 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/components/BodyOfWorkListener.java @@ -0,0 +1,37 @@ +package uk.ac.ebi.spot.gwas.deposition.components; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWorkWatch; +import uk.ac.ebi.spot.gwas.deposition.domain.Submission; +import uk.ac.ebi.spot.gwas.deposition.repository.BodyOfWorkWatchRepository; + +import java.util.Optional; + +@Component +public class BodyOfWorkListener { + + @Autowired + private BodyOfWorkWatchRepository bodyOfWorkWatchRepository; + + @Async + public void update(BodyOfWork bodyOfWork) { + Optional bodyOfWorkWatchOptional = bodyOfWorkWatchRepository.findByBowId(bodyOfWork.getBowId()); + if (bodyOfWorkWatchOptional.isPresent()) { + BodyOfWorkWatch bodyOfWorkWatch = bodyOfWorkWatchOptional.get(); + bodyOfWorkWatch.setVisited(false); + bodyOfWorkWatchRepository.save(bodyOfWorkWatch); + } + } + + public void update(Submission submission) { + if (submission.getBodyOfWorks() != null) { + if (!submission.getBodyOfWorks().isEmpty()) { + String bowId = submission.getBodyOfWorks().get(0); + bodyOfWorkWatchRepository.insert(new BodyOfWorkWatch(bowId)); + } + } + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkWatchRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkWatchRepository.java new file mode 100644 index 0000000..fa4d0c2 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/BodyOfWorkWatchRepository.java @@ -0,0 +1,12 @@ +package uk.ac.ebi.spot.gwas.deposition.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWorkWatch; + +import java.util.Optional; + +public interface BodyOfWorkWatchRepository extends MongoRepository { + + Optional findByBowId(String bowId); + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java index 872d4d6..5d88ea1 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/BodyOfWorkServiceImpl.java @@ -7,6 +7,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.components.BodyOfWorkListener; import uk.ac.ebi.spot.gwas.deposition.domain.BodyOfWork; import uk.ac.ebi.spot.gwas.deposition.domain.Provenance; import uk.ac.ebi.spot.gwas.deposition.domain.Study; @@ -43,6 +44,9 @@ public class BodyOfWorkServiceImpl implements BodyOfWorkService { @Autowired private StudyRepository studyRepository; + @Autowired + private BodyOfWorkListener bodyOfWorkListener; + @Override public BodyOfWork createBodyOfWork(BodyOfWork bodyOfWork) { log.info("Creating body of work: {}", bodyOfWork.getTitle()); @@ -164,6 +168,7 @@ public BodyOfWork updateBodyOfWork(String bodyofworkId, BodyOfWork bodyOfWork, U } existing = bodyOfWorkRepository.save(existing); + bodyOfWorkListener.update(bodyOfWork); return existing; } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java index 7c9f425..efad45f 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/SubmissionServiceImpl.java @@ -8,7 +8,9 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.components.BodyOfWorkListener; import uk.ac.ebi.spot.gwas.deposition.constants.Status; +import uk.ac.ebi.spot.gwas.deposition.constants.SubmissionProvenanceType; import uk.ac.ebi.spot.gwas.deposition.domain.*; import uk.ac.ebi.spot.gwas.deposition.exception.EntityNotFoundException; import uk.ac.ebi.spot.gwas.deposition.repository.ArchivedSubmissionRepository; @@ -46,6 +48,9 @@ public class SubmissionServiceImpl implements SubmissionService { @Autowired private SummaryStatsEntryRepository summaryStatsEntryRepository; + @Autowired + private BodyOfWorkListener bodyOfWorkListener; + @Override public Submission createSubmission(Submission submission) { log.info("Creating submission for publication: {}", submission.getPublicationId()); @@ -118,6 +123,9 @@ public Submission updateSubmissionStatus(String submissionId, String status, Use submission.setOverallStatus(status); if (status.equals(Status.SUBMITTED)) { submission.setDateSubmitted(LocalDate.now()); + if (submission.getProvenanceType().equalsIgnoreCase(SubmissionProvenanceType.BODY_OF_WORK.name())) { + bodyOfWorkListener.update(submission); + } } submission.setLastUpdated(new Provenance(DateTime.now(), user.getId())); submission = submissionRepository.save(submission); From 2e235a6b8f08ed8eddd9250e756d32581c463373 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Wed, 6 May 2020 20:14:25 +0800 Subject: [PATCH 22/23] Added study envelopes. --- .../GWASDepositionBackendConstants.java | 2 + .../rest/controllers/StudiesController.java | 27 ++++++++ .../rest/dto/StudyEnvelopeDtoAssembler.java | 32 ++++++++++ .../rest/StudiesControllerTest.java | 61 ++++++++++++++++++- 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyEnvelopeDtoAssembler.java diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java index e960012..10f8e58 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/constants/GWASDepositionBackendConstants.java @@ -12,6 +12,8 @@ public class GWASDepositionBackendConstants { public static final String API_STUDIES = "/studies"; + public static final String API_STUDY_ENVELOPES = "/study-envelopes"; + public static final String API_SAMPLES = "/samples"; public static final String API_ASSOCIATIONS = "/associations"; diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java index 10ad327..f4b46ba 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java @@ -20,7 +20,9 @@ import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.dto.StudyDto; +import uk.ac.ebi.spot.gwas.deposition.dto.StudyEnvelopeDto; import uk.ac.ebi.spot.gwas.deposition.rest.dto.StudyDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.StudyEnvelopeDtoAssembler; import uk.ac.ebi.spot.gwas.deposition.service.JWTService; import uk.ac.ebi.spot.gwas.deposition.service.StudiesService; import uk.ac.ebi.spot.gwas.deposition.service.SubmissionService; @@ -54,6 +56,9 @@ public class StudiesController { @Autowired private StudyDtoAssembler studyDtoAssembler; + @Autowired + private StudyEnvelopeDtoAssembler studyEnvelopeDtoAssembler; + /** * GET /v1/submissions/{submissionId}/studies */ @@ -77,4 +82,26 @@ public PagedResources getStudies(@PathVariable String submissionId, Ht } + /** + * GET /v1/submissions/{submissionId}/study-envelopes + */ + @GetMapping(value = "/{submissionId}" + GWASDepositionBackendConstants.API_STUDY_ENVELOPES, + produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public PagedResources getStudyEnvelopes(@PathVariable String submissionId, HttpServletRequest request, + @PageableDefault(size = 20, page = 0) Pageable pageable, + PagedResourcesAssembler assembler) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to retrieve studies for submission: {}", user.getName(), submissionId); + Submission submission = submissionService.getSubmission(submissionId, user); + + Page facetedSearchStudies = studiesService.getStudies(submission, pageable); + log.info("Returning {} studies.", facetedSearchStudies.getTotalElements()); + + final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( + ControllerLinkBuilder.methodOn(StudiesController.class).getStudyEnvelopes(submissionId, null, pageable, assembler)); + return assembler.toResource(facetedSearchStudies, studyEnvelopeDtoAssembler, + new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); + + } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyEnvelopeDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyEnvelopeDtoAssembler.java new file mode 100644 index 0000000..08aca1c --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyEnvelopeDtoAssembler.java @@ -0,0 +1,32 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.Resource; +import org.springframework.hateoas.ResourceAssembler; +import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.stereotype.Component; +import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; +import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; +import uk.ac.ebi.spot.gwas.deposition.domain.Study; +import uk.ac.ebi.spot.gwas.deposition.dto.StudyEnvelopeDto; +import uk.ac.ebi.spot.gwas.deposition.rest.controllers.SubmissionsController; +import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; + + +@Component +public class StudyEnvelopeDtoAssembler implements ResourceAssembler> { + + @Autowired + private GWASDepositionBackendConfig gwasDepositionBackendConfig; + + public Resource toResource(Study study) { + StudyEnvelopeDto studyEnvelopeDto = new StudyEnvelopeDto(study.getAccession()); + + final ControllerLinkBuilder lb = ControllerLinkBuilder.linkTo( + ControllerLinkBuilder.methodOn(SubmissionsController.class).getSubmission(study.getSubmissionId(), null)); + + Resource resource = new Resource<>(studyEnvelopeDto); + resource.add(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).withRel(GWASDepositionBackendConstants.LINKS_PARENT)); + return resource; + } +} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java index 08c7441..b2a8b75 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java @@ -58,7 +58,7 @@ public void setup() { * GET /v1/submissions/{submissionId}/studies */ @Test - public void shouldGetSamples() throws Exception { + public void shouldGetStudies() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), null, RandomStringUtils.randomAlphanumeric(10)); @@ -118,4 +118,63 @@ public void shouldGetSamples() throws Exception { assertEquals(study.getTrait(), studyData.get("trait")); assertEquals(study.getSummaryStatisticsFile(), studyData.get("summary_statistics_file")); } + + + /** + * GET /v1/submissions/{submissionId}/study-envelopes + */ + @Test + public void shouldGetStudyEnvelopes() throws Exception { + SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), + null, + RandomStringUtils.randomAlphanumeric(10)); + String response = mockMvc.perform(post(GeneralCommon.API_V1 + + GWASDepositionBackendConstants.API_SUBMISSIONS) + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(submissionCreationDto))) + .andExpect(status().isCreated()) + .andReturn() + .getResponse() + .getContentAsString(); + + Resource actual = mapper.readValue(response, new TypeReference>() { + }); + SubmissionDto submissionDto = actual.getContent(); + + User user = userService.findUser(new User(submissionDto.getCreated().getUser().getName(), + submissionDto.getCreated().getUser().getEmail()), false); + Submission submission = submissionService.getSubmission(submissionDto.getSubmissionId(), user); + + association.setSubmissionId(submission.getId()); + associationRepository.save(association); + sample.setSubmissionId(submission.getId()); + sampleRepository.save(sample); + study.setSubmissionId(submission.getId()); + studyRepository.save(study); + note.setSubmissionId(submission.getId()); + noteRepository.save(note); + + submission.setAssociations(Arrays.asList(new String[]{association.getId()})); + submission.setSamples(Arrays.asList(new String[]{sample.getId()})); + submission.setStudies(Arrays.asList(new String[]{study.getId()})); + submission.setNotes(Arrays.asList(new String[]{note.getId()})); + submissionService.saveSubmission(submission); + + String endpoint = GeneralCommon.API_V1 + GWASDepositionBackendConstants.API_SUBMISSIONS + + "/" + submissionDto.getSubmissionId() + GWASDepositionBackendConstants.API_STUDY_ENVELOPES; + + response = mockMvc.perform(get(endpoint) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + + Map objectMap = JsonPath.read(response, "$.page"); + assertEquals(1, objectMap.get("totalElements")); + JSONArray jsonArray = JsonPath.read(response, "$._embedded.studies[*]"); + assertEquals(1, jsonArray.size()); + Map studyData = JsonPath.read(response, "$._embedded.studies[0]"); + assertEquals(study.getAccession(), studyData.get("study_accession")); + } } From cf41ff7e8b4b2a99cb2128385da7a166b424dda7 Mon Sep 17 00:00:00 2001 From: Tudor Groza Date: Thu, 14 May 2020 14:25:55 +0800 Subject: [PATCH 23/23] WIP - prefilled tempaltes. --- .gitlab-ci.yml | 24 +---- .../gwas-deposition-backend-deployment.yaml | 5 +- k8chart/values.yaml | 10 +- pom.xml | 2 +- .../repository/StudyRepository.java | 3 + .../rest/controllers/StudiesController.java | 37 +++++-- .../controllers/SubmissionsController.java | 17 ++++ .../dto/SSTemplateGCSTStudyDtoAssembler.java | 17 ++++ .../rest/dto/StudyDtoAssembler.java | 23 +++++ .../service/TemplatePrefillService.java | 10 ++ .../deposition/service/TemplateService.java | 6 ++ .../impl/TemplatePrefillServiceImpl.java | 99 +++++++++++++++++++ .../service/impl/TemplateServiceImpl.java | 70 +++++++++++++ .../gwas/deposition/util/StudyCollector.java | 23 +++++ .../rest/StudiesControllerTest.java | 2 + 15 files changed, 310 insertions(+), 38 deletions(-) create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SSTemplateGCSTStudyDtoAssembler.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplatePrefillService.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplatePrefillServiceImpl.java create mode 100644 src/main/java/uk/ac/ebi/spot/gwas/deposition/util/StudyCollector.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1dd4185..bd3300b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,35 +53,17 @@ deploy-backend-sandbox: image: dtzar/helm-kubectl:2.13.1 stage: deploy-sandbox script: - - echo "Deploy to GCP sandbox server" + - echo "Deploy to sandbox server" - mkdir -p /root/.kube - - echo ${GCP_KUBECONF} | base64 -d > /root/.kube/kubeconfig.yaml - - echo ${GCP_ROBOT_CREDENTIALS} | base64 -d > /root/.kube/robot-k8-sandbox.json - - export GOOGLE_APPLICATION_CREDENTIALS=/root/.kube/tudor-k8-sandbox.json - - export KUBECONFIG=/root/.kube/kubeconfig.yaml + - echo ${SANBOX_KUBECONF} | base64 -d > /root/.kube/config - helm init - helm delete --purge gwas-deposition-backend || true - - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.env.envName=gcp-sandbox,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait + - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait environment: name: sandbox only: - develop -#deploy-backend-sandbox: -# image: dtzar/helm-kubectl:2.13.1 -# stage: deploy-sandbox -# script: -# - echo "Deploy to sandbox server" -# - mkdir -p /root/.kube -# - echo ${SANBOX_KUBECONF} | base64 -d > /root/.kube/config -# - helm init -# - helm delete --purge gwas-deposition-backend || true -# - helm install --name gwas-deposition-backend --set k8Namespace=gwas,image.repository=$BACKEND_REGISTRY_IMAGE,image.tag=$CI_COMMIT_SHA,image.env.secretsName=sandbox-secrets,image.env.secretsKey=db-backend ./k8chart/ --wait -# environment: -# name: sandbox -# only: -# - develop - deploy-fallback: image: dtzar/helm-kubectl:2.13.1 stage: deploy-fallback diff --git a/k8chart/templates/gwas-deposition-backend-deployment.yaml b/k8chart/templates/gwas-deposition-backend-deployment.yaml index 70aac7b..ee5ae50 100644 --- a/k8chart/templates/gwas-deposition-backend-deployment.yaml +++ b/k8chart/templates/gwas-deposition-backend-deployment.yaml @@ -52,9 +52,8 @@ spec: key: {{.Values.image.env.secretsKey}} volumes: - name: log - nfs: - server: 10.100.0.3 - path: "/var/nfs" + persistentVolumeClaim: + claimName: {{ .Values.image.volume.claimName }} --- kind: Service apiVersion: v1 diff --git a/k8chart/values.yaml b/k8chart/values.yaml index c7b5e7f..45f8196 100644 --- a/k8chart/values.yaml +++ b/k8chart/values.yaml @@ -13,8 +13,8 @@ image: env: envName: "sandbox" logFileName: "deposition-service" - xms: "-Xms1024m" - xmx: "-Xmx1024m" + xms: "-Xms4096m" + xmx: "-Xmx4096m" dbUser: "" secretsName: "" secretsKey: "" @@ -49,11 +49,11 @@ k8Namespace: default resources: limits: - cpu: 200m - memory: 1024Mi + cpu: 250m + memory: 5120Mi requests: cpu: 100m - memory: 1024Mi + memory: 4096Mi nodeSelector: {} diff --git a/pom.xml b/pom.xml index 3f5d1a6..684037f 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ uk.ac.ebi.spot.gwasdepo gwasdepo-commons - 1.0.3-SNAPSHOT + 1.0.4-SNAPSHOT uk.ac.ebi.spot.gwasdepo diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java index cb4d36e..c7f8f36 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/repository/StudyRepository.java @@ -6,11 +6,14 @@ import uk.ac.ebi.spot.gwas.deposition.domain.Study; import java.util.List; +import java.util.stream.Stream; public interface StudyRepository extends MongoRepository { Page findBySubmissionId(String submissionId, Pageable page); + Stream readBySubmissionId(String submissionId); + List findByIdIn(List ids); List findByBodyOfWorkListContains(String bowId); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java index f4b46ba..3eb11e8 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/StudiesController.java @@ -10,23 +10,22 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.PagedResources; import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import uk.ac.ebi.spot.gwas.deposition.config.GWASDepositionBackendConfig; import uk.ac.ebi.spot.gwas.deposition.constants.GWASDepositionBackendConstants; import uk.ac.ebi.spot.gwas.deposition.constants.GeneralCommon; +import uk.ac.ebi.spot.gwas.deposition.domain.FileObject; import uk.ac.ebi.spot.gwas.deposition.domain.Study; import uk.ac.ebi.spot.gwas.deposition.domain.Submission; import uk.ac.ebi.spot.gwas.deposition.domain.User; import uk.ac.ebi.spot.gwas.deposition.dto.StudyDto; -import uk.ac.ebi.spot.gwas.deposition.dto.StudyEnvelopeDto; +import uk.ac.ebi.spot.gwas.deposition.exception.FileProcessingException; import uk.ac.ebi.spot.gwas.deposition.rest.dto.StudyDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.rest.dto.StudyEnvelopeDtoAssembler; -import uk.ac.ebi.spot.gwas.deposition.service.JWTService; -import uk.ac.ebi.spot.gwas.deposition.service.StudiesService; -import uk.ac.ebi.spot.gwas.deposition.service.SubmissionService; -import uk.ac.ebi.spot.gwas.deposition.service.UserService; +import uk.ac.ebi.spot.gwas.deposition.service.*; import uk.ac.ebi.spot.gwas.deposition.util.BackendUtil; import uk.ac.ebi.spot.gwas.deposition.util.HeadersUtil; @@ -57,7 +56,7 @@ public class StudiesController { private StudyDtoAssembler studyDtoAssembler; @Autowired - private StudyEnvelopeDtoAssembler studyEnvelopeDtoAssembler; + private TemplatePrefillService templatePrefillService; /** * GET /v1/submissions/{submissionId}/studies @@ -85,6 +84,28 @@ public PagedResources getStudies(@PathVariable String submissionId, Ht /** * GET /v1/submissions/{submissionId}/study-envelopes */ + /* + @GetMapping(value = "/{submissionId}" + GWASDepositionBackendConstants.API_STUDY_ENVELOPES, + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @ResponseStatus(HttpStatus.OK) + public HttpEntity getStudyEnvelopes(@PathVariable String submissionId, HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to retrieve studies for submission: {}", user.getName(), submissionId); + Submission submission = submissionService.getSubmission(submissionId, user); + + FileObject fileObject = templatePrefillService.prefillGCST(submissionId, user); + if (fileObject == null) { + throw new FileProcessingException("Unable to process request."); + } + log.info("Returning content for file [gcst_list.xlsx] for submission: {}", submission.getId()); + + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=gcst_list.xlsx"); + responseHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); + responseHeaders.add(HttpHeaders.CONTENT_LENGTH, Integer.toString(fileObject.getContent().length)); + return new HttpEntity<>(fileObject.getContent(), responseHeaders); + } + @GetMapping(value = "/{submissionId}" + GWASDepositionBackendConstants.API_STUDY_ENVELOPES, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) @@ -102,6 +123,6 @@ public PagedResources getStudyEnvelopes(@PathVariable String s ControllerLinkBuilder.methodOn(StudiesController.class).getStudyEnvelopes(submissionId, null, pageable, assembler)); return assembler.toResource(facetedSearchStudies, studyEnvelopeDtoAssembler, new Link(BackendUtil.underBasePath(lb, gwasDepositionBackendConfig.getProxyPrefix()).toUri().toString())); - } + */ } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java index d0827fd..607d04a 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/controllers/SubmissionsController.java @@ -67,6 +67,9 @@ public class SubmissionsController { @Autowired private BodyOfWorkService bodyOfWorkService; + @Autowired + private TemplatePrefillService templatePrefillService; + @Autowired private AuditProxy auditProxy; @@ -182,6 +185,20 @@ public Resource getSubmission(@PathVariable String submissionId, return submissionAssemblyService.toResource(submission); } + /** + * GET /v1/submissions/{submissionId}/prefill + */ + /* + @GetMapping(value = "/{submissionId}/prefill", + produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public void prefill(@PathVariable String submissionId, HttpServletRequest request) { + User user = userService.findUser(jwtService.extractUser(HeadersUtil.extractJWT(request)), false); + log.info("[{}] Request to prefill submission: {}", user.getName(), submissionId); + templatePrefillService.prefill(submissionId, user); + } + */ + /** * DELETE /v1/submissions/{submissionId} */ diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SSTemplateGCSTStudyDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SSTemplateGCSTStudyDtoAssembler.java new file mode 100644 index 0000000..4e25f9c --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/SSTemplateGCSTStudyDtoAssembler.java @@ -0,0 +1,17 @@ +package uk.ac.ebi.spot.gwas.deposition.rest.dto; + +import uk.ac.ebi.spot.gwas.deposition.domain.Study; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.gcst.SSTemplateGCSTStudyDto; + +public class SSTemplateGCSTStudyDtoAssembler { + + public static SSTemplateGCSTStudyDto assemble(Study study) { + return new SSTemplateGCSTStudyDto(study.getAccession(), + study.getStudyTag(), + study.getTrait(), + study.getEfoTrait(), + study.getBackgroundTrait(), + study.getBackgroundEfoTrait()); + } + +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyDtoAssembler.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyDtoAssembler.java index e7cb66c..e01b44a 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyDtoAssembler.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/rest/dto/StudyDtoAssembler.java @@ -49,6 +49,29 @@ public Resource toResource(Study study) { return resource; } + public static StudyDto assemble(Study study) { + return new StudyDto(study.getStudyTag(), + study.getAccession(), + study.getGenotypingTechnology(), + study.getArrayManufacturer(), + study.getArrayInformation(), + study.getImputation(), + study.getVariantCount(), + study.getSampleDescription(), + study.getStatisticalModel(), + study.getStudyDescription(), + study.getTrait(), + study.getEfoTrait(), + study.getBackgroundTrait(), + study.getBackgroundEfoTrait(), + study.getSummaryStatisticsFile(), + study.getChecksum(), + study.getSummaryStatisticsAssembly(), + study.getReadmeFile(), + study.getCohort(), + study.getCohortId()); + } + public static Study disassemble(StudyDto studyDto) { Study study = new Study(); study.setStudyTag(studyDto.getStudyTag()); diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplatePrefillService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplatePrefillService.java new file mode 100644 index 0000000..5721b14 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplatePrefillService.java @@ -0,0 +1,10 @@ +package uk.ac.ebi.spot.gwas.deposition.service; + +import uk.ac.ebi.spot.gwas.deposition.domain.FileObject; +import uk.ac.ebi.spot.gwas.deposition.domain.User; + +public interface TemplatePrefillService { + void prefill(String submissionId, User user); + + FileObject prefillGCST(String submissionId, User user); +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplateService.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplateService.java index a94cd0b..6e2e98e 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplateService.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/TemplateService.java @@ -2,8 +2,10 @@ import uk.ac.ebi.spot.gwas.deposition.domain.FileObject; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateRequestDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.SSTemplateCuratorRequestDto; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.TemplateSchemaDto; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.TemplateSchemaResponseDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.gcst.SSTemplateGCSTRequestDto; public interface TemplateService { @@ -12,4 +14,8 @@ public interface TemplateService { TemplateSchemaDto retrieveTemplateSchema(String templateVersion, String submissionType); FileObject retrievePrefilledTemplate(SSTemplateRequestDto ssTemplateRequestDto); + + FileObject retrieveCuratorPrefilledTemplate(SSTemplateCuratorRequestDto ssTemplateCuratorRequestDto); + + FileObject retrieveGCSTPrefilledTemplate(SSTemplateGCSTRequestDto ssTemplateGCSTRequestDto); } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplatePrefillServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplatePrefillServiceImpl.java new file mode 100644 index 0000000..8c2d8f2 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplatePrefillServiceImpl.java @@ -0,0 +1,99 @@ +package uk.ac.ebi.spot.gwas.deposition.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadStatus; +import uk.ac.ebi.spot.gwas.deposition.constants.FileUploadType; +import uk.ac.ebi.spot.gwas.deposition.domain.*; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.SSTemplateCuratorRequestDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.SSTemplateCuratorRequestStudyDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.gcst.SSTemplateGCSTRequestDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.gcst.SSTemplateGCSTRequestStudyDto; +import uk.ac.ebi.spot.gwas.deposition.repository.StudyRepository; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.SSTemplateGCSTStudyDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.rest.dto.StudyDtoAssembler; +import uk.ac.ebi.spot.gwas.deposition.service.FileUploadsService; +import uk.ac.ebi.spot.gwas.deposition.service.SubmissionService; +import uk.ac.ebi.spot.gwas.deposition.service.TemplatePrefillService; +import uk.ac.ebi.spot.gwas.deposition.service.TemplateService; +import uk.ac.ebi.spot.gwas.deposition.util.StudyCollector; + +import java.io.ByteArrayInputStream; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Service +public class TemplatePrefillServiceImpl implements TemplatePrefillService { + + private static final Logger log = LoggerFactory.getLogger(SubmissionService.class); + + @Autowired + private SubmissionService submissionService; + + @Autowired(required = false) + private TemplateService templateService; + + @Autowired + private FileUploadsService fileUploadsService; + + @Autowired + private StudyRepository studyRepository; + + @Override + public void prefill(String submissionId, User user) { + log.info("Pre-filling: {}", submissionId); + Submission submission = submissionService.getSubmission(submissionId, user); + + StudyCollector studyCollector = new StudyCollector(); + Stream studyStream = studyRepository.readBySubmissionId(submissionId); + studyStream.forEach(study -> studyCollector.add(study)); + studyStream.close(); + + try { + FileObject fileObject = templateService.retrieveCuratorPrefilledTemplate(new SSTemplateCuratorRequestDto(true, + new SSTemplateCuratorRequestStudyDto(studyCollector.getStudyList().stream() + .map(StudyDtoAssembler::assemble).collect(Collectors.toList())))); + if (fileObject == null) { + log.error("No file object received from the template service!"); + return; + } + + FileUpload fileUpload = fileUploadsService.storeFile(new ByteArrayInputStream(fileObject.getContent()), + fileObject.getFileName(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + fileObject.getContent().length, FileUploadType.METADATA_FILLED.name()); + fileUpload.setStatus(FileUploadStatus.VALID.name()); + fileUploadsService.save(fileUpload); + + submission.addFileUpload(fileUpload.getId()); + submissionService.saveSubmission(submission); + } catch (Exception e) { + log.error("ERROR: {}", e.getMessage(), e); + } + } + + @Override + public FileObject prefillGCST(String submissionId, User user) { + log.info("Pre-filling GCST list: {}", submissionId); + Submission submission = submissionService.getSubmission(submissionId, user); + StudyCollector studyCollector = new StudyCollector(); + Stream studyStream = studyRepository.readBySubmissionId(submission.getId()); + studyStream.forEach(study -> studyCollector.add(study)); + studyStream.close(); + + try { + FileObject fileObject = templateService.retrieveGCSTPrefilledTemplate(new SSTemplateGCSTRequestDto(true, + new SSTemplateGCSTRequestStudyDto(studyCollector.getStudyList().stream() + .map(SSTemplateGCSTStudyDtoAssembler::assemble).collect(Collectors.toList())))); + if (fileObject == null) { + log.error("No file object received from the template service!"); + return null; + } + return fileObject; + } catch (Exception e) { + log.error("ERROR: {}", e.getMessage(), e); + } + return null; + } +} diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplateServiceImpl.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplateServiceImpl.java index fec70cd..b7db3ef 100644 --- a/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplateServiceImpl.java +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/service/impl/TemplateServiceImpl.java @@ -12,8 +12,10 @@ import org.springframework.stereotype.Service; import uk.ac.ebi.spot.gwas.deposition.domain.FileObject; import uk.ac.ebi.spot.gwas.deposition.dto.summarystats.SSTemplateRequestDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.SSTemplateCuratorRequestDto; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.TemplateSchemaDto; import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.TemplateSchemaResponseDto; +import uk.ac.ebi.spot.gwas.deposition.dto.templateschema.gcst.SSTemplateGCSTRequestDto; import uk.ac.ebi.spot.gwas.deposition.service.TemplateService; @Service @@ -100,4 +102,72 @@ public FileObject retrievePrefilledTemplate(SSTemplateRequestDto ssTemplateReque return null; } } + + @Override + public FileObject retrieveCuratorPrefilledTemplate(SSTemplateCuratorRequestDto ssTemplateCuratorRequestDto) { + try { + log.info("[{}] Retrieving pre-filled template for {} studies: {}", + restInteractionConfig.getPrefilledTemplateEndpoint(), + ssTemplateCuratorRequestDto.getPrefillData().getStudy().size(), + new ObjectMapper().writeValueAsString(ssTemplateCuratorRequestDto)); + } catch (Exception e) { + } + String endpoint = restInteractionConfig.getPrefilledTemplateEndpoint(); + + HttpEntity httpEntity = restRequestUtil.httpEntity() + .withJsonBodyNoContentType(ssTemplateCuratorRequestDto) + .build(); + try { + ResponseEntity response = + restTemplate.exchange(endpoint, + HttpMethod.POST, httpEntity, + new ParameterizedTypeReference() { + }); + if (response.getStatusCode().equals(HttpStatus.OK)) { + String fileName = response.getHeaders().getContentDisposition().getFilename(); + byte[] payload = response.getBody(); + log.info("Pre-filled template [{}] successfully retrieved: {}", fileName, payload.length); + return new FileObject(fileName, payload); + } + log.error("Unable to call gwas-template-service: {}", response.getStatusCode()); + return null; + } catch (Exception e) { + log.error("Unable to call gwas-template-service: {}", e.getMessage(), e); + return null; + } + } + + @Override + public FileObject retrieveGCSTPrefilledTemplate(SSTemplateGCSTRequestDto ssTemplateGCSTRequestDto) { + try { + log.info("[{}] Retrieving GCST template for {} studies: {}", + restInteractionConfig.getPrefilledTemplateEndpoint(), + ssTemplateGCSTRequestDto.getPrefillData().getStudy().size(), + new ObjectMapper().writeValueAsString(ssTemplateGCSTRequestDto)); + } catch (Exception e) { + } + String endpoint = restInteractionConfig.getPrefilledTemplateEndpoint(); + + HttpEntity httpEntity = restRequestUtil.httpEntity() + .withJsonBodyNoContentType(ssTemplateGCSTRequestDto) + .build(); + try { + ResponseEntity response = + restTemplate.exchange(endpoint, + HttpMethod.POST, httpEntity, + new ParameterizedTypeReference() { + }); + if (response.getStatusCode().equals(HttpStatus.OK)) { + String fileName = response.getHeaders().getContentDisposition().getFilename(); + byte[] payload = response.getBody(); + log.info("Pre-filled template [{}] successfully retrieved: {}", fileName, payload.length); + return new FileObject(fileName, payload); + } + log.error("Unable to call gwas-template-service: {}", response.getStatusCode()); + return null; + } catch (Exception e) { + log.error("Unable to call gwas-template-service: {}", e.getMessage(), e); + return null; + } + } } diff --git a/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/StudyCollector.java b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/StudyCollector.java new file mode 100644 index 0000000..6acf368 --- /dev/null +++ b/src/main/java/uk/ac/ebi/spot/gwas/deposition/util/StudyCollector.java @@ -0,0 +1,23 @@ +package uk.ac.ebi.spot.gwas.deposition.util; + +import uk.ac.ebi.spot.gwas.deposition.domain.Study; + +import java.util.ArrayList; +import java.util.List; + +public class StudyCollector { + + public List studyList; + + public StudyCollector() { + studyList = new ArrayList<>(); + } + + public void add(Study study) { + this.studyList.add(study); + } + + public List getStudyList() { + return studyList; + } +} diff --git a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java index b2a8b75..b44ec3b 100644 --- a/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java +++ b/src/test/java/uk/ac/ebi/spot/gwas/deposition/rest/StudiesControllerTest.java @@ -5,6 +5,7 @@ import net.minidev.json.JSONArray; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.Resource; @@ -124,6 +125,7 @@ public void shouldGetStudies() throws Exception { * GET /v1/submissions/{submissionId}/study-envelopes */ @Test + @Ignore public void shouldGetStudyEnvelopes() throws Exception { SubmissionCreationDto submissionCreationDto = new SubmissionCreationDto(PublicationDtoAssembler.assemble(eligiblePublication), null,