From 7ebb1006928b0bdf8dab9af3a20862c4e9b9059f Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Wed, 5 Nov 2025 20:27:36 -0500 Subject: [PATCH 01/11] placeholder --- .../iq/dataverse/ManageTemplatesPage.java | 2 ++ .../harvard/iq/dataverse/api/Dataverses.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java index fa2e9fb55b8..4ee88d559dc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java @@ -108,11 +108,13 @@ public String init() { } public void makeDefault(Template templateIn) { + System.out.println("making default template: " + templateIn.getName()); dataverse.setDefaultTemplate(templateIn); saveDataverse(BundleUtil.getStringFromBundle("template.makeDefault")); } public void unselectDefault(Template templateIn) { + System.out.println("unselecting default template: " + templateIn.getName()); dataverse.setDefaultTemplate(null); saveDataverse(BundleUtil.getStringFromBundle("template.unselectDefault")); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index a5a336e1c9f..c97ad94865a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -2001,6 +2001,24 @@ public Response createTemplate(@Context ContainerRequestContext crc, String body return e.getResponse(); } } + + @POST + @AuthRequired + @Path("{identifier}/templates/default/{templateId}") + public Response setDefaultTemplate(@Context ContainerRequestContext crc, String body, @PathParam("identifier") String dvIdtf) { + System.out.println("Dataverse API: setting default template for dataverse " + dvIdtf); + return ok(BundleUtil.getStringFromBundle("dataverse.setDefaultTemplate.success")); + } + + @DELETE + @AuthRequired + @Path("{identifier}/templates/default/{templateId}") + public Response removeDefaultTemplate(@Context ContainerRequestContext crc, String body, @PathParam("identifier") String dvIdtf) { + System.out.println("Dataverse API: removing default template for dataverse " + dvIdtf); + return ok(BundleUtil.getStringFromBundle("dataverse.removeDefaultTemplate.success")); + } + + @GET @AuthRequired From 4c9044a1ac7eea443bea90635233b49ac0ec17c7 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Mon, 10 Nov 2025 16:52:52 -0500 Subject: [PATCH 02/11] Endpoints work but need polish. --- .../iq/dataverse/ManageTemplatesPage.java | 2 - .../harvard/iq/dataverse/api/Dataverses.java | 40 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java index 4ee88d559dc..fa2e9fb55b8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ManageTemplatesPage.java @@ -108,13 +108,11 @@ public String init() { } public void makeDefault(Template templateIn) { - System.out.println("making default template: " + templateIn.getName()); dataverse.setDefaultTemplate(templateIn); saveDataverse(BundleUtil.getStringFromBundle("template.makeDefault")); } public void unselectDefault(Template templateIn) { - System.out.println("unselecting default template: " + templateIn.getName()); dataverse.setDefaultTemplate(null); saveDataverse(BundleUtil.getStringFromBundle("template.unselectDefault")); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index c97ad94865a..4642d39bf9c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -2005,17 +2005,43 @@ public Response createTemplate(@Context ContainerRequestContext crc, String body @POST @AuthRequired @Path("{identifier}/templates/default/{templateId}") - public Response setDefaultTemplate(@Context ContainerRequestContext crc, String body, @PathParam("identifier") String dvIdtf) { - System.out.println("Dataverse API: setting default template for dataverse " + dvIdtf); - return ok(BundleUtil.getStringFromBundle("dataverse.setDefaultTemplate.success")); + public Response setDefaultTemplate(@Context ContainerRequestContext crc, String body, + @PathParam("identifier") String dvId, + @PathParam("templateId") Long templateId) { + + try { + System.out.println( + "Dataverse API: setting default template for dataverse " + dvId + " to template " + templateId); + Dataverse dataverse = findDataverseOrDie(dvId); + + Template templateToSet = dataverse.getTemplates().stream() + .filter(t -> Objects.equals(t.getId(), templateId)) + .findFirst() + .orElse(null); + if (templateToSet == null) { + return error(Status.NOT_FOUND, "Template with id " + templateId + " not found for dataverse " + dvId); + } + dataverse.setDefaultTemplate(templateToSet); + return ok(jsonTemplates(execCommand( + new ListDataverseTemplatesCommand(createDataverseRequest(getRequestUser(crc)), dataverse)))); + } catch (WrappedResponse e) { + return e.getResponse(); + } } @DELETE @AuthRequired - @Path("{identifier}/templates/default/{templateId}") - public Response removeDefaultTemplate(@Context ContainerRequestContext crc, String body, @PathParam("identifier") String dvIdtf) { - System.out.println("Dataverse API: removing default template for dataverse " + dvIdtf); - return ok(BundleUtil.getStringFromBundle("dataverse.removeDefaultTemplate.success")); + @Path("{identifier}/templates/default") + public Response removeDefaultTemplate(@Context ContainerRequestContext crc, String body, + @PathParam("identifier") String dvId) { + try { + Dataverse dataverse = findDataverseOrDie(dvId); + dataverse.setDefaultTemplate(null); + return ok(jsonTemplates(execCommand( + new ListDataverseTemplatesCommand(createDataverseRequest(getRequestUser(crc)), dataverse)))); + } catch (WrappedResponse e) { + return e.getResponse(); + } } From 097e972f07f191980f3413460f0e244c491e1ec1 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Wed, 12 Nov 2025 13:15:32 -0500 Subject: [PATCH 03/11] pr notes --- .../11914-set-template-default-api.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 doc/release-notes/11914-set-template-default-api.md diff --git a/doc/release-notes/11914-set-template-default-api.md b/doc/release-notes/11914-set-template-default-api.md new file mode 100644 index 00000000000..58786823405 --- /dev/null +++ b/doc/release-notes/11914-set-template-default-api.md @@ -0,0 +1,15 @@ +## New Endpoint: POST `/dataverses/{id}/template/default/{templateId}` + +A new endpoint has been implemented to set the default template to a given dataverse collection. + +### Functionality +- Sets the default template of the given dataverse collection. +- You must have add dataset permission in the collection in order to use this endpoint. + +## New Endpoint: DELETE `/dataverses/{id}/template/default` + +A new endpoint has been implemented to remove the default template to a given dataverse collection. + +### Functionality +- Removes the default template of the given dataverse collection. +- You must have add dataset permission in the collection in order to use this endpoint. From d5aab8362ea7b0e21fda58ff240c653e907afb7a Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Tue, 18 Nov 2025 12:24:14 -0500 Subject: [PATCH 04/11] Initial test --- .../iq/dataverse/api/DataversesIT.java | 256 +++++++++--------- .../edu/harvard/iq/dataverse/api/UtilIT.java | 16 ++ 2 files changed, 150 insertions(+), 122 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 307af623120..b1840d16723 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -2594,128 +2594,140 @@ public void testUpdateInputLevelDisplayOnCreateOverride() { } @Test - public void testCreateAndGetTemplates() throws JsonParseException { - Response createUserResponse = UtilIT.createRandomUser(); - String apiToken = UtilIT.getApiTokenFromResponse(createUserResponse); - String username = UtilIT.getUsernameFromResponse(createUserResponse); - - Response createSecondUserResponse = UtilIT.createRandomUser(); - String secondApiToken = UtilIT.getApiTokenFromResponse(createSecondUserResponse); - String secondUsername = UtilIT.getUsernameFromResponse(createSecondUserResponse); - - - /* - We need to make this a non-inherited metadatablocks so the get template will only get templates from current dv - */ - - Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); - createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode()); - String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); - - String newName = "New Test Dataverse Name"; - String newAffiliation = "New Test Dataverse Affiliation"; - String newDataverseType = Dataverse.DataverseType.TEACHING_COURSES.toString(); - String[] newContactEmails = new String[]{"new_email@dataverse.com"}; - String[] newInputLevelNames = new String[]{"geographicCoverage"}; - String[] newFacetIds = new String[]{"contributorName"}; - String[] newMetadataBlockNames = new String[]{"citation", "geospatial", "biomedical"}; - - //Giving the new Dataverse updated metadatablocks so that it will not inherit templates - Response updateDataverseResponse = UtilIT.updateDataverse( - dataverseAlias, dataverseAlias, newName, newAffiliation, newDataverseType, newContactEmails, newInputLevelNames, - null, newMetadataBlockNames, apiToken, - Boolean.FALSE, Boolean.FALSE, null - ); - - updateDataverseResponse.then().assertThat() - .statusCode(OK.getStatusCode()); - - // Create a template - - String jsonString = """ - { - "name": "Dataverse template", - "isDefault": true, - "fields": [ - { - "typeName": "author", - "value": [ - { - "authorName": { - "typeName": "authorName", - "value": "Belicheck, Bill" - }, - "authorAffiliation": { - "typeName": "authorIdentifierScheme", - "value": "ORCID" - } - } - ] - } - ], - "instructions": [ - { - "instructionField": "author", - "instructionText": "The author data" - } - ] - } - """; - - Response createTemplateResponse = UtilIT.createTemplate( - dataverseAlias, - jsonString, - apiToken - ); - - createTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) - .body("data.name", equalTo("Dataverse template")) - .body("data.isDefault", equalTo(true)) - .body("data.usageCount", equalTo(0)) - .body("data.termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) - .body("data.datasetFields.citation.fields.size()", equalTo(1)) - .body("data.instructions.size()", equalTo(1)) - .body("data.instructions[0].instructionField", equalTo("author")) - .body("data.instructions[0].instructionText", equalTo("The author data")) - .body("data.dataverseAlias", equalTo(dataverseAlias)); - - // Template creation should fail if the user lacks dataverse edit permissions - - createTemplateResponse = UtilIT.createTemplate( - dataverseAlias, - jsonString, - secondApiToken - ); - createTemplateResponse.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); - - // Get templates - - Response getTemplateResponse = UtilIT.getTemplates(dataverseAlias, apiToken); - getTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) - .body("data.size()", equalTo(1)) - .body("data[0].name", equalTo("Dataverse template")) - .body("data[0].isDefault", equalTo(true)) - .body("data[0].usageCount", equalTo(0)) - .body("data[0].termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) - .body("data[0].datasetFields.citation.fields.size()", equalTo(1)) - .body("data[0].instructions.size()", equalTo(1)) - .body("data[0].instructions[0].instructionField", equalTo("author")) - .body("data[0].instructions[0].instructionText", equalTo("The author data")) - .body("data[0].dataverseAlias", equalTo(dataverseAlias)); - - // Templates retrieval should fail if a secondary user lacks dataset creation permissions - - getTemplateResponse = UtilIT.getTemplates(dataverseAlias, secondApiToken); - getTemplateResponse.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); - - // Templates retrieval should succeed if the secondary user has dataset creation permissions - - UtilIT.setSuperuserStatus(username, true); - Response grantRoleResponse = UtilIT.grantRoleOnDataverse(dataverseAlias, DataverseRole.DS_CONTRIBUTOR, "@" + secondUsername, apiToken); - grantRoleResponse.then().assertThat().statusCode(OK.getStatusCode()); - - getTemplateResponse = UtilIT.getTemplates(dataverseAlias, secondApiToken); - getTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()); + public void testCreateAndGetTemplates() throws JsonParseException { + Response createUserResponse = UtilIT.createRandomUser(); + String apiToken = UtilIT.getApiTokenFromResponse(createUserResponse); + String username = UtilIT.getUsernameFromResponse(createUserResponse); + + Response createSecondUserResponse = UtilIT.createRandomUser(); + String secondApiToken = UtilIT.getApiTokenFromResponse(createSecondUserResponse); + String secondUsername = UtilIT.getUsernameFromResponse(createSecondUserResponse); + + /* + * We need to make this a non-inherited metadatablocks so the get template will + * only get templates from current dv + */ + + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + + String newName = "New Test Dataverse Name"; + String newAffiliation = "New Test Dataverse Affiliation"; + String newDataverseType = Dataverse.DataverseType.TEACHING_COURSES.toString(); + String[] newContactEmails = new String[] { "new_email@dataverse.com" }; + String[] newInputLevelNames = new String[] { "geographicCoverage" }; + String[] newFacetIds = new String[] { "contributorName" }; + String[] newMetadataBlockNames = new String[] { "citation", "geospatial", "biomedical" }; + + // Giving the new Dataverse updated metadatablocks so that it will not inherit + // templates + Response updateDataverseResponse = UtilIT.updateDataverse( + dataverseAlias, dataverseAlias, newName, newAffiliation, newDataverseType, newContactEmails, + newInputLevelNames, + null, newMetadataBlockNames, apiToken, + Boolean.FALSE, Boolean.FALSE, null); + + updateDataverseResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + + // Create a template + + String jsonString = """ + { + "name": "Dataverse template", + "isDefault": false, + "fields": [ + { + "typeName": "author", + "value": [ + { + "authorName": { + "typeName": "authorName", + "value": "Belicheck, Bill" + }, + "authorAffiliation": { + "typeName": "authorIdentifierScheme", + "value": "ORCID" + } + } + ] + } + ], + "instructions": [ + { + "instructionField": "author", + "instructionText": "The author data" + } + ] + } + """; + + Response createTemplateResponse = UtilIT.createTemplate( + dataverseAlias, + jsonString, + apiToken); + + createTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) + .body("data.name", equalTo("Dataverse template")) + .body("data.isDefault", equalTo(false)) + .body("data.usageCount", equalTo(0)) + .body("data.termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) + .body("data.datasetFields.citation.fields.size()", equalTo(1)) + .body("data.instructions.size()", equalTo(1)) + .body("data.instructions[0].instructionField", equalTo("author")) + .body("data.instructions[0].instructionText", equalTo("The author data")) + .body("data.dataverseAlias", equalTo(dataverseAlias)); + + Long templateId = createTemplateResponse.then().extract().path("data.id"); + + + + Response setDefaultResp = UtilIT.setDefaultTemplate(dataverseAlias, templateId, secondApiToken); + setDefaultResp.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); + + setDefaultResp = UtilIT.setDefaultTemplate(dataverseAlias, templateId, apiToken); + setDefaultResp.then().assertThat().statusCode(OK.getStatusCode()); + + // Template creation should fail if the user lacks dataverse edit permissions + + createTemplateResponse = UtilIT.createTemplate( + dataverseAlias, + jsonString, + secondApiToken); + createTemplateResponse.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); + + // Get templates + + Response getTemplateResponse = UtilIT.getTemplates(dataverseAlias, apiToken); + getTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) + .body("data.size()", equalTo(1)) + .body("data[0].name", equalTo("Dataverse template")) + .body("data[0].isDefault", equalTo(true)) + .body("data[0].usageCount", equalTo(0)) + .body("data[0].termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) + .body("data[0].datasetFields.citation.fields.size()", equalTo(1)) + .body("data[0].instructions.size()", equalTo(1)) + .body("data[0].instructions[0].instructionField", equalTo("author")) + .body("data[0].instructions[0].instructionText", equalTo("The author data")) + .body("data[0].dataverseAlias", equalTo(dataverseAlias)); + + // Templates retrieval should fail if a secondary user lacks dataset creation + // permissions + + getTemplateResponse = UtilIT.getTemplates(dataverseAlias, secondApiToken); + getTemplateResponse.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); + + // Templates retrieval should succeed if the secondary user has dataset creation + // permissions + + UtilIT.setSuperuserStatus(username, true); + Response grantRoleResponse = UtilIT.grantRoleOnDataverse(dataverseAlias, DataverseRole.DS_CONTRIBUTOR, + "@" + secondUsername, apiToken); + grantRoleResponse.then().assertThat().statusCode(OK.getStatusCode()); + + getTemplateResponse = UtilIT.getTemplates(dataverseAlias, secondApiToken); + getTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 5a07769b313..f4f955fb52a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -5054,6 +5054,22 @@ public static Response getTemplates(String dataverseAlias, String apiToken) { .header(API_TOKEN_HTTP_HEADER, apiToken) .get("/api/dataverses/" + dataverseAlias + "/templates"); } + + public static Response setDefaultTemplate(String dataverseAlias, Long templateId, String apiToken) { + return given() + .contentType(ContentType.JSON) + .header(API_TOKEN_HTTP_HEADER, apiToken) + .post("/api/dataverses/" + dataverseAlias + "/templates/default/" + templateId); + } + + public static Response removeDefaultTemplate(String dataverseAlias, String apiToken) { + return given() + .contentType(ContentType.JSON) + .header(API_TOKEN_HTTP_HEADER, apiToken) + .delete("/api/dataverses/" + dataverseAlias + "/templates/default"); + } + + /** * Gets the tool URL for a dataset with optional parameters From 31a2078fe3c9721ef6c6ed8fa3fd151cf65a72cc Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Thu, 20 Nov 2025 12:27:41 -0500 Subject: [PATCH 05/11] Changes to show the ID of the created template --- .../engine/command/impl/CreateTemplateCommand.java | 5 +++-- .../java/edu/harvard/iq/dataverse/api/DataversesIT.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java index fb5e3534f0e..6faa8ff1fe8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java @@ -54,8 +54,9 @@ public Template execute(CommandContext ctxt) throws CommandException { dataverse.setDefaultTemplate(createdTemplate); ctxt.em().merge(dataverse); } - - return template; + + ctxt.em().flush(); + return createdTemplate; } private static void updateTermsOfUseAndAccess(CommandContext ctxt, Template template) { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index b1840d16723..36d7eaca1a9 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -2668,6 +2668,8 @@ public void testCreateAndGetTemplates() throws JsonParseException { jsonString, apiToken); + + createTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) .body("data.name", equalTo("Dataverse template")) .body("data.isDefault", equalTo(false)) @@ -2679,9 +2681,7 @@ public void testCreateAndGetTemplates() throws JsonParseException { .body("data.instructions[0].instructionText", equalTo("The author data")) .body("data.dataverseAlias", equalTo(dataverseAlias)); - Long templateId = createTemplateResponse.then().extract().path("data.id"); - - + Long templateId = createTemplateResponse.body().jsonPath().getLong("data.id"); Response setDefaultResp = UtilIT.setDefaultTemplate(dataverseAlias, templateId, secondApiToken); setDefaultResp.then().assertThat().statusCode(UNAUTHORIZED.getStatusCode()); From 76ff3e003f085f37d8928f8e2b3200bd6b0ea506 Mon Sep 17 00:00:00 2001 From: Juan Pablo Tosca Villanueva Date: Thu, 20 Nov 2025 15:25:08 -0500 Subject: [PATCH 06/11] Changes to the set default endpoint --- .../iq/dataverse/api/AbstractApiBean.java | 14 ++++++++ .../harvard/iq/dataverse/api/Dataverses.java | 20 +++++------ .../impl/SetDefaultTemplateCommand.java | 35 +++++++++++++++++++ src/main/java/propertyFiles/Bundle.properties | 2 ++ .../iq/dataverse/api/DataversesIT.java | 3 -- 5 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDefaultTemplateCommand.java diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 4cb3466ab4c..66d8091b7df 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -370,6 +370,20 @@ protected Dataverse findDataverseOrDie( String dvIdtf ) throws WrappedResponse { } return dv; } + + protected Template findTemplateOrDie(Long templateId, Dataverse dataverse) throws WrappedResponse { + + Template template = dataverse.getTemplates().stream() + .filter(t -> Objects.equals(t.getId(), templateId)) + .findFirst() + .orElse(null); + + if (template == null) { + throw new WrappedResponse( + error(Response.Status.NOT_FOUND, "Can't find template with identifier='" + templateId + "'")); + } + return template; + } protected DataverseLinkingDataverse findDataverseLinkingDataverseOrDie(String dataverseId, String linkedDataverseId) throws WrappedResponse { DataverseLinkingDataverse dvld; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index 4642d39bf9c..7f2092c07b7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -2010,20 +2010,16 @@ public Response setDefaultTemplate(@Context ContainerRequestContext crc, String @PathParam("templateId") Long templateId) { try { - System.out.println( - "Dataverse API: setting default template for dataverse " + dvId + " to template " + templateId); + Dataverse dataverse = findDataverseOrDie(dvId); + Template template = findTemplateOrDie(templateId, dataverse); + DataverseRequest dvReq = createDataverseRequest(getRequestUser(crc)); + SetDefaultTemplateCommand command = new SetDefaultTemplateCommand(template, dvReq, dataverse); + + execCommand(command); - Template templateToSet = dataverse.getTemplates().stream() - .filter(t -> Objects.equals(t.getId(), templateId)) - .findFirst() - .orElse(null); - if (templateToSet == null) { - return error(Status.NOT_FOUND, "Template with id " + templateId + " not found for dataverse " + dvId); - } - dataverse.setDefaultTemplate(templateToSet); - return ok(jsonTemplates(execCommand( - new ListDataverseTemplatesCommand(createDataverseRequest(getRequestUser(crc)), dataverse)))); + return ok(BundleUtil.getStringFromBundle("dataverse.setDefaultTemplate.success")); + } catch (WrappedResponse e) { return e.getResponse(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDefaultTemplateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDefaultTemplateCommand.java new file mode 100644 index 00000000000..01b50a33332 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDefaultTemplateCommand.java @@ -0,0 +1,35 @@ +package edu.harvard.iq.dataverse.engine.command.impl; + +import edu.harvard.iq.dataverse.*; +import edu.harvard.iq.dataverse.authorization.Permission; + +import edu.harvard.iq.dataverse.engine.command.AbstractCommand; +import edu.harvard.iq.dataverse.engine.command.CommandContext; +import edu.harvard.iq.dataverse.engine.command.DataverseRequest; +import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; +import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import edu.harvard.iq.dataverse.Template; + +/** + * @author J.P. Tosca + * Sets a default template {@link Template} for a {@link Dataverse}. + */ +@RequiredPermissions(Permission.EditDataverse) +public class SetDefaultTemplateCommand extends AbstractCommand