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..d9cad2edb71 --- /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 edit dataverse 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 edit dataverse permission in the collection in order to use this endpoint. 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 29bac86e658..353ed62fb86 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -2002,6 +2002,45 @@ public Response createTemplate(@Context ContainerRequestContext crc, String body } } + @POST + @AuthRequired + @Path("{identifier}/templates/default/{templateId}") + public Response setDefaultTemplate(@Context ContainerRequestContext crc, + @PathParam("identifier") String dvId, + @PathParam("templateId") Long templateId) { + + try { + + Dataverse dataverse = findDataverseOrDie(dvId); + Template template = findTemplateOrDie(templateId, dataverse); + DataverseRequest dvReq = createDataverseRequest(getRequestUser(crc)); + SetDefaultTemplateCommand command = new SetDefaultTemplateCommand(template, dvReq, dataverse); + + execCommand(command); + + return ok(BundleUtil.getStringFromBundle("dataverse.setDefaultTemplate.success")); + + } catch (WrappedResponse e) { + return e.getResponse(); + } + } + + @DELETE + @AuthRequired + @Path("{identifier}/templates/default") + public Response removeDefaultTemplate(@Context ContainerRequestContext crc, + @PathParam("identifier") String dvId) { + try { + Dataverse dataverse = findDataverseOrDie(dvId); + RemoveDefaultDatasetCommand command = new RemoveDefaultDatasetCommand(createDataverseRequest(getRequestUser(crc)), dataverse); + execCommand(command); + return ok(BundleUtil.getStringFromBundle("dataverse.removeDefaultTemplate.success")); + } catch (WrappedResponse e) { + return e.getResponse(); + } + } + + @GET @AuthRequired @Path("{identifier}/allowedMetadataLanguages") 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..89f742f1c4a 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 @@ -53,9 +53,10 @@ public Template execute(CommandContext ctxt) throws CommandException { if (initialize && template.isIsDefaultForDataverse()) { dataverse.setDefaultTemplate(createdTemplate); ctxt.em().merge(dataverse); + ctxt.em().flush(); } - - return template; + + return createdTemplate; } private static void updateTermsOfUseAndAccess(CommandContext ctxt, Template template) { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RemoveDefaultDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RemoveDefaultDatasetCommand.java new file mode 100644 index 00000000000..5baeece8e98 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/RemoveDefaultDatasetCommand.java @@ -0,0 +1,32 @@ +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; + +/** + * @author J.P. Tosca + * Removes the default template {@link Template} for a {@link Dataverse}. + */ +@RequiredPermissions(Permission.EditDataverse) +public class RemoveDefaultDatasetCommand extends AbstractCommand{ + + private final Dataverse dataverse; + + public RemoveDefaultDatasetCommand(DataverseRequest request, Dataverse dataverse) { + super(request, dataverse); + this.dataverse = dataverse; + } + + @Override + public Dataverse execute(CommandContext ctxt) throws CommandException { + dataverse.setDefaultTemplate(null); + return dataverse; + } + +} 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