|
5 | 5 | import edu.harvard.iq.dataverse.GuestbookServiceBean; |
6 | 6 | import edu.harvard.iq.dataverse.api.auth.AuthRequired; |
7 | 7 | 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; |
8 | 10 | import edu.harvard.iq.dataverse.engine.command.impl.CreateGuestbookCommand; |
9 | 11 | import edu.harvard.iq.dataverse.engine.command.impl.UpdateGuestbookCommand; |
10 | 12 | import edu.harvard.iq.dataverse.util.BundleUtil; |
| 13 | +import edu.harvard.iq.dataverse.util.ConstraintViolationUtil; |
11 | 14 | import edu.harvard.iq.dataverse.util.json.JsonParseException; |
12 | 15 | import edu.harvard.iq.dataverse.util.json.JsonPrinter; |
13 | 16 | import edu.harvard.iq.dataverse.util.json.JsonUtil; |
14 | 17 | import jakarta.ejb.EJB; |
| 18 | +import jakarta.ejb.EJBException; |
15 | 19 | import jakarta.json.*; |
| 20 | +import jakarta.validation.ConstraintViolationException; |
16 | 21 | import jakarta.ws.rs.*; |
17 | 22 | import jakarta.ws.rs.container.ContainerRequestContext; |
18 | 23 | import jakarta.ws.rs.core.Context; |
@@ -72,25 +77,35 @@ public Response getGuestbooks(@Context ContainerRequestContext crc, @PathParam(" |
72 | 77 | @AuthRequired |
73 | 78 | @Path("{identifier}") |
74 | 79 | 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)) { |
78 | 86 | return error(Response.Status.FORBIDDEN, "Not authorized"); |
79 | | - } |
| 87 | + } |
80 | 88 |
|
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 | + } |
94 | 109 | } |
95 | 110 |
|
96 | 111 | @PUT |
@@ -126,4 +141,26 @@ public Response enableGuestbook(@Context ContainerRequestContext crc, @PathParam |
126 | 141 | return notFound("Guestbook " + guestbookId + " not found."); |
127 | 142 | }, getRequestUser(crc)); |
128 | 143 | } |
| 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 | + } |
129 | 166 | } |
0 commit comments