merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit fa770a9a29f4123164567c873ae6d6f34444777b
parent 79f8f92c49cea689013d62b6dcc75b07360d6ea7
Author: Marcello Stanisci <marcello.stanisci@inria.fr>
Date:   Fri,  9 Dec 2016 16:10:42 +0100

20% of /map/in's merchant-lib

Diffstat:
Asrc/backend/taler-merchant-httpd_map.h | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/lib/merchant_api_map.c | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/src/backend/taler-merchant-httpd_map.h b/src/backend/taler-merchant-httpd_map.h @@ -0,0 +1,66 @@ +/* + This file is part of TALER + (C) 2014, 2015, 2016 INRIA + + 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 backend/taler-merchant-httpd_contract.c + * @brief HTTP serving layer mainly intended to communicate with the frontend + * @author Marcello Stanisci + */ + +#ifndef TALER_MERCHANT_HTTPD_MAP_H +#define TALER_MERCHANT_HTTPD_MAP_H +#include <microhttpd.h> +#include "taler-merchant-httpd.h" + + +/** + * Manage a /map/in request. Store in db a plain text contract + * and its hashcode. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +MH_handler_map_in (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size); + + +/** + * Manage a /map/out request. Query the db and returns a plain + * text contract associated with the hashcode given as input + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +MH_handler_map_out (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size); + +/* end of taler-merchant-httpd_history.c */ +#endif diff --git a/src/lib/merchant_api_map.c b/src/lib/merchant_api_map.c @@ -0,0 +1,148 @@ +/* + This file is part of TALER + Copyright (C) 2014, 2015, 2016 GNUnet e.V. and INRIA + + 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 lib/merchant_api_map.c + * @brief Implementation of the /map/{in,out} request of the merchant's HTTP API + * @author Marcello Stanisci + */ +#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> + +struct TALER_MERCHANT_MapInOperation +{ + /** + * Full URI, includes "/map/in". + */ + char *url; + + /** + * Request's body + */ + json_t *json_enc; + + /** + * Handle for the request. + */ + struct GNUNET_CURL_Job *job; + + /** + * Function to call with the result. + */ + TALER_MERCHANT_MapInOperationCallback 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 /map/in request. + * + * @param cls the `struct TALER_MERCHANT_FIXME` + * @param response_code HTTP response code, 0 on error + * @param json response body, NULL if not in JSON + */ +static void +handle_contract_finished (void *cls, + long response_code, + const json_t *json) +{ + + /** + * 1 Check if errors occurred + * 2 Call callback + */ +} + +/** + * Issue a /map/in request to the backend. + * + * @param ctx execution context + * @param backend_uri base URL of the merchant backend + * @param contract contract to store + * @param h_contract hashcode of `contract` + * @param map_in_cb callback which will work the response gotten from the backend + * @param map_in_cb_cls closure to pass to @a history_cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_HistoryOperation * +TALER_MERCHANT_history (struct GNUNET_CURL_Context *ctx, + const char *backend_uri, + const json_t *contract, + const struct GNUNET_HashCode *h_contract, + TALER_MERCHANT_MapInOperationCallback map_in_cb, + void *map_in_cb_cls) +{ + struct TALER_MERCHANT_MapInOperation *mio; + CURL *eh; + json_t *req; + + mio = GNUNET_new (struct TALER_MERCHANT_MapInOperation); + mio->ctx = ctx; + mio->cb = map_in_cb; + mio->cb_cls = map_in_cb_cls; + + GNUNET_asprintf (&mio->url, + "%s%s", + backend_uri, + "/map/in"); + + // build final json + req = json_pack ("{s:o, s:o}", + "contract", contract, + "h_contract", GNUNET_JSON_from_data_auto (h_contract)); + + GNUNET_assert (NULL != + (mio->json_enc = json_dumps (req, JSON_COMPACT)) + ); + + json_decref (req); + eh = curl_easy_init (); + + GNUNET_assert (CURLE_OK == + curl_easy_setopt (eh, + CURLOPT_URL, + mio->url)); + GNUNET_assert (CURLE_OK == + curl_easy_setopt (eh, + CURLOPT_POSTFIELDS, + mio->json_enc)); + GNUNET_assert (CURLE_OK == + curl_easy_setopt (eh, + CURLOPT_POSTFIELDSIZE, + strlen (mio->json_enc))); + mio->job = GNUNET_CURL_job_add (ctx, + eh, + GNUNET_YES, + &handle_map_in_finished, + mio); + return mio; +}