gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant] 04/07: pull


From: gnunet
Subject: [taler-merchant] 04/07: pull
Date: Wed, 29 Mar 2023 16:39:51 +0200

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

priscilla-huang pushed a commit to branch master
in repository merchant.

commit ecf977438a029f464a9528cd4149d9e70c6da72b
Author: priscilla <priscilla.huang@efrei.net>
AuthorDate: Wed Mar 22 10:22:44 2023 -0400

    pull
---
 ...er-merchant-httpd_private-patch-templates-ID.c# | 197 +++++++++++++++++++++
 src/lib/merchant_api_post_order_pay.c              |   5 +
 src/testing/test_merchant_api.c                    |   4 +-
 src/testing/testing_api_cmd_pay_order.c            |  11 ++
 src/testing/testing_api_cmd_post_using_templates.c |  20 +--
 5 files changed, 216 insertions(+), 21 deletions(-)

diff --git a/src/backend/#taler-merchant-httpd_private-patch-templates-ID.c# 
b/src/backend/#taler-merchant-httpd_private-patch-templates-ID.c#
new file mode 100644
index 00000000..6739c7a9
--- /dev/null
+++ b/src/backend/#taler-merchant-httpd_private-patch-templates-ID.c#
@@ -0,0 +1,197 @@
+/*
+  This file is part of TALER
+  (C) 2022 Taler Systems SA
+
+  TALER is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation; either version 3,
+  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 General Public License for more details.
+
+  You should have received a copy of the GNU General Public
+  License along with TALER; see the file COPYING.  If not,
+  see <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * @file taler-merchant-httpd_private-patch-templates-ID.c
+ * @brief implementing PATCH /templates/$ID request handling
+ * @author Priscilla HUANG
+ */
+#include "platform.h"
+#include "taler-merchant-httpd_private-patch-templates-ID.h"
+#include "taler-merchant-httpd_helper.h"
+#include <taler/taler_json_lib.h>
+
+
+/**
+ * How often do we retry the simple INSERT database transaction?
+ */
+#define MAX_RETRIES 3
+
+
+/**                    
+ * Determine the cause of the PATCH failure in more detail and report.
+ *
+ * @param connection connection to report on
+ * @param instance_id instance we are processing
+ * @param template_id ID of the product to patch
+ * @param tp template details we failed to set
+ */
+static MHD_RESULT
+determine_cause (struct MHD_Connection *connection,
+                 const char *instance_id,
+                 const char *template_id,
+                 const struct TALER_MERCHANTDB_TemplateDetails *tp)
+{
+  struct TALER_MERCHANTDB_TemplateDetails tpx;
+  enum GNUNET_DB_QueryStatus qs;
+
+  qs = TMH_db->lookup_template (TMH_db->cls,
+                                instance_id,
+                                template_id,
+                                &tpx);
+  switch (qs)
+  {
+  case GNUNET_DB_STATUS_HARD_ERROR:
+    GNUNET_break (0);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       TALER_EC_GENERIC_DB_FETCH_FAILED,
+                                       NULL);
+  case GNUNET_DB_STATUS_SOFT_ERROR:
+    GNUNET_break (0);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                       
TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE,
+                                       "unexpected serialization problem");
+  case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_NOT_FOUND,
+                                       
TALER_EC_MERCHANT_GENERIC_TEMPLATE_UNKNOWN,
+                                       template_id);
+  case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+    break; /* do below */
+  }
+
+  {
+    enum TALER_ErrorCode ec;
+
+    ec = TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
+    TALER_MERCHANTDB_template_details_free (&tpx);
+    GNUNET_break (TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE != ec);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_CONFLICT,
+                                       ec,
+                                       NULL);
+  }
+}
+
+
+/**
+ * PATCH configuration of an existing instance, given its configuration.
+ *
+ * @param rh context of the handler
+ * @param connection the MHD connection to handle
+ * @param[in,out] hc context with further information about the request
+ * @return MHD result code
+ */
+MHD_RESULT
+TMH_private_patch_templates_ID (const struct TMH_RequestHandler *rh,
+                                struct MHD_Connection *connection,
+                                struct TMH_HandlerContext *hc)
+{
+  struct TMH_MerchantInstance *mi = hc->instance;
+  const char *template_id = hc->infix;
+  struct TALER_MERCHANTDB_TemplateDetails tp = {0};
+  enum GNUNET_DB_QueryStatus qs;
+  uint32_t pos_algorithm;
+  struct GNUNET_JSON_Specification spec[] = {
+    GNUNET_JSON_spec_string ("template_description",
+                             (const char **) &tp.template_description),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_uint32 ("pos_algorithm",
+                               &pos_algorithm),
+     0),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_string ("pos_key",
+                               (const char **) &tp.pos_key),
+      NULL),
+    GNUNET_JSON_spec_json ("template_contract",
+                           &tp.template_contract),
+    GNUNET_JSON_spec_end ()
+  };
+
+  GNUNET_assert (NULL != mi);
+  GNUNET_assert (NULL != template_id);
+  {
+    enum GNUNET_GenericReturnValue res;
+
+    res = TALER_MHD_parse_json_data (connection,
+                                     hc->request_body,
+                                     spec);
+    if (GNUNET_OK != res)
+      return (GNUNET_NO == res)
+             ? MHD_YES
+             : MHD_NO;
+  }
+
+  tp.pos_algorithm = (enum TALER_MerchantConfirmationAlgorithm) pos_algorithm;
+  if (! TMH_template_contract_valid (tp.template_contract))
+  {
+    GNUNET_break_op (0);
+    GNUNET_JSON_parse_free (spec);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_BAD_REQUEST,
+                                       TALER_EC_GENERIC_PARAMETER_MALFORMED,
+                                       "template_contract");
+  }
+
+  qs = TMH_db->update_template (TMH_db->cls,
+                                mi->settings.id,
+                                template_id,
+                                &tp);
+  {
+    MHD_RESULT ret = MHD_NO;
+
+    switch (qs)
+    {
+    case GNUNET_DB_STATUS_HARD_ERROR:
+      GNUNET_break (0);
+      ret = TALER_MHD_reply_with_error (connection,
+                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                        TALER_EC_GENERIC_DB_STORE_FAILED,
+                                        NULL);
+      break;
+    case GNUNET_DB_STATUS_SOFT_ERROR:
+      GNUNET_break (0);
+      ret = TALER_MHD_reply_with_error (connection,
+                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                        
TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE,
+                                        "unexpected serialization problem");
+      break;
+    case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
+      ret = determine_cause (connection,
+                             mi->settings.id,
+                             template_id,
+                             &tp);
+      break;
+    case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
+      ret = TALER_MHD_reply_static (connection,
+                                    MHD_HTTP_NO_CONTENT,
+                                    NULL,
+                                    NULL,
+                                    0);
+      break;
+    }
+    GNUNET_JSON_parse_free (spec);
+    return ret;
+  }
+}
+
+
+/* end of taler-merchant-httpd_private-patch-templates-ID.c */
diff --git a/src/lib/merchant_api_post_order_pay.c 
b/src/lib/merchant_api_post_order_pay.c
index 765ca1a6..3923db21 100644
--- a/src/lib/merchant_api_post_order_pay.c
+++ b/src/lib/merchant_api_post_order_pay.c
@@ -407,6 +407,11 @@ handle_pay_finished (void *cls,
         GNUNET_JSON_spec_fixed_auto (
           "sig",
           &pr.details.success.merchant_sig),
+        GNUNET_JSON_spec_mark_optional (
+          GNUNET_JSON_spec_string (
+            "pos_confirmation",
+            &pr.details.success.pos_confirmation),
+          NULL),
         GNUNET_JSON_spec_end ()
       };
 
diff --git a/src/testing/test_merchant_api.c b/src/testing/test_merchant_api.c
index 9d828c12..b7d8518e 100644
--- a/src/testing/test_merchant_api.c
+++ b/src/testing/test_merchant_api.c
@@ -1445,8 +1445,8 @@ run (void *cls,
                                           MHD_HTTP_OK,
                                           "using-templates-t1",
                                           
"withdraw-coin-10a;withdraw-coin-10b",
-                                          "EUR:5",
-                                          "EUR:4.99",
+                                          "EUR:10",
+                                          "EUR:9",
                                           NULL),
     TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty",
                                                 merchant_url,
diff --git a/src/testing/testing_api_cmd_pay_order.c 
b/src/testing/testing_api_cmd_pay_order.c
index c1c5fc5a..8077f375 100644
--- a/src/testing/testing_api_cmd_pay_order.c
+++ b/src/testing/testing_api_cmd_pay_order.c
@@ -95,6 +95,7 @@ struct PayState
   /**
    * This variable is for the verification of the payment.
    */
+  const char *pos_key;
   const char *pos_confirmation;
 };
 
@@ -263,6 +264,15 @@ pay_cb (void *cls,
                                                          
GNUNET_TIME_timestamp_get());*/
     // FIXME: check if pr->details.success.pos_confirmation;
     // for that, get pos_secret from ps->proposal_reference CMD and amount 
from pay/order creation cmd using traits
+    struct TALER_Amount amount_with_fee;
+    GNUNET_assert (GNUNET_OK ==
+                   TALER_string_to_amount (ps->amount_with_fee,
+                                           &amount_with_fee));
+    ps->pos_confirmation = TALER_build_pos_confirmation (ps->pos_key,
+                                                         
TALER_MCA_WITHOUT_PRICE,
+                                                         &amount_with_fee,
+                                                         
GNUNET_TIME_timestamp_get());
+    ps->pos_confirmation = pr->details.success.pos_confirmation;
   }
   TALER_TESTING_interpreter_next (ps->is);
 }
@@ -496,6 +506,7 @@ pay_traits (void *cls,
         TALER_TESTING_make_trait_merchant_pub (merchant_pub),
         TALER_TESTING_make_trait_merchant_sig (&ps->merchant_sig),
         TALER_TESTING_make_trait_amount (&amount_with_fee),
+        TALER_TESTING_make_trait_template_pos_key (&ps->pos_key),
         TALER_TESTING_trait_end ()
       };
 
diff --git a/src/testing/testing_api_cmd_post_using_templates.c 
b/src/testing/testing_api_cmd_post_using_templates.c
index d8f2c0a9..62473b23 100644
--- a/src/testing/testing_api_cmd_post_using_templates.c
+++ b/src/testing/testing_api_cmd_post_using_templates.c
@@ -233,7 +233,7 @@ post_using_templates_cb (void *cls,
     TALER_TESTING_interpreter_next (tis->is);
     return;
   }
-  // check the rest of the function to adapt to using_template
+  // check for order
   switch (por->hr.http_status)
   {
   case MHD_HTTP_OK:
@@ -322,24 +322,6 @@ post_using_templates_cb (void *cls,
                                              &orders_claim_cb,
                                              tis)))
     TALER_TESTING_FAIL (tis->is);
-
-  /*
-  switch (por->hr.http_status)
-  {
-  case MHD_HTTP_OK:
-    break;
-  case MHD_HTTP_CONFLICT:
-    break;
-  case MHD_HTTP_NOT_FOUND:
-    break;
-  default:
-    GNUNET_break (0);
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Unhandled HTTP status %u for POST /templates/$ID.\n",
-                por->hr.http_status);
-    break;
-  }
-  TALER_TESTING_interpreter_next (tis->is);*/
 }
 
 

-- 
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]