[DS-3952] Bitstream is optional if allfiles:true. Implement and test.

This commit is contained in:
Mark H. Wood
2021-09-24 13:18:59 -04:00
parent 7ce6333ea4
commit 59befb62aa
5 changed files with 75 additions and 53 deletions

View File

@@ -98,14 +98,21 @@ public class RequestItemEmailNotifier {
email.addArgument(authorEmail); // {8} corresponding author email
email.addArgument(configurationService.getProperty("dspace.name"));
email.addArgument(configurationService.getProperty("mail.helpdesk"));
// Send the email.
try {
email.send();
Bitstream bitstream = ri.getBitstream();
String bitstreamID;
if (null == bitstream) {
bitstreamID = "null";
} else {
bitstreamID = ri.getBitstream().getID().toString();
}
LOG.info(LogHelper.getHeader(context,
"sent_email_requestItem",
"submitter_id={},bitstream_id={},requestEmail={}"),
ri.getReqEmail(), ri.getBitstream().getID().toString(),
ri.getReqEmail());
ri.getReqEmail(), bitstreamID, ri.getReqEmail());
} catch (MessagingException e) {
LOG.warn(LogHelper.getHeader(context,
"error_mailing_requestItem", e.getMessage()));

View File

@@ -9,6 +9,7 @@
package org.dspace.builder;
import java.sql.SQLException;
import javax.validation.constraints.NotNull;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -55,8 +56,16 @@ public class RequestItemBuilder
}
}
public static RequestItemBuilder createRequestItem(Context ctx, Item item,
Bitstream bitstream) {
/**
* Initialize a RequestItem.
*
* @param ctx current DSpace session.
* @param item the requested Item.
* @param bitstream the single requested Bitstream, or null for "all files".
* @return a builder initialized for this request.
*/
public static RequestItemBuilder createRequestItem(Context ctx,
@NotNull Item item, Bitstream bitstream) {
RequestItemBuilder builder = new RequestItemBuilder(ctx);
return builder.create(item, bitstream);
}
@@ -64,8 +73,9 @@ public class RequestItemBuilder
private RequestItemBuilder create(Item item, Bitstream bitstream) {
String token;
try {
token = requestItemService.createRequest(context, bitstream,
item, true, REQ_EMAIL, REQ_NAME, REQ_MESSAGE);
token = requestItemService.createRequest(context, bitstream, item,
(null == bitstream),
REQ_EMAIL, REQ_NAME, REQ_MESSAGE);
} catch (SQLException ex) {
return handleException(ex);
}

View File

@@ -11,11 +11,9 @@ package org.dspace.app.rest.converter;
import javax.inject.Named;
import org.dspace.app.requestitem.RequestItem;
import org.dspace.app.requestitem.service.RequestItemService;
import org.dspace.app.rest.model.RequestItemRest;
import org.dspace.app.rest.projection.Projection;
import org.dspace.services.RequestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.dspace.content.Bitstream;
/**
* Convert between {@link org.dspace.app.requestitem.RequestItem} and
@@ -26,18 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired;
@Named
public class RequestItemConverter
implements DSpaceConverter<RequestItem, RequestItemRest> {
@Autowired(required = true)
protected BitstreamConverter bitstreamConverter;
@Autowired(required = true)
protected ItemConverter itemConverter;
@Autowired(required = true)
protected RequestItemService requestItemService;
@Autowired(required = true)
protected RequestService requestService;
@Override
public RequestItemRest convert(RequestItem requestItem, Projection projection) {
RequestItemRest requestItemRest = new RequestItemRest();
@@ -45,7 +31,12 @@ public class RequestItemConverter
requestItemRest.setAcceptRequest(requestItem.isAccept_request());
requestItemRest.setAllfiles(requestItem.isAllfiles());
requestItemRest.setBitstreamId(requestItem.getBitstream().getID().toString());
Bitstream bitstream = requestItem.getBitstream();
if (null == bitstream) {
requestItemRest.setBitstreamId(null);
} else {
requestItemRest.setBitstreamId(requestItem.getBitstream().getID().toString());
}
requestItemRest.setDecisionDate(requestItem.getDecision_date());
requestItemRest.setExpires(requestItem.getExpires());
requestItemRest.setId(requestItem.getID());

View File

@@ -124,17 +124,27 @@ public class RequestItemRepository
throw new AuthorizeException("Anonymous requests are not permitted.");
}
// Create the item request model object from the REST object.
String token;
String bitstreamId = rir.getBitstreamId();
if (isBlank(bitstreamId)) {
throw new IncompleteItemRequestException("A bitstream ID is required");
}
Bitstream bitstream = bitstreamService.find(ctx, UUID.fromString(bitstreamId));
if (null == bitstream) {
throw new IncompleteItemRequestException("That bitstream does not exist");
/* Create the item request model object from the REST object. */
// Requesting all bitstreams of an item, or a single bitstream?
boolean allFiles = rir.isAllfiles();
// Requested bitstream. Ignored if all files requested, otherwise required.
Bitstream bitstream;
if (!allFiles) {
String bitstreamId = rir.getBitstreamId();
if (isBlank(bitstreamId)) {
throw new IncompleteItemRequestException("A bitstream ID is required");
}
bitstream = bitstreamService.find(ctx, UUID.fromString(bitstreamId));
if (null == bitstream) {
throw new IncompleteItemRequestException("That bitstream does not exist");
}
} else {
bitstream = null;
}
// Requested item.
String itemId = rir.getItemId();
if (isBlank(itemId)) {
throw new IncompleteItemRequestException("An item ID is required");
@@ -144,30 +154,35 @@ public class RequestItemRepository
throw new IncompleteItemRequestException("That item does not exist");
}
boolean allFiles = rir.isAllfiles();
String email = rir.getRequestEmail();
if (isBlank(email)) {
throw new IncompleteItemRequestException("A submitter's email address is required");
}
EmailValidator emailValidator = EmailValidator.getInstance(false, false);
if (!emailValidator.isValid(email)) {
throw new UnprocessableEntityException("Invalid email address");
}
// If there is a current user, replace email and name
String username;
if (null != user) {
username = user.getFullName();
// Requester's email address.
String email;
if (null != user) { // Prefer authenticated user's email.
email = user.getEmail();
} else {
} else { // Require an anonymous session to provide an email address.
email = rir.getRequestEmail();
if (isBlank(email)) {
throw new IncompleteItemRequestException("A submitter's email address is required");
}
EmailValidator emailValidator = EmailValidator.getInstance(false, false);
if (!emailValidator.isValid(email)) {
throw new UnprocessableEntityException("Invalid email address");
}
}
// Requester's human-readable name.
String username;
if (null != user) { // Prefer authenticated user's name.
username = user.getFullName();
} else { // An anonymous session may provide a name.
// Escape username to evade nasty XSS attempts
username = StringEscapeUtils.escapeHtml4(rir.getRequestName());
}
// Escape message text to evade nasty XSS attempts
// Requester's message text, escaped to evade nasty XSS attempts
String message = StringEscapeUtils.escapeHtml4(rir.getRequestMessage());
// Create the request.
String token;
token = requestItemService.createRequest(ctx, bitstream, item,
allFiles, email, username, message);

View File

@@ -206,12 +206,11 @@ public class RequestItemRepositoryIT
// Fake up a request in REST form.
RequestItemRest rir = new RequestItemRest();
rir.setBitstreamId(bitstream.getID().toString());
rir.setAllfiles(true);
rir.setItemId(item.getID().toString());
rir.setRequestEmail(eperson.getEmail());
rir.setRequestMessage(RequestItemBuilder.REQ_MESSAGE);
rir.setRequestName(eperson.getFullName());
rir.setAllfiles(false);
rir.setRequestMessage(RequestItemBuilder.REQ_MESSAGE);
// Create it and see if it was created correctly.
ObjectMapper mapper = new ObjectMapper();
@@ -231,7 +230,7 @@ public class RequestItemRepositoryIT
hasJsonPath("$.requestEmail", is(eperson.getEmail())),
hasJsonPath("$.requestMessage", is(RequestItemBuilder.REQ_MESSAGE)),
hasJsonPath("$.requestName", is(eperson.getFullName())),
hasJsonPath("$.allfiles", is(false)),
hasJsonPath("$.allfiles", is(true)),
// TODO should be an ISO datetime
hasJsonPath("$.requestDate", not(is(emptyOrNullString()))),
hasJsonPath("$._links.self.href", not(is(emptyOrNullString())))
@@ -261,12 +260,12 @@ public class RequestItemRepositoryIT
// Fake up a request in REST form.
RequestItemRest rir = new RequestItemRest();
rir.setAllfiles(false);
rir.setBitstreamId(bitstream.getID().toString());
rir.setItemId(item.getID().toString());
rir.setRequestEmail(RequestItemBuilder.REQ_EMAIL);
rir.setRequestMessage(RequestItemBuilder.REQ_MESSAGE);
rir.setRequestName(RequestItemBuilder.REQ_NAME);
rir.setAllfiles(false);
// Create it and see if it was created correctly.
ObjectMapper mapper = new ObjectMapper();