From 42010ef8da624e8e53029513d3e873029a39b385 Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Tue, 10 Mar 2026 14:44:00 -0700 Subject: [PATCH 1/2] CADC-14486 update metadata multipart upload name --- citation/src/main/webapp/js/citation_request.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/citation/src/main/webapp/js/citation_request.js b/citation/src/main/webapp/js/citation_request.js index 88d52f09..0d88da9c 100644 --- a/citation/src/main/webapp/js/citation_request.js +++ b/citation/src/main/webapp/js/citation_request.js @@ -485,7 +485,7 @@ // 'Blob' type is requred to have the 'filename="blob" parameter added // to the multipart section, and have the Content-type header added - multiPartData.append('doiMeta', new Blob([JSON.stringify(doiDoc.getDoc())], { + multiPartData.append('doiMetaData', new Blob([JSON.stringify(doiDoc.getDoc())], { type: 'application/json' })) From f4220715dacd2b932a8a9e1cd3c1e9d6b52f533e Mon Sep 17 00:00:00 2001 From: Jeff Burke Date: Tue, 10 Mar 2026 14:45:44 -0700 Subject: [PATCH 2/2] CADC-14486 do not allow minting when status = 'review ready' or 'rejected' --- .../java/ca/nrc/cadc/doi/AltStatusTest.java | 8 ++++++++ .../java/ca/nrc/cadc/doi/LifecycleTest.java | 17 ++++++++++++++++- .../main/java/ca/nrc/cadc/doi/PostAction.java | 15 ++++++++------- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/doi/src/intTest/java/ca/nrc/cadc/doi/AltStatusTest.java b/doi/src/intTest/java/ca/nrc/cadc/doi/AltStatusTest.java index 5ba31fc7..15b13e04 100644 --- a/doi/src/intTest/java/ca/nrc/cadc/doi/AltStatusTest.java +++ b/doi/src/intTest/java/ca/nrc/cadc/doi/AltStatusTest.java @@ -158,6 +158,10 @@ public void testUpdateStatus() { Subject.doAs(publisherSubject, (PrivilegedExceptionAction) () -> { + // reviewer tries to publish when 'in review', should fail + log.debug("publisher - update status to 'minted'"); + publishFailure(doiSuffix, DOISettingsType.ALT_DOI); + // reviewer updates status to 'in review' log.debug("publisher - update status to 'in review'"); updateStatus(doiSuffix, Status.IN_REVIEW, true); @@ -226,6 +230,10 @@ public void testUpdateStatus() { checkPermissions(doiNode, false, false, 2,0); log.debug("publisher - checked permissions"); + // reviewer tries to publish when 'rejected', should fail + log.debug("publisher - update status to 'minted'"); + publishFailure(doiSuffix, DOISettingsType.ALT_DOI); + return null; }); diff --git a/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java b/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java index dda206f3..60e1c624 100644 --- a/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java +++ b/doi/src/intTest/java/ca/nrc/cadc/doi/LifecycleTest.java @@ -304,6 +304,21 @@ void update(Resource expected, String doiSuffix, URL doiServiceURL) throws Excep compareResource(expected, actual, true); } + void publishFailure(String doiSuffix,DOISettingsType doiSettingsType) throws Exception { + URL mintURL = new URL(String.format("%s/%s/%s", getDoiServiceURL(doiSettingsType), doiSuffix, DoiAction.MINT_ACTION)); + Map params = new HashMap<>(); + + boolean failure = false; + try { + HttpPost post = new HttpPost(mintURL, params, false); + post.prepare(); + } catch (Exception e) { + // expected + failure = true; + } + Assert.assertTrue("Expected exception for publish from invalid state", failure); + } + void publish(Resource expected, String doiSuffix, DOISettingsType doiSettingsType) throws Exception { // For DOI tests below URL doiURL = new URL(String.format("%s/%s", getDoiServiceURL(doiSettingsType), doiSuffix)); @@ -336,7 +351,7 @@ void publish(Resource expected, String doiSuffix, DOISettingsType doiSettingsTyp DataNode testFile2Node = createDataNode(testFile2Path, testFile2, doiSettingsType); } - // mint the document, DRAFT or IN REVIEW ==> LOCKING_DATA + // mint the document, DRAFT, IN REVIEW, APPROVED ==> LOCKING_DATA doMintTest(doiURL); doiNode = getContainerNode(doiSuffix , doiParentPathURI, vosClient); dataNode = getContainerNode(doiSuffix + "/data" , doiParentPathURI, vosClient); diff --git a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java index cab1ff11..16253026 100644 --- a/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java +++ b/doi/src/main/java/ca/nrc/cadc/doi/PostAction.java @@ -717,16 +717,13 @@ private void performDOIAction() throws Exception { // process DOI based on current minting status ContainerNode doiContainerNode = vospaceDoiClient.getContainerNode(doiSuffix); Status mintingStatus = Status.toValue(doiContainerNode.getPropertyValue(DOI.VOSPACE_DOI_STATUS_PROPERTY)); + switch (mintingStatus) { case DRAFT: - if (isAlternativeConfiguration()) { - throw new IllegalArgumentException("Cannot publish an 'in progress' DOI for an alternative configuration"); + if (!isAlternativeConfiguration()) { + lockData(doiContainerNode); } - lockData(doiContainerNode); break; - case REVIEW_READY: - case REJECTED: - throw new IllegalArgumentException("Cannot publish a DOI with status '" + mintingStatus + "'"); case IN_REVIEW: case APPROVED: case ERROR_LOCKING_DATA: @@ -753,7 +750,7 @@ private void performDOIAction() throws Exception { log.debug("doi " + doiSuffix + " status: " + Status.COMPLETED); break; default: - // do nothing + throw new IllegalArgumentException("Cannot publish a DOI with status '" + mintingStatus + "'"); } // Done, send redirect to GET for the XML file just minted @@ -807,6 +804,8 @@ private void lockData(ContainerNode doiContainerNode) throws Exception { doiContainerNode.getProperties().add(jobURLProp); vospaceDoiClient.getVOSpaceClient().setNode(containerVOSURI, doiContainerNode); } catch (Exception ex) { + log.error("error locking data folder for " + doiSuffix, ex); + // update status doiContainerNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY).setValue(Status.ERROR_LOCKING_DATA.getValue()); String jobURLString = doiContainerNode.getPropertyValue(DOI.VOSPACE_DOI_JOB_URL_PROPERTY); @@ -868,6 +867,8 @@ private void register(ContainerNode doiContainerNode) throws Exception { vospaceDoiClient.getVOSpaceClient().setNode(doiURI, doiContainerNode); } catch (Exception ex) { + log.error("error registering DOI " + doiSuffix, ex); + // update status to flag error state, and original properties of // container node and xml file