summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-05-22 11:19:49 +0200
committerChristian Grothoff <christian@grothoff.org>2020-05-22 11:19:49 +0200
commita006a459e5f7e5c47d8b0bf25f40f66954cc6464 (patch)
tree0ff127c8bd3d79525a1e397434ed2c4d574f18e6
parent1e6adbf5d7f192e59a1b97697731be0491c3d75c (diff)
downloadmerchant-a006a459e5f7e5c47d8b0bf25f40f66954cc6464.tar.gz
merchant-a006a459e5f7e5c47d8b0bf25f40f66954cc6464.tar.bz2
merchant-a006a459e5f7e5c47d8b0bf25f40f66954cc6464.zip
add GET /tips/ID handler
-rw-r--r--src/backend/Makefile.am2
-rw-r--r--src/backend/taler-merchant-httpd.c8
-rw-r--r--src/backend/taler-merchant-httpd_get-tips-ID.c117
-rw-r--r--src/backend/taler-merchant-httpd_get-tips-ID.h40
4 files changed, 167 insertions, 0 deletions
diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am
index 16b6ea60..1c42b7f5 100644
--- a/src/backend/Makefile.am
+++ b/src/backend/Makefile.am
@@ -24,6 +24,8 @@ taler_merchant_httpd_SOURCES = \
taler-merchant-httpd_exchanges.c taler-merchant-httpd_exchanges.h \
taler-merchant-httpd_get-orders-ID.c \
taler-merchant-httpd_get-orders-ID.h \
+ taler-merchant-httpd_get-tips-ID.c \
+ taler-merchant-httpd_get-tips-ID.h \
taler-merchant-httpd_mhd.c taler-merchant-httpd_mhd.h \
taler-merchant-httpd_private-delete-instances-ID.c \
taler-merchant-httpd_private-delete-instances-ID.h \
diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c
index b2577bd2..3a43f8e4 100644
--- a/src/backend/taler-merchant-httpd.c
+++ b/src/backend/taler-merchant-httpd.c
@@ -28,6 +28,7 @@
#include "taler-merchant-httpd_config.h"
#include "taler-merchant-httpd_exchanges.h"
#include "taler-merchant-httpd_get-orders-ID.h"
+#include "taler-merchant-httpd_get-tips-ID.h"
#include "taler-merchant-httpd_mhd.h"
#include "taler-merchant-httpd_private-delete-instances-ID.h"
#include "taler-merchant-httpd_private-delete-products-ID.h"
@@ -942,6 +943,13 @@ url_handler (void *cls,
.have_id_segment = true,
.handler = &TMH_get_orders_ID
},
+ /* GET /tips/$ID: */
+ {
+ .url_prefix = "/tips/",
+ .method = MHD_HTTP_METHOD_GET,
+ .have_id_segment = true,
+ .handler = &TMH_get_tips_ID
+ },
{
NULL
}
diff --git a/src/backend/taler-merchant-httpd_get-tips-ID.c b/src/backend/taler-merchant-httpd_get-tips-ID.c
new file mode 100644
index 00000000..fc77b2f3
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_get-tips-ID.c
@@ -0,0 +1,117 @@
+/*
+ This file is part of TALER
+ (C) 2014-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_get-tips-ID.c
+ * @brief implementation of GET /tips/$ID
+ * @author Marcello Stanisci
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <jansson.h>
+#include <taler/taler_signatures.h>
+#include <taler/taler_json_lib.h>
+#include "taler-merchant-httpd_get-tips-ID.h"
+
+
+/**
+ * Handle a GET "/tips/$ID" 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_get_tips_ID (const struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ struct TMH_HandlerContext *hc)
+{
+ struct GNUNET_HashCode tip_id;
+ enum GNUNET_DB_QueryStatus qs;
+ struct TALER_Amount total_authorized;
+ struct TALER_Amount total_picked_up;
+ struct GNUNET_TIME_Absolute expiration;
+ char *exchange_url;
+ struct TALER_ReservePrivateKeyP reserve_priv;
+
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_hash_from_string (hc->infix,
+ &tip_id))
+ {
+ /* tip_id has wrong encoding */
+ GNUNET_break_op (0);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_BAD_REQUEST,
+ TALER_EC_PARAMETER_MALFORMED,
+ "tip_id malformed");
+ }
+
+ TMH_db->preflight (TMH_db->cls);
+ qs = TMH_db->lookup_tip (TMH_db->cls,
+ hc->instance->settings.id,
+ &tip_id,
+ &total_authorized,
+ &total_picked_up,
+ &expiration,
+ &exchange_url,
+ &reserve_priv);
+ if (0 > qs)
+ {
+ /* single, read-only SQL statements should never cause
+ serialization problems */
+ GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs);
+ /* Always report on hard error as well to enable diagnostics */
+ GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_INTERNAL_SERVER_ERROR,
+ TALER_EC_GET_TIPS_DB_LOOKUP_ERROR,
+ "database error looking up contract");
+ }
+ if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Unknown tip id given: `%s'\n",
+ hc->infix);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_NOT_FOUND,
+ TALER_EC_GET_TIPS_ID_UNKNOWN,
+ "tip_id not found in database");
+ }
+
+ /* Build response */
+ {
+ MHD_RESULT ret;
+ struct TALER_Amount remaining;
+
+ GNUNET_break (0 >=
+ TALER_amount_subtract (&remaining,
+ &total_authorized,
+ &total_picked_up));
+ ret = TALER_MHD_reply_json_pack (connection,
+ MHD_HTTP_OK,
+ "{s:s, s:o, s:o, s:o}",
+ "exchange_url", exchange_url,
+ "tip_amount",
+ TALER_JSON_from_amount (&remaining),
+ "expiration",
+ GNUNET_JSON_from_time_abs (expiration));
+ GNUNET_free (exchange_url);
+ return ret;
+ }
+}
+
+
+/* end of taler-merchant-httpd_get-tips-ID.c */
diff --git a/src/backend/taler-merchant-httpd_get-tips-ID.h b/src/backend/taler-merchant-httpd_get-tips-ID.h
new file mode 100644
index 00000000..6fa0253a
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_get-tips-ID.h
@@ -0,0 +1,40 @@
+/*
+ This file is part of TALER
+ (C) 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_get-tips-ID.h
+ * @brief implementation of GET /tips/$ID
+ * @author Marcello Stanisci
+ */
+#ifndef TALER_MERCHANT_HTTPD_GET_TIPS_ID_H
+#define TALER_MERCHANT_HTTPD_GET_TIPS_ID_H
+#include <microhttpd.h>
+#include "taler-merchant-httpd.h"
+
+
+/**
+ * Handle a GET "/tips/$ID" 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_get_tips_ID (const struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ struct TMH_HandlerContext *hc);
+
+#endif