LCOV - code coverage report
Current view: top level - lib - merchant_api_post_using_templates.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 83.3 % 36 30
Test Date: 2025-10-31 14:20:14 Functions: 100.0 % 3 3

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2022-2023 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify
       6              :   it under the terms of the GNU Lesser General Public License as
       7              :   published by the Free Software Foundation; either version 2.1,
       8              :   or (at your option) any later version.
       9              : 
      10              :   TALER is distributed in the hope that it will be useful,
      11              :   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13              :   GNU Lesser General Public License for more details.
      14              : 
      15              :   You should have received a copy of the GNU Lesser General
      16              :   Public License along with TALER; see the file COPYING.LGPL.
      17              :   If not, see <http://www.gnu.org/licenses/>
      18              : */
      19              : /**
      20              :  * @file merchant_api_post_using_templates.c
      21              :  * @brief Implementation of the POST /using_templates request
      22              :  *        of the merchant's HTTP API
      23              :  * @author Priscilla HUANG
      24              :  */
      25              : #include "platform.h"
      26              : #include <curl/curl.h>
      27              : #include <jansson.h>
      28              : #include <microhttpd.h> /* just for HTTP status codes */
      29              : #include <gnunet/gnunet_util_lib.h>
      30              : #include "taler_merchant_service.h"
      31              : #include "merchant_api_common.h"
      32              : #include "merchant_api_curl_defaults.h"
      33              : #include <taler/taler_json_lib.h>
      34              : #include <taler/taler_curl_lib.h>
      35              : 
      36              : 
      37              : /**
      38              :  * Handle for a POST /templates/$ID operation.
      39              :  */
      40              : struct TALER_MERCHANT_UsingTemplatesPostHandle
      41              : {
      42              : 
      43              :   /**
      44              :    * The url for this request.
      45              :    */
      46              :   char *url;
      47              : 
      48              :   /**
      49              :    * Handle for the request.
      50              :    */
      51              :   struct GNUNET_CURL_Job *job;
      52              : 
      53              :   /**
      54              :    * Function to call with the result.
      55              :    */
      56              :   TALER_MERCHANT_PostOrdersCallback cb;
      57              : 
      58              :   /**
      59              :    * Closure for @a cb.
      60              :    */
      61              :   void *cb_cls;
      62              : 
      63              :   /**
      64              :    * Reference to the execution context.
      65              :    */
      66              :   struct GNUNET_CURL_Context *ctx;
      67              : 
      68              :   /**
      69              :    * Minor context that holds body and headers.
      70              :    */
      71              :   struct TALER_CURL_PostContext post_ctx;
      72              : };
      73              : 
      74              : /**
      75              :  * Function called when we're done processing the
      76              :  * HTTP POST /using-templates request.
      77              :  *
      78              :  * @param cls the `struct TALER_MERCHANT_UsingTemplatesPostHandle`
      79              :  * @param response_code HTTP response code, 0 on error
      80              :  * @param response response body, NULL if not in JSON
      81              :  */
      82              : static void
      83           14 : handle_post_using_templates_finished (void *cls,
      84              :                                       long response_code,
      85              :                                       const void *response)
      86              : {
      87           14 :   struct TALER_MERCHANT_UsingTemplatesPostHandle *utph = cls;
      88           14 :   const json_t *json = response;
      89              : 
      90           14 :   utph->job = NULL;
      91           14 :   TALER_MERCHANT_handle_order_creation_response_ (utph->cb,
      92              :                                                   utph->cb_cls,
      93              :                                                   response_code,
      94              :                                                   json);
      95           14 :   TALER_MERCHANT_using_templates_post_cancel (utph);
      96           14 : }
      97              : 
      98              : 
      99              : struct TALER_MERCHANT_UsingTemplatesPostHandle *
     100           14 : TALER_MERCHANT_using_templates_post (
     101              :   struct GNUNET_CURL_Context *ctx,
     102              :   const char *backend_url,
     103              :   const char *template_id,
     104              :   const char *summary,
     105              :   const struct TALER_Amount *amount,
     106              :   TALER_MERCHANT_PostOrdersCallback cb,
     107              :   void *cb_cls)
     108              : {
     109              :   struct TALER_MERCHANT_UsingTemplatesPostHandle *utph;
     110              :   json_t *req_obj;
     111              : 
     112           14 :   req_obj = GNUNET_JSON_PACK (
     113              :     GNUNET_JSON_pack_allow_null (
     114              :       GNUNET_JSON_pack_string ("summary",
     115              :                                summary)),
     116              :     GNUNET_JSON_pack_allow_null (
     117              :       TALER_JSON_pack_amount ("amount",
     118              :                               amount)));
     119           14 :   utph = GNUNET_new (struct TALER_MERCHANT_UsingTemplatesPostHandle);
     120           14 :   utph->ctx = ctx;
     121           14 :   utph->cb = cb;
     122           14 :   utph->cb_cls = cb_cls;
     123              :   {
     124              :     char *path;
     125              : 
     126           14 :     GNUNET_asprintf (&path,
     127              :                      "templates/%s",
     128              :                      template_id);
     129           14 :     utph->url = TALER_url_join (backend_url,
     130              :                                 path,
     131              :                                 NULL);
     132           14 :     GNUNET_free (path);
     133              :   }
     134           14 :   if (NULL == utph->url)
     135              :   {
     136            0 :     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     137              :                 "Could not construct request URL.\n");
     138            0 :     json_decref (req_obj);
     139            0 :     GNUNET_free (utph);
     140            0 :     return NULL;
     141              :   }
     142              :   {
     143              :     CURL *eh;
     144              : 
     145           14 :     eh = TALER_MERCHANT_curl_easy_get_ (utph->url);
     146           14 :     GNUNET_assert (GNUNET_OK ==
     147              :                    TALER_curl_easy_post (&utph->post_ctx,
     148              :                                          eh,
     149              :                                          req_obj));
     150           14 :     json_decref (req_obj);
     151           28 :     utph->job = GNUNET_CURL_job_add2 (ctx,
     152              :                                       eh,
     153           14 :                                       utph->post_ctx.headers,
     154              :                                       &handle_post_using_templates_finished,
     155              :                                       utph);
     156           14 :     GNUNET_assert (NULL != utph->job);
     157              :   }
     158           14 :   return utph;
     159              : }
     160              : 
     161              : 
     162              : void
     163           14 : TALER_MERCHANT_using_templates_post_cancel (
     164              :   struct TALER_MERCHANT_UsingTemplatesPostHandle *utph)
     165              : {
     166           14 :   if (NULL != utph->job)
     167              :   {
     168            0 :     GNUNET_CURL_job_cancel (utph->job);
     169            0 :     utph->job = NULL;
     170              :   }
     171           14 :   TALER_curl_easy_post_finished (&utph->post_ctx);
     172           14 :   GNUNET_free (utph->url);
     173           14 :   GNUNET_free (utph);
     174           14 : }
     175              : 
     176              : 
     177              : /* end of merchant_api_post_using_templates.c */
        

Generated by: LCOV version 2.0-1