@TimedResource @POST @Path("/{transactionId:" + UUID_PATTERN + "}/") @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @ApiOperation(value = "Mark a pending payment transaction as succeeded or failed", response = PaymentJson.class) @ApiResponses(value = {@ApiResponse(code = 201, message = "Successfully notifiy state change"), @ApiResponse(code = 400, message = "Invalid paymentId supplied"), @ApiResponse(code = 404, message = "Account or Payment not found")}) public Response notifyStateChanged(@PathParam("transactionId") final UUID transactionId, final PaymentTransactionJson json, @QueryParam(QUERY_PAYMENT_CONTROL_PLUGIN_NAME) final List<String> paymentControlPluginNames, @HeaderParam(HDR_CREATED_BY) final String createdBy, @HeaderParam(HDR_REASON) final String reason, @HeaderParam(HDR_COMMENT) final String comment, @javax.ws.rs.core.Context final UriInfo uriInfo, @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException, AccountApiException { verifyNonNullOrEmpty(json, "PaymentTransactionJson body should be specified"); verifyNonNullOrEmpty(json.getPaymentId(), "PaymentTransactionJson paymentId needs to be set", json.getStatus(), "PaymentTransactionJson status needs to be set"); final PaymentOptions paymentOptions = createControlPluginApiPaymentOptions(paymentControlPluginNames); final CallContext callContext = context.createCallContextNoAccountId(createdBy, reason, comment, request); final UUID paymentId = json.getPaymentId(); final Payment payment = paymentApi.getPayment(paymentId, false, false, ImmutableList.<PluginProperty>of(), callContext); final Account account = accountUserApi.getAccountById(payment.getAccountId(), callContext); final boolean success = TransactionStatus.SUCCESS.name().equals(json.getStatus()); final Payment result = paymentApi.notifyPendingTransactionOfStateChangedWithPaymentControl(account, transactionId, success, paymentOptions, callContext); return uriBuilder.buildResponse(uriInfo, PaymentResource.class, "getPayment", result.getId(), request); }