[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant] 07/277: implement GET /instances
From: |
gnunet |
Subject: |
[taler-merchant] 07/277: implement GET /instances |
Date: |
Sun, 05 Jul 2020 20:48:40 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository merchant.
commit 49129bbcb160f01833e1c328b58ea5d7eb548423
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Fri Apr 17 20:30:45 2020 +0200
implement GET /instances
---
src/backend/Makefile.am | 3 +-
src/backend/taler-merchant-httpd.c | 34 +++---
src/backend/taler-merchant-httpd.h | 7 +-
.../taler-merchant-httpd_private-get-instances.c | 121 ++++++++-------------
.../taler-merchant-httpd_private-get-instances.h | 41 +++++++
5 files changed, 109 insertions(+), 97 deletions(-)
diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am
index f47cf08..1f98de3 100644
--- a/src/backend/Makefile.am
+++ b/src/backend/Makefile.am
@@ -22,7 +22,8 @@ taler_merchant_httpd_SOURCES = \
taler-merchant-httpd_auditors.c taler-merchant-httpd_auditors.h \
taler-merchant-httpd_config.c taler-merchant-httpd_config.h \
taler-merchant-httpd_exchanges.c taler-merchant-httpd_exchanges.h \
- taler-merchant-httpd_mhd.c taler-merchant-httpd_mhd.h
+ taler-merchant-httpd_mhd.c taler-merchant-httpd_mhd.h \
+ taler-merchant-httpd_private-get-instances.c
taler-merchant-httpd_private-get-instances.h
DEAD = \
taler-merchant-httpd_check-payment.c taler-merchant-httpd_check-payment.h \
diff --git a/src/backend/taler-merchant-httpd.c
b/src/backend/taler-merchant-httpd.c
index 5e02cd0..b1668e0 100644
--- a/src/backend/taler-merchant-httpd.c
+++ b/src/backend/taler-merchant-httpd.c
@@ -22,19 +22,13 @@
* @author Florian Dold
*/
#include "platform.h"
-#include <microhttpd.h>
-#include <gnunet/gnunet_util_lib.h>
-#include <taler/taler_util.h>
-#include <taler/taler_json_lib.h>
-#include <taler/taler_mhd_lib.h>
#include <taler/taler_bank_service.h>
#include <taler/taler_exchange_service.h>
-#include "taler_merchantdb_lib.h"
-#include "taler-merchant-httpd.h"
#include "taler-merchant-httpd_auditors.h"
+#include "taler-merchant-httpd_config.h"
#include "taler-merchant-httpd_exchanges.h"
#include "taler-merchant-httpd_mhd.h"
-#include "taler-merchant-httpd_config.h"
+#include "taler-merchant-httpd_private-get-instances.h"
/**
* Backlog for listen operation on unix-domain sockets.
@@ -62,7 +56,7 @@ struct TALER_MERCHANTDB_Plugin *TMH_db;
* just a string that identifies a merchant instance. When a frontend
* needs to specify an instance to the backend, it does so by 'id'
*/
-static struct GNUNET_CONTAINER_MultiHashMap *by_id_map;
+struct GNUNET_CONTAINER_MultiHashMap *TMH_by_id_map;
/**
* The port we are running on
@@ -443,13 +437,13 @@ do_shutdown (void *cls)
GNUNET_CONTAINER_multihashmap_destroy (payment_trigger_map);
payment_trigger_map = NULL;
}
- if (NULL != by_id_map)
+ if (NULL != TMH_by_id_map)
{
- GNUNET_CONTAINER_multihashmap_iterate (by_id_map,
+ GNUNET_CONTAINER_multihashmap_iterate (TMH_by_id_map,
&instance_free_cb,
NULL);
- GNUNET_CONTAINER_multihashmap_destroy (by_id_map);
- by_id_map = NULL;
+ GNUNET_CONTAINER_multihashmap_destroy (TMH_by_id_map);
+ TMH_by_id_map = NULL;
}
}
@@ -622,7 +616,7 @@ lookup_instance (const char *instance_id)
instance_id);
/* We're fine if that returns NULL, the calling routine knows how
to handle that */
- return GNUNET_CONTAINER_multihashmap_get (by_id_map,
+ return GNUNET_CONTAINER_multihashmap_get (TMH_by_id_map,
&h_instance);
}
@@ -650,7 +644,7 @@ TMH_add_instance (struct TMH_MerchantInstance *mi)
"Looking for by-id key %s of `%s' in hashmap\n",
GNUNET_h2s (&h_instance),
id);
- ret = GNUNET_CONTAINER_multihashmap_put (by_id_map,
+ ret = GNUNET_CONTAINER_multihashmap_put (TMH_by_id_map,
&h_instance,
mi,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
@@ -727,6 +721,12 @@ url_handler (void *cls,
.skip_instance = true,
.handler = &TMH_MHD_handler_agpl_redirect
},
+ {
+ .url_prefix = "/instances",
+ .method = MHD_HTTP_METHOD_GET,
+ .skip_instance = true,
+ .handler = &TMH_private_get_instances
+ },
{
NULL
}
@@ -1109,8 +1109,8 @@ run (void *cls,
return;
}
if (NULL ==
- (by_id_map = GNUNET_CONTAINER_multihashmap_create (1,
- GNUNET_NO)))
+ (TMH_by_id_map = GNUNET_CONTAINER_multihashmap_create (1,
+ GNUNET_NO)))
{
GNUNET_SCHEDULER_shutdown ();
return;
diff --git a/src/backend/taler-merchant-httpd.h
b/src/backend/taler-merchant-httpd.h
index 52563e7..5f95778 100644
--- a/src/backend/taler-merchant-httpd.h
+++ b/src/backend/taler-merchant-httpd.h
@@ -23,7 +23,6 @@
#include "platform.h"
#include "taler_merchantdb_lib.h"
-#include <microhttpd.h>
#include <taler/taler_mhd_lib.h>
#include <gnunet/gnunet_mhd_compat.h>
@@ -359,6 +358,12 @@ extern int TMH_force_audit;
*/
extern struct TALER_MERCHANTDB_Plugin *TMH_db;
+/**
+ * Hashmap pointing at merchant instances by 'id'. An 'id' is
+ * just a string that identifies a merchant instance. When a frontend
+ * needs to specify an instance to the backend, it does so by 'id'
+ */
+extern struct GNUNET_CONTAINER_MultiHashMap *TMH_by_id_map;
/**
* Kick MHD to run now, to be called after MHD_resume_connection().
diff --git a/src/backend/taler-merchant-httpd_private-get-instances.c
b/src/backend/taler-merchant-httpd_private-get-instances.c
index 8a08ab1..bd36817 100644
--- a/src/backend/taler-merchant-httpd_private-get-instances.c
+++ b/src/backend/taler-merchant-httpd_private-get-instances.c
@@ -14,68 +14,52 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
- * @file backend/taler-merchant-httpd_config.c
- * @brief implement API for querying configuration data of the backend
- * @author Florian Dold
+ * @file backend/taler-merchant-httpd_private-get-instances.c
+ * @brief implement GET /instances
+ * @author Christian Grothoff
*/
#include "platform.h"
-#include <jansson.h>
-#include <taler/taler_util.h>
-#include <taler/taler_json_lib.h>
-#include "taler-merchant-httpd.h"
-#include "taler-merchant-httpd_mhd.h"
-#include "taler-merchant-httpd_exchanges.h"
-
+#include "taler-merchant-httpd_private-get-instances.h"
/**
- * Taler protocol version in the format CURRENT:REVISION:AGE
- * as used by GNU libtool. See
- *
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
- *
- * Please be very careful when updating and follow
- *
https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
- * precisely. Note that this version has NOTHING to do with the
- * release version, and the format is NOT the same that semantic
- * versioning uses either.
+ * Add merchant instance to our JSON array.
*
- * When changing this version, you likely want to also update
- * #MERCHANT_PROTOCOL_CURRENT and #MERCHANT_PROTOCOL_AGE in
- * merchant_api_config.c!
+ * @param cls a `json_t *` JSON array to build
+ * @param key unused
+ * @param value a `struct TMH_MerchantInstance *`
+ * @return #GNUNET_OK (continue to iterate)
*/
-#define MERCHANT_PROTOCOL_VERSION "0:0:0"
-
-
static int
add_instance (void *cls,
const struct GNUNET_HashCode *key,
void *value)
{
json_t *ja = cls;
- struct MerchantInstance *mi = value;
- char *url;
+ struct TMH_MerchantInstance *mi = value;
json_t *pta;
+ (void) key;
/* Compile array of all unique wire methods supported by this
instance */
pta = json_array ();
GNUNET_assert (NULL != pta);
- for (struct WireMethod *wm = mi->wm_head;
+ for (struct TMH_WireMethod *wm = mi->wm_head;
NULL != wm;
wm = wm->next)
{
- int duplicate = GNUNET_NO;
+ bool duplicate = false;
if (! wm->active)
break;
/* Yes, O(n^2), but really how many bank accounts can an
instance realistically have for this to matter? */
- for (struct WireMethod *pm = mi->wm_head;
+ for (struct TMH_WireMethod *pm = mi->wm_head;
pm != wm;
pm = pm->next)
if (0 == strcasecmp (pm->wire_method,
wm->wire_method))
{
- duplicate = GNUNET_YES;
+ duplicate = true;
break;
}
if (duplicate)
@@ -84,77 +68,58 @@ add_instance (void *cls,
json_array_append_new (pta,
json_string (wm->wire_method)));
}
- GNUNET_asprintf (&url,
- "/%s/",
- mi->id);
GNUNET_assert (0 ==
json_array_append_new (
ja,
json_pack (
- (NULL != mi->tip_exchange)
- ? "{s:s, s:s, s:o, s:o, s:s}"
- : "{s:s, s:s, s:o, s:o}",
+ "{s:s, s:s, s:o, s:o}",
"name",
mi->name,
- "backend_base_url",
- url,
+ "instance",
+ mi->id,
"merchant_pub",
GNUNET_JSON_from_data_auto (&mi->pubkey),
"payment_targets",
- pta,
- /* optional: */
- "tipping_exchange_baseurl",
- mi->tip_exchange)));
- GNUNET_free (url);
+ pta)));
return GNUNET_OK;
}
/**
- * Handle a "/config" request.
+ * Handle a GET "/instances" request.
*
* @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
- * @param mi merchant backend instance, never NULL
+ * @param[in,out] hc context with further information about the request
* @return MHD result code
*/
MHD_RESULT
-MH_handler_config (struct TMH_RequestHandler *rh,
- struct MHD_Connection *connection,
- void **connection_cls,
- const char *upload_data,
- size_t *upload_data_size,
- struct MerchantInstance *mi)
+TMH_private_get_instances (const struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ struct TMH_HandlerContext *hc)
{
- static struct MHD_Response *response;
-
- (void) rh;
- (void) connection_cls;
- (void) upload_data;
- (void) upload_data_size;
- (void) mi;
- if (NULL == response)
+ struct MHD_Response *response;
+ json_t *ia;
+
+ (void) hc;
+ ia = json_array ();
+ GNUNET_assert (NULL != ia);
+ GNUNET_CONTAINER_multihashmap_iterate (TMH_by_id_map,
+ &add_instance,
+ ia);
+ response = TALER_MHD_make_json_pack ("{s:o}",
+ "instances", ia);
+ GNUNET_assert (NULL != response);
{
- json_t *ia;
-
- ia = json_array ();
- GNUNET_assert (NULL != ia);
- GNUNET_CONTAINER_multihashmap_iterate (by_id_map,
- &add_instance,
- ia);
- response = TALER_MHD_make_json_pack ("{s:s, s:s, s:o}",
- "currency", TMH_currency,
- "version", MERCHANT_PROTOCOL_VERSION,
- "instances", ia);
+ MHD_RESULT ret;
+ ret = MHD_queue_response (connection,
+ MHD_HTTP_OK,
+ response);
+ MHD_destroy_response (response);
+ return ret;
}
- return MHD_queue_response (connection,
- MHD_HTTP_OK,
- response);
}
-/* end of taler-merchant-httpd_config.c */
+/* end of taler-merchant-httpd_private-get-instances.c */
diff --git a/src/backend/taler-merchant-httpd_private-get-instances.h
b/src/backend/taler-merchant-httpd_private-get-instances.h
new file mode 100644
index 0000000..e9e1e79
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_private-get-instances.h
@@ -0,0 +1,41 @@
+/*
+ This file is part of TALER
+ (C) 2019, 2020 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 backend/taler-merchant-httpd_private-get-instances.h
+ * @brief implement GET /instances
+ * @author Christian Grothoff
+ */
+#ifndef TALER_MERCHANT_HTTPD_PRIVATE_GET_INSTANCES_H
+#define TALER_MERCHANT_HTTPD_PRIVATE_GET_INSTANCES_H
+
+#include "taler-merchant-httpd.h"
+
+
+/**
+ * Handle a GET "/instances" request.
+ *
+ * @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_get_instances (const struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ struct TMH_HandlerContext *hc);
+
+/* end of taler-merchant-httpd_private-get-instances.h */
+#endif
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-merchant] branch master updated (9782a22 -> f829235), gnunet, 2020/07/05
- [taler-merchant] 01/277: first draft of new SQL logic, gnunet, 2020/07/05
- [taler-merchant] 03/277: complete first draft of new SQL schema, gnunet, 2020/07/05
- [taler-merchant] 02/277: rework merchant schema, gnunet, 2020/07/05
- [taler-merchant] 04/277: starting v1 protocol dispatching logic, gnunet, 2020/07/05
- [taler-merchant] 06/277: complete bootstrap logic in new design, gnunet, 2020/07/05
- [taler-merchant] 05/277: sketch instance loading, gnunet, 2020/07/05
- [taler-merchant] 07/277: implement GET /instances,
gnunet <=
- [taler-merchant] 09/277: implement instances_get in library, gnunet, 2020/07/05
- [taler-merchant] 11/277: implement GET /instances/, gnunet, 2020/07/05
- [taler-merchant] 08/277: support PATCH as well, gnunet, 2020/07/05
- [taler-merchant] 12/277: start on DELETE instance, gnunet, 2020/07/05
- [taler-merchant] 10/277: implement POST /instances, gnunet, 2020/07/05
- [taler-merchant] 14/277: implement PATCH, gnunet, 2020/07/05
- [taler-merchant] 13/277: implement DELETE /instances/$ID, gnunet, 2020/07/05
- [taler-merchant] 18/277: implement POST products/lock, gnunet, 2020/07/05
- [taler-merchant] 15/277: implement GET /products, gnunet, 2020/07/05
- [taler-merchant] 17/277: implement PATCH handlers, gnunet, 2020/07/05