Skip to content

Commit 45724b9

Browse files
jp-toscasekmillerCopilotstevenwinship
authored
11914 set template default (#11989)
* placeholder * Endpoints work but need polish. * pr notes * Initial test * Changes to show the ID of the created template * Changes to the set default endpoint * Flush entity manager after setting default template in CreateTemplateCommand * Update success messages for removing default dataset template * Implement RemoveDefaultDatasetCommand and update endpoint to use it for removing default template * Add tests for setting and removing default template in DataversesIT * Fix permission description in API documentation and method signatures for setting and removing default templates * #11914 fix merge conflicts * #11914 return default true for test * #11914 fix find template and tests * #11914 update command name for clarity * Update src/main/java/edu/harvard/iq/dataverse/engine/command/impl/SetDefaultTemplateCommand.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RemoveDefaultTemplateCommand.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * #11914 change path * Update native-api.rst * Update native-api.rst * fix docs --------- Co-authored-by: Stephen Kraffmiller <skraffmiller@hmdc.harvard.edu> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
1 parent 2382496 commit 45724b9

File tree

10 files changed

+276
-58
lines changed

10 files changed

+276
-58
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## New Endpoint: POST `/dataverses/{id}/template/default/{templateId}`
2+
3+
A new endpoint has been implemented to set the default template to a given dataverse collection.
4+
5+
### Functionality
6+
- Sets the default template of the given dataverse collection.
7+
- You must have edit dataverse permission in the collection in order to use this endpoint.
8+
9+
## New Endpoint: DELETE `/dataverses/{id}/template/default`
10+
11+
A new endpoint has been implemented to remove the default template to a given dataverse collection.
12+
13+
### Functionality
14+
- Removes the default template of the given dataverse collection.
15+
- You must have edit dataverse permission in the collection in order to use this endpoint.

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,6 +1639,50 @@ The fully expanded example above (without environment variables) looks like this
16391639
16401640
curl -H "X-Dataverse-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST "https://demo.dataverse.org/api/dataverses/1/templates" --upload-file dataverse-template.json
16411641
1642+
Set a Default Template for a Collection
1643+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1644+
1645+
Sets a template as the default template for a collection:
1646+
1647+
.. code-block:: bash
1648+
1649+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
1650+
export SERVER_URL=https://demo.dataverse.org
1651+
export ID=1
1652+
export TEMPLATEID=2
1653+
1654+
curl -H "X-Dataverse-key:$API_TOKEN" -X POST "$SERVER_URL/api/dataverses/$ID/template/default/$TEMPLATEID"
1655+
1656+
The fully expanded example above (without environment variables) looks like this:
1657+
1658+
.. code-block:: bash
1659+
1660+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST "https://demo.dataverse.org/api/dataverses/1/template/default/2"
1661+
1662+
You must have Edit Dataverse permission within the given dataverse collection to invoke this api.
1663+
1664+
Remove a Default Template for a Collection
1665+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1666+
1667+
Remove a template as the default template for a collection(Note: the template is not deleted; it will still be available for use in the collection):
1668+
1669+
.. code-block:: bash
1670+
1671+
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
1672+
export SERVER_URL=https://demo.dataverse.org
1673+
export ID=1
1674+
1675+
1676+
curl -H "X-Dataverse-key:$API_TOKEN" -X DELETE "$SERVER_URL/api/dataverses/$ID/template/default"
1677+
1678+
The fully expanded example above (without environment variables) looks like this:
1679+
1680+
.. code-block:: bash
1681+
1682+
curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X DELETE "https://demo.dataverse.org/api/dataverses/1/template/default"
1683+
1684+
You must have Edit Dataverse permission within the given dataverse collection to invoke this api.
1685+
16421686

16431687
Dataverse Role Assignment History
16441688
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,25 @@ protected Dataverse findDataverseOrDie( String dvIdtf ) throws WrappedResponse {
370370
}
371371
return dv;
372372
}
373+
374+
protected Template findTemplateOrDie(Long templateId, Dataverse dataverse) throws WrappedResponse {
375+
376+
List<Template> templates = new ArrayList<>();
377+
378+
templates.addAll(dataverse.getTemplates());
379+
templates.addAll(dataverse.getParentTemplates());
380+
381+
Template template = templates.stream()
382+
.filter(t -> Objects.equals(t.getId(), templateId))
383+
.findFirst()
384+
.orElse(null);
385+
386+
if (template == null) {
387+
throw new WrappedResponse(
388+
error(Response.Status.NOT_FOUND, "Can't find template with identifier='" + templateId + "'"));
389+
}
390+
return template;
391+
}
373392

374393
protected DataverseLinkingDataverse findDataverseLinkingDataverseOrDie(String dataverseId, String linkedDataverseId) throws WrappedResponse {
375394
DataverseLinkingDataverse dvld;

src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,45 @@ public Response createTemplate(@Context ContainerRequestContext crc, String body
20312031
}
20322032
}
20332033

2034+
@POST
2035+
@AuthRequired
2036+
@Path("{identifier}/template/default/{templateId}")
2037+
public Response setDefaultTemplate(@Context ContainerRequestContext crc,
2038+
@PathParam("identifier") String dvId,
2039+
@PathParam("templateId") Long templateId) {
2040+
2041+
try {
2042+
2043+
Dataverse dataverse = findDataverseOrDie(dvId);
2044+
Template template = findTemplateOrDie(templateId, dataverse);
2045+
DataverseRequest dvReq = createDataverseRequest(getRequestUser(crc));
2046+
SetDefaultTemplateCommand command = new SetDefaultTemplateCommand(template, dvReq, dataverse);
2047+
2048+
execCommand(command);
2049+
2050+
return ok(BundleUtil.getStringFromBundle("dataverse.setDefaultTemplate.success"));
2051+
2052+
} catch (WrappedResponse e) {
2053+
return e.getResponse();
2054+
}
2055+
}
2056+
2057+
@DELETE
2058+
@AuthRequired
2059+
@Path("{identifier}/template/default")
2060+
public Response removeDefaultTemplate(@Context ContainerRequestContext crc,
2061+
@PathParam("identifier") String dvId) {
2062+
try {
2063+
Dataverse dataverse = findDataverseOrDie(dvId);
2064+
RemoveDefaultTemplateCommand command = new RemoveDefaultTemplateCommand(createDataverseRequest(getRequestUser(crc)), dataverse);
2065+
execCommand(command);
2066+
return ok(BundleUtil.getStringFromBundle("dataverse.removeDefaultTemplate.success"));
2067+
} catch (WrappedResponse e) {
2068+
return e.getResponse();
2069+
}
2070+
}
2071+
2072+
20342073
@GET
20352074
@AuthRequired
20362075
@Path("{identifier}/allowedMetadataLanguages")

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public Template execute(CommandContext ctxt) throws CommandException {
5353
if (initialize && createdTemplate.isIsDefaultForDataverse()) {
5454
dataverse.setDefaultTemplate(createdTemplate);
5555
ctxt.em().merge(dataverse);
56+
ctxt.em().flush();
5657
}
5758

5859
//Flush so that api response can include the id
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package edu.harvard.iq.dataverse.engine.command.impl;
2+
3+
import edu.harvard.iq.dataverse.*;
4+
import edu.harvard.iq.dataverse.authorization.Permission;
5+
6+
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
7+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
8+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
9+
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
10+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
11+
12+
/**
13+
* @author J.P. Tosca
14+
* Removes the default template {@link Template} for a {@link Dataverse}.
15+
*/
16+
@RequiredPermissions(Permission.EditDataverse)
17+
public class RemoveDefaultTemplateCommand extends AbstractCommand<Dataverse>{
18+
19+
private final Dataverse dataverse;
20+
21+
public RemoveDefaultTemplateCommand(DataverseRequest request, Dataverse dataverse) {
22+
super(request, dataverse);
23+
this.dataverse = dataverse;
24+
}
25+
26+
@Override
27+
public Dataverse execute(CommandContext ctxt) throws CommandException {
28+
dataverse.setDefaultTemplate(null);
29+
Dataverse mergedDataverse = ctxt.em().merge(dataverse);
30+
return mergedDataverse;
31+
}
32+
33+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package edu.harvard.iq.dataverse.engine.command.impl;
2+
3+
import edu.harvard.iq.dataverse.*;
4+
import edu.harvard.iq.dataverse.authorization.Permission;
5+
6+
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
7+
import edu.harvard.iq.dataverse.engine.command.CommandContext;
8+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
9+
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
10+
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
11+
import edu.harvard.iq.dataverse.Template;
12+
13+
/**
14+
* @author J.P. Tosca
15+
* Sets a default template {@link Template} for a {@link Dataverse}.
16+
*/
17+
@RequiredPermissions(Permission.EditDataverse)
18+
public class SetDefaultTemplateCommand extends AbstractCommand<Template> {
19+
20+
private final Template template;
21+
private final Dataverse dataverse;
22+
23+
public SetDefaultTemplateCommand(Template template, DataverseRequest request, Dataverse dataverse) {
24+
super(request, dataverse);
25+
this.template = template;
26+
this.dataverse = dataverse;
27+
}
28+
29+
@Override
30+
public Template execute(CommandContext ctxt) throws CommandException {
31+
dataverse.setDefaultTemplate(template);
32+
ctxt.em().merge(dataverse);
33+
return template;
34+
}
35+
36+
}

src/main/java/propertyFiles/Bundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,8 @@ dataverse.update.featuredItems.error.invalidType=Unknown 'type' must be one of {
10421042
dataverse.update.featuredItems.error.typeAndDvObjectMismatch=The 'type' passed does not match the dvObject type.
10431043
dataverse.delete.featuredItems.success=All featured items of this Dataverse have been successfully deleted.
10441044
dataverse.createTemplate.error.jsonParseMetadataFields=Error parsing the POSTed template dataset fields: {0}
1045+
dataverse.setDefaultTemplate.success=The default dataset template has been successfully set for this dataverse.
1046+
dataverse.removeDefaultTemplate.success=The default dataset template has been successfully removed from this dataverse.
10451047
# rolesAndPermissionsFragment.xhtml
10461048

10471049
# advanced.xhtml

0 commit comments

Comments
 (0)