Skip to content

Commit 05f9b92

Browse files
committed
change create guestbook from returning 200 to 201
1 parent 63db903 commit 05f9b92

2 files changed

Lines changed: 58 additions & 20 deletions

File tree

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

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
import edu.harvard.iq.dataverse.GuestbookServiceBean;
66
import edu.harvard.iq.dataverse.api.auth.AuthRequired;
77
import edu.harvard.iq.dataverse.authorization.Permission;
8+
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
9+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
810
import edu.harvard.iq.dataverse.engine.command.impl.CreateGuestbookCommand;
911
import edu.harvard.iq.dataverse.engine.command.impl.UpdateGuestbookCommand;
1012
import edu.harvard.iq.dataverse.util.BundleUtil;
13+
import edu.harvard.iq.dataverse.util.ConstraintViolationUtil;
1114
import edu.harvard.iq.dataverse.util.json.JsonParseException;
1215
import edu.harvard.iq.dataverse.util.json.JsonPrinter;
1316
import edu.harvard.iq.dataverse.util.json.JsonUtil;
1417
import jakarta.ejb.EJB;
18+
import jakarta.ejb.EJBException;
1519
import jakarta.json.*;
20+
import jakarta.validation.ConstraintViolationException;
1621
import jakarta.ws.rs.*;
1722
import jakarta.ws.rs.container.ContainerRequestContext;
1823
import jakarta.ws.rs.core.Context;
@@ -72,25 +77,35 @@ public Response getGuestbooks(@Context ContainerRequestContext crc, @PathParam("
7277
@AuthRequired
7378
@Path("{identifier}")
7479
public Response createGuestbook(@Context ContainerRequestContext crc, @PathParam("identifier") String identifier, String jsonBody) {
75-
return response(req -> {
76-
Dataverse dataverse = findDataverseOrDie(identifier);
77-
if (!permissionSvc.request(req).on(dataverse).has(Permission.EditDataverse)) {
80+
81+
try {
82+
Dataverse dataverse = findDataverseOrDie(identifier);
83+
AuthenticatedUser u = getRequestAuthenticatedUserOrDie(crc);
84+
DataverseRequest req = createDataverseRequest(u);
85+
if (!permissionSvc.request(req).on(dataverse).has(Permission.EditDataverse)) {
7886
return error(Response.Status.FORBIDDEN, "Not authorized");
79-
}
87+
}
8088

81-
Guestbook guestbook = new Guestbook();
82-
guestbook.setDataverse(dataverse);
83-
try {
84-
JsonObject jsonObj = JsonUtil.getJsonObject(jsonBody);
85-
jsonParser().parseGuestbook(jsonObj, guestbook);
86-
} catch (JsonException | JsonParseException ex) {
87-
logger.log(Level.WARNING, "Error parsing guestbook JSON", ex);
88-
return badRequest("Error parsing guestbook JSON");
89-
}
90-
guestbook.setCreateTime(Timestamp.from(Instant.now()));
91-
execCommand(new CreateGuestbookCommand(guestbook, req, dataverse));
92-
return ok("Guestbook " + guestbook.getId() + " created");
93-
}, getRequestUser(crc));
89+
Guestbook guestbook = new Guestbook();
90+
guestbook.setDataverse(dataverse);
91+
try {
92+
JsonObject jsonObj = JsonUtil.getJsonObject(jsonBody);
93+
jsonParser().parseGuestbook(jsonObj, guestbook);
94+
} catch (JsonException | JsonParseException ex) {
95+
logger.log(Level.WARNING, "Error parsing guestbook JSON", ex);
96+
return badRequest("Error parsing guestbook JSON");
97+
}
98+
guestbook.setCreateTime(Timestamp.from(Instant.now()));
99+
Guestbook newGuestbook = execCommand(new CreateGuestbookCommand(guestbook, req, dataverse));
100+
return created("/guestbooks/" + newGuestbook.getId(), json(newGuestbook));
101+
} catch (WrappedResponse ww) {
102+
return handleWrappedResponse(ww);
103+
} catch (EJBException ex) {
104+
return handleEJBException(ex, "Error creating guestbook.");
105+
} catch (Exception ex) {
106+
logger.log(Level.SEVERE, "Error creating guestbook", ex);
107+
return error(Response.Status.INTERNAL_SERVER_ERROR, "Error creating guestbook: " + ex.getMessage());
108+
}
94109
}
95110

96111
@PUT
@@ -126,4 +141,26 @@ public Response enableGuestbook(@Context ContainerRequestContext crc, @PathParam
126141
return notFound("Guestbook " + guestbookId + " not found.");
127142
}, getRequestUser(crc));
128143
}
144+
private Response handleWrappedResponse(WrappedResponse ww) {
145+
String error = ConstraintViolationUtil.getErrorStringForConstraintViolations(ww.getCause());
146+
if (!error.isEmpty()) {
147+
logger.log(Level.INFO, error);
148+
return ww.refineResponse(error);
149+
}
150+
return ww.getResponse();
151+
}
152+
153+
private Response handleEJBException(EJBException ex, String action) {
154+
Throwable cause = ex;
155+
StringBuilder sb = new StringBuilder();
156+
sb.append(action);
157+
while (cause.getCause() != null) {
158+
cause = cause.getCause();
159+
if (cause instanceof ConstraintViolationException) {
160+
sb.append(ConstraintViolationUtil.getErrorStringForConstraintViolations(cause));
161+
}
162+
}
163+
logger.log(Level.SEVERE, sb.toString());
164+
return error(Response.Status.INTERNAL_SERVER_ERROR, sb.toString());
165+
}
129166
}

src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5466,11 +5466,12 @@ public static Guestbook createRandomGuestbook(String ownerAlias, String persiste
54665466
jsonParsor.parseGuestbook(jsonObj, gb);
54675467

54685468
Response createGuestbookResponse = UtilIT.createGuestbook(ownerAlias, guestbookAsJson, apiToken);
5469-
createGuestbookResponse.then().assertThat()
5470-
.statusCode(OK.getStatusCode());
54715469
createGuestbookResponse.prettyPrint();
5470+
createGuestbookResponse.then().assertThat()
5471+
.statusCode(CREATED.getStatusCode());
54725472
JsonPath createdGuestbook = JsonPath.from(createGuestbookResponse.body().asString());
5473-
Long guestbookId = Long.parseLong(createdGuestbook.getString("data.message").split(" ")[1]);
5473+
long guestbookId = createdGuestbook.getLong("data.id");
5474+
54745475
Response guestbookEnableResponse = UtilIT.enableGuestbook(ownerAlias, guestbookId, apiToken, Boolean.TRUE.toString());
54755476
guestbookEnableResponse.prettyPrint();
54765477
guestbookEnableResponse.then().assertThat()

0 commit comments

Comments
 (0)