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 */