gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant] branch master updated: add C client API for DELETE /tra


From: gnunet
Subject: [taler-merchant] branch master updated: add C client API for DELETE /transfers/ID operation (#6876)
Date: Tue, 18 May 2021 12:06:33 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 031e2fed add C client API for DELETE /transfers/ID operation (#6876)
031e2fed is described below

commit 031e2fed3aae424bc47f6634fa52415729c75ed3
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue May 18 12:06:29 2021 +0200

    add C client API for DELETE /transfers/ID operation (#6876)
---
 src/include/taler_merchant_service.h   |  55 +++++++++-
 src/lib/Makefile.am                    |   1 +
 src/lib/merchant_api_delete_transfer.c | 187 +++++++++++++++++++++++++++++++++
 3 files changed, 242 insertions(+), 1 deletion(-)

diff --git a/src/include/taler_merchant_service.h 
b/src/include/taler_merchant_service.h
index 1b7ccc54..9e7cf8f8 100644
--- a/src/include/taler_merchant_service.h
+++ b/src/include/taler_merchant_service.h
@@ -2008,7 +2008,7 @@ struct TALER_MERCHANT_OrderDeleteHandle;
 
 
 /**
- * Function called with the result of the DELETE /order/$ID operation.
+ * Function called with the result of the DELETE /orders/$ID operation.
  *
  * @param cls closure
  * @param hr HTTP response details
@@ -2780,6 +2780,57 @@ TALER_MERCHANT_transfers_post_cancel (
   struct TALER_MERCHANT_PostTransfersHandle *pth);
 
 
+/**
+ * Handle for a DELETE /transfers/ID operation.
+ */
+struct TALER_MERCHANT_TransferDeleteHandle;
+
+
+/**
+ * Function called with the result of the DELETE /transfers/$ID operation.
+ *
+ * @param cls closure
+ * @param hr HTTP response details
+ */
+typedef void
+(*TALER_MERCHANT_TransferDeleteCallback)(
+  void *cls,
+  const struct TALER_MERCHANT_HttpResponse *hr);
+
+
+/**
+ * Delete an incoming wire transfer at an instance of a backend. This
+ * will only succeed if the exchange did not respond to the inquiry
+ * about the transfer.
+ *
+ * @param ctx the context
+ * @param backend_url HTTP base URL for the backend (top-level "default" 
instance
+ *                    or base URL of an instance if @a instance_id is NULL)
+ * @param wire_transfer_serial unique number that identifies the transfer
+ * @param td_cb function to call with the backend's result
+ * @param td_cb_cls closure for @a td_cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_MERCHANT_TransferDeleteHandle *
+TALER_MERCHANT_transfer_delete (
+  struct GNUNET_CURL_Context *ctx,
+  const char *backend_url,
+  uint64_t wire_transfer_serial,
+  TALER_MERCHANT_TransferDeleteCallback td_cb,
+  void *td_cb_cls);
+
+
+/**
+ * Cancel deletion operation. Note that the operation may still
+ * succeed.
+ *
+ * @param tdh operation to cancel
+ */
+void
+TALER_MERCHANT_transfer_delete_cancel (
+  struct TALER_MERCHANT_TransferDeleteHandle *tdh);
+
+
 /**
  * @brief Handle to a GET /transfers operation at a merchant's backend.
  */
@@ -2815,6 +2866,8 @@ struct TALER_MERCHANT_TransferData
 
   /**
    * Serial number of the credit operation in the merchant backend.
+   * Needed, for example, to delete the transfer using
+   * #TALER_MERCHANT_transfer_delete().
    */
   uint64_t credit_serial;
 
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 08ef97ab..52d6dd84 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -19,6 +19,7 @@ libtalermerchant_la_SOURCES = \
   merchant_api_delete_order.c \
   merchant_api_delete_product.c \
   merchant_api_delete_reserve.c \
+  merchant_api_delete_transfer.c \
   merchant_api_get_config.c \
   merchant_api_get_instance.c \
   merchant_api_get_instances.c \
diff --git a/src/lib/merchant_api_delete_transfer.c 
b/src/lib/merchant_api_delete_transfer.c
new file mode 100644
index 00000000..9a040753
--- /dev/null
+++ b/src/lib/merchant_api_delete_transfer.c
@@ -0,0 +1,187 @@
+/*
+  This file is part of TALER
+  Copyright (C) 2021 Taler Systems SA
+
+  TALER is free software; you can redistribute it and/or modify it under the
+  terms of the GNU Lesser General Public License as published by the Free 
Software
+  Foundation; either version 2.1, or (at your option) any later version.
+
+  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+  A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more 
details.
+
+  You should have received a copy of the GNU Lesser General Public License 
along with
+  TALER; see the file COPYING.LGPL.  If not, see
+  <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file merchant_api_delete_transfer.c
+ * @brief Implementation of the DELETE /transfer/$ID request of the merchant's 
HTTP API
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <curl/curl.h>
+#include <jansson.h>
+#include <microhttpd.h> /* just for HTTP status codes */
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_curl_lib.h>
+#include "taler_merchant_service.h"
+#include <taler/taler_json_lib.h>
+#include <taler/taler_signatures.h>
+
+
+/**
+ * Handle for a DELETE /transfers/$ID operation.
+ */
+struct TALER_MERCHANT_TransferDeleteHandle
+{
+  /**
+   * The url for this request.
+   */
+  char *url;
+
+  /**
+   * Handle for the request.
+   */
+  struct GNUNET_CURL_Job *job;
+
+  /**
+   * Function to call with the result.
+   */
+  TALER_MERCHANT_TransferDeleteCallback cb;
+
+  /**
+   * Closure for @a cb.
+   */
+  void *cb_cls;
+
+  /**
+   * Reference to the execution context.
+   */
+  struct GNUNET_CURL_Context *ctx;
+
+};
+
+
+/**
+ * Function called when we're done processing the
+ * HTTP GET /transfers/$ID request.
+ *
+ * @param cls the `struct TALER_MERCHANT_TransferDeleteHandle`
+ * @param response_code HTTP response code, 0 on error
+ * @param response response body, NULL if not in JSON
+ */
+static void
+handle_delete_transfer_finished (void *cls,
+                                long response_code,
+                                const void *response)
+{
+  struct TALER_MERCHANT_TransferDeleteHandle *tdh = cls;
+  const json_t *json = response;
+  struct TALER_MERCHANT_HttpResponse hr = {
+    .http_status = (unsigned int) response_code,
+    .reply = json
+  };
+
+  tdh->job = NULL;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Got /transfers/$ID response with status code %u\n",
+              (unsigned int) response_code);
+  switch (response_code)
+  {
+  case MHD_HTTP_NO_CONTENT:
+    break;
+  case MHD_HTTP_UNAUTHORIZED:
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    /* Nothing really to verify, merchant says we need to authenticate. */
+    break;
+  case MHD_HTTP_NOT_FOUND:
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    break;
+  case MHD_HTTP_CONFLICT:
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    break;
+  default:
+    /* unexpected response code */
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Unexpected response code %u/%d\n",
+                (unsigned int) response_code,
+                (int) hr.ec);
+    break;
+  }
+  tdh->cb (tdh->cb_cls,
+           &hr);
+  TALER_MERCHANT_transfer_delete_cancel (tdh);
+}
+
+
+struct TALER_MERCHANT_TransferDeleteHandle *
+TALER_MERCHANT_transfer_delete (
+  struct GNUNET_CURL_Context *ctx,
+  const char *backend_url,
+  uint64_t wire_transfer_serial,
+  TALER_MERCHANT_TransferDeleteCallback cb,
+  void *cb_cls)
+{
+  struct TALER_MERCHANT_TransferDeleteHandle *tdh;
+
+  tdh = GNUNET_new (struct TALER_MERCHANT_TransferDeleteHandle);
+  tdh->ctx = ctx;
+  tdh->cb = cb;
+  tdh->cb_cls = cb_cls;
+  {
+    char *path;
+
+    GNUNET_asprintf (&path,
+                     "private/transfers/%llu",
+                     (unsigned long long) wire_transfer_serial);
+    tdh->url = TALER_url_join (backend_url,
+                               path,
+                               NULL);
+    GNUNET_free (path);
+  }
+  if (NULL == tdh->url)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Could not construct request URL.\n");
+    GNUNET_free (tdh);
+    return NULL;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Requesting URL '%s'\n",
+              tdh->url);
+  {
+    CURL *eh;
+
+    eh = curl_easy_init ();
+    GNUNET_assert (CURLE_OK ==
+                   curl_easy_setopt (eh,
+                                     CURLOPT_URL,
+                                     tdh->url));
+    GNUNET_assert (CURLE_OK ==
+                   curl_easy_setopt (eh,
+                                     CURLOPT_CUSTOMREQUEST,
+                                     MHD_HTTP_METHOD_DELETE));
+    tdh->job = GNUNET_CURL_job_add (ctx,
+                                    eh,
+                                    &handle_delete_transfer_finished,
+                                    tdh);
+  }
+  return tdh;
+}
+
+
+void
+TALER_MERCHANT_transfer_delete_cancel (
+  struct TALER_MERCHANT_TransferDeleteHandle *tdh)
+{
+  if (NULL != tdh->job)
+    GNUNET_CURL_job_cancel (tdh->job);
+  GNUNET_free (tdh->url);
+  GNUNET_free (tdh);
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]