[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant] 99/277: more work on post /transfers and the like
From: |
gnunet |
Subject: |
[taler-merchant] 99/277: more work on post /transfers and the like |
Date: |
Sun, 05 Jul 2020 20:50:12 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository merchant.
commit 1c14e3319d3f82363a3bfd935410748eb8afb597
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu May 7 20:14:02 2020 +0200
more work on post /transfers and the like
---
.../taler-merchant-httpd_post-orders-ID-pay.c | 3 +
.../taler-merchant-httpd_private-post-transfers.c | 12 +-
src/backenddb/merchant-0001.sql | 2 +-
src/backenddb/plugin_merchantdb_postgres.c | 177 ++++++++++++++++++++-
src/include/taler_merchantdb_plugin.h | 7 +-
5 files changed, 187 insertions(+), 14 deletions(-)
diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-pay.c
b/src/backend/taler-merchant-httpd_post-orders-ID-pay.c
index d76965d..ca519a9 100644
--- a/src/backend/taler-merchant-httpd_post-orders-ID-pay.c
+++ b/src/backend/taler-merchant-httpd_post-orders-ID-pay.c
@@ -537,12 +537,14 @@ begin_transaction (struct PayContext *pc);
* that no other confirmations are on the way, and can pack a response
* for the wallet
* @param hr HTTP response code details
+ * @param deposit_timestamp time when the exchange generated the deposit
confirmation
* @param exchange_sig signature from the exchange over the deposit
confirmation
* @param exchange_pub_key which key did the exchange use to create the @a
exchange_sig
*/
static void
deposit_cb (void *cls,
const struct TALER_EXCHANGE_HttpResponse *hr,
+ struct GNUNET_TIME_Absolute deposit_timestamp,
const struct TALER_ExchangeSignatureP *exchange_sig,
const struct TALER_ExchangePublicKeyP *exchange_pub)
{
@@ -643,6 +645,7 @@ deposit_cb (void *cls,
TMH_db->preflight (TMH_db->cls);
qs = TMH_db->insert_deposit (TMH_db->cls,
pc->hc->instance->settings.id,
+ deposit_timestamp,
&pc->h_contract_terms,
&dc->coin_pub,
dc->exchange_url,
diff --git a/src/backend/taler-merchant-httpd_private-post-transfers.c
b/src/backend/taler-merchant-httpd_private-post-transfers.c
index d78746c..29e5997 100644
--- a/src/backend/taler-merchant-httpd_private-post-transfers.c
+++ b/src/backend/taler-merchant-httpd_private-post-transfers.c
@@ -261,7 +261,6 @@ transfer_cleanup (void *cls)
*
* @param cls closure with our `struct PostTransfersContext *`
* @param transaction_id of the contract
- * @param coin_pub public key of the coin
* @param exchange_url URL of the exchange that issued @a coin_pub
* @param amount_with_fee amount the exchange will transfer for this coin
* @param deposit_fee fee the exchange will charge for this coin
@@ -270,14 +269,17 @@ transfer_cleanup (void *cls)
*/
static void
check_transfer (void *cls,
- const struct GNUNET_HashCode *h_contract_terms,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
const char *exchange_url,
const struct TALER_Amount *amount_with_fee,
const struct TALER_Amount *deposit_fee,
const struct TALER_Amount *refund_fee,
const struct TALER_Amount *wire_fee,
- const json_t *exchange_proof)
+ const struct GNUNET_HashCode *h_wire,
+ struct GNUNET_TIME_Absolute deposit_timestamp,
+ struct GNUNET_TIME_Absolute refund_deadline,
+ const struct TALER_ExchangeSignatureP *exchange_sig,
+ const struct TALER_ExchangePublicKeyP *exchange_pub);
+
{
struct PostTransfersContext *ptc = cls;
const struct TALER_TrackTransferDetails *ttd = ptc->current_detail;
@@ -301,7 +303,7 @@ check_transfer (void *cls,
"hint", "disagreement about deposit valuation",
"exchange_deposit_proof", exchange_proof,
"conflict_offset", (json_int_t) ptc->current_offset,
- "coin_pub", GNUNET_JSON_from_data_auto (coin_pub),
+ "coin_pub", GNUNET_JSON_from_data_auto (&ttd->coin_pub),
"h_contract_terms", GNUNET_JSON_from_data_auto (
&ttd->h_contract_terms),
"amount_with_fee", TALER_JSON_from_amount (amount_with_fee),
diff --git a/src/backenddb/merchant-0001.sql b/src/backenddb/merchant-0001.sql
index 55cef42..754b47f 100644
--- a/src/backenddb/merchant-0001.sql
+++ b/src/backenddb/merchant-0001.sql
@@ -302,7 +302,7 @@ COMMENT ON TABLE merchant_deposits
COMMENT ON COLUMN merchant_deposits.signkey_serial
IS 'Online signing key of the exchange on the deposit confirmation';
COMMENT ON COLUMN merchant_deposits.deposit_timestamp
- IS 'Time when we received the deposit confirmation from the exchange (not
rounded)';
+ IS 'Time when the exchange generated the deposit confirmation';
COMMENT ON COLUMN merchant_deposits.exchange_sig
IS 'Signature of the exchange over the deposit confirmation';
COMMENT ON COLUMN merchant_deposits.wire_fee_val
diff --git a/src/backenddb/plugin_merchantdb_postgres.c
b/src/backenddb/plugin_merchantdb_postgres.c
index acb32e9..60cbc7a 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -1683,6 +1683,7 @@ postgres_insert_exchange_signkey (
*
* @param cls closure
* @param instance_id instance to lookup deposits for
+ * @param deposit_timestamp time when the exchange generated the deposit
confirmation
* @param h_contract_terms proposal data's hashcode
* @param coin_pub public key of the coin
* @param exchange_url URL of the exchange that issued @a coin_pub
@@ -1698,6 +1699,7 @@ postgres_insert_exchange_signkey (
static enum GNUNET_DB_QueryStatus
postgres_insert_deposit (void *cls,
const char *instance_id,
+ struct GNUNET_TIME_Absolute deposit_timestamp,
const struct GNUNET_HashCode *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const char *exchange_url,
@@ -1710,11 +1712,10 @@ postgres_insert_deposit (void *cls,
const struct TALER_ExchangePublicKeyP *exchange_pub)
{
struct PostgresClosure *pg = cls;
- struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_string (instance_id),
GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
- GNUNET_PQ_query_param_absolute_time (&now), /* $3 */
+ GNUNET_PQ_query_param_absolute_time (&deposit_timestamp), /* $3 */
GNUNET_PQ_query_param_auto_from_type (coin_pub),
GNUNET_PQ_query_param_string (exchange_url),
TALER_PQ_query_param_amount (amount_with_fee), /* $6/$7 */
@@ -2557,7 +2558,7 @@ postgres_lookup_refunds_detailed (
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (instance_id),
+ GNUNET_PQ_query_param_string (instance_id),
GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
GNUNET_PQ_query_param_end
};
@@ -2960,6 +2961,173 @@ postgres_lookup_wire_fee (void *cls,
}
+/**
+ * Closure for #lookup_deposits_by_contract_and_coin_cb().
+ */
+struct LookupDepositsByCnCContext
+{
+ /**
+ * Function to call for each deposit.
+ */
+ TALER_MERCHANTDB_CoinDepositCallback cb;
+
+ /**
+ * Closure for @e cb.
+ */
+ void *cb_cls;
+
+ /**
+ * Plugin context.
+ */
+ struct PostgresClosure *pg;
+
+ /**
+ * Transaction result.
+ */
+ enum GNUNET_DB_QueryStatus qs;
+};
+
+
+/**
+ * Function to be called with the results of a SELECT statement
+ * that has returned @a num_results results.
+ *
+ * @param cls of type `struct LookupDepositsByCnCContext *`
+ * @param result the postgres result
+ * @param num_result the number of results in @a result
+ */
+static void
+lookup_deposits_by_contract_and_coin_cb (void *cls,
+ PGresult *result,
+ unsigned int num_results)
+{
+ struct LookupDepositsByCnCContext *ldcc = cls;
+ struct PostgresClosure *pg = ldcc->pg;
+
+ for (unsigned int i = 0; i<num_results; i++)
+ {
+ // WIP!
+ uint64_t refund_serial;
+ struct GNUNET_TIME_Absolute timestamp;
+ struct TALER_CoinSpendPublicKeyP coin_pub;
+ uint64_t rtransaction_id;
+ struct TALER_Amount refund_amount;
+ char *reason;
+ char *exchange_url;
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ GNUNET_PQ_result_spec_uint64 ("refund_serial",
+ &refund_serial),
+ GNUNET_PQ_result_spec_absolute_time ("refund_timestamp",
+ ×tamp),
+ GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
+ &coin_pub),
+ GNUNET_PQ_result_spec_string ("exchange_url",
+ &exchange_url),
+ GNUNET_PQ_result_spec_uint64 ("rtransaction_id",
+ &rtransaction_id),
+ GNUNET_PQ_result_spec_string ("reason",
+ &reason),
+ TALER_PQ_RESULT_SPEC_AMOUNT ("refund_amount",
+ &refund_amount),
+ GNUNET_PQ_result_spec_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_PQ_extract_result (result,
+ rs,
+ i))
+ {
+ GNUNET_break (0);
+ lrdc->qs = GNUNET_DB_STATUS_HARD_ERROR;
+ return;
+ }
+ ldcc->qs = i + 1;
+ ldcc->rc (ldcc->rc_cls,
+ ...);
+ GNUNET_PQ_cleanup_result (rs);
+ }
+}
+
+
+/**
+ * Lookup information about coin payments by @a h_contract_terms and
+ * @a coin_pub.
+ *
+ * @param cls closure
+ * @param instance_id instance to lookup payments for
+ * @param h_contract_terms proposal data's hashcode
+ * @param coin_pub public key to use for the search
+ * @param cb function to call with payment data
+ * @param cb_cls closure for @a cb
+ * @return transaction status
+ */
+static enum GNUNET_DB_QueryStatus
+postgres_lookup_deposits_by_contract_and_coin (
+ void *cls,
+ const char *instance_id,
+ const struct GNUNET_HashCode *h_contract_terms,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ TALER_MERCHANTDB_CoinDepositCallback cb,
+ void *cb_cls)
+{
+ struct PostgresClosure *pg = cls;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_string_type (instance_id),
+ GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
+ GNUNET_PQ_query_param_auto_from_type (coin_pub),
+ GNUNET_PQ_query_param_end
+ };
+ struct LookupDepositsByCnCContext ldcc = {
+ .cb = cb,
+ .cb_cls = cb_cls,
+ .pg = pg
+ };
+ enum GNUNET_DB_QueryStatus qs;
+
+ check_connection (pg);
+ qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
+
"lookup_deposits_by_contract_and_coin",
+ params,
+ &
+
lookup_deposits_by_contract_and_coin_cb,
+ &ldcc);
+ if (0 >= qs)
+ return qs;
+ return ldcc.qs;
+}
+
+
+/**
+ * Lookup transfer details.
+ *
+ * @param cls closure
+ * @param instance_id instance to lookup payments for
+ * @param exchange_url
+ * @param payto_uri
+ * @param wtid
+ * @param total_amount
+ * @param wire_fee
+ * @param execution_time
+ * @param cb function to call with detailed transfer data
+ * @param cb_cls closure for @a cb
+ * @return transaction status
+ */
+static enum GNUNET_DB_QueryStatus
+postgres_lookup_transfer_details (
+ void *cls,
+ const char *instance_id,
+ const char *exchange_url,
+ const char *payto_uri,
+ const struct TALER_WireTransferIdentifierRawP *wtid,
+ const struct TALER_Amount *total_amount,
+ const struct TALER_Amount *wire_fee,
+ struct GNUNET_TIME_Absolute execution_time,
+ TALER_MERCHANTDB_TransferDetailsCallback cb,
+ void *cb_cls)
+{
+}
+
+
/* ********************* OLD API ************************** */
/**
@@ -6181,6 +6349,9 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
plugin->lookup_account = &postgres_lookup_account;
plugin->insert_transfer_details = &postgres_insert_transfer_details;
plugin->lookup_wire_fee = &postgres_lookup_wire_fee;
+ plugin->lookup_deposits_by_contract_and_coin =
+ &postgres_lookup_deposits_by_contract_and_coin;
+ plugin->lookup_transfer_details = &postgres_lookup_transfer_details;
/* OLD API: */
plugin->store_coin_to_transfer = &postgres_store_coin_to_transfer;
diff --git a/src/include/taler_merchantdb_plugin.h
b/src/include/taler_merchantdb_plugin.h
index 51d48dc..1101e77 100644
--- a/src/include/taler_merchantdb_plugin.h
+++ b/src/include/taler_merchantdb_plugin.h
@@ -453,8 +453,6 @@ typedef void
* Function called with information about a coin that was deposited.
*
* @param cls closure
- * @param h_contract_terms proposal data's hashcode
- * @param coin_pub public key of the coin
* @param exchange_url URL of the exchange that issued the coin
* @param amount_with_fee amount the exchange will deposit for this coin
* @param deposit_fee fee the exchange will charge for this coin
@@ -466,8 +464,6 @@ typedef void
typedef void
(*TALER_MERCHANTDB_CoinDepositCallback)(
void *cls,
- const struct GNUNET_HashCode *h_contract_terms,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
const char *exchange_url,
const struct TALER_Amount *amount_with_fee,
const struct TALER_Amount *deposit_fee,
@@ -1012,6 +1008,7 @@ struct TALER_MERCHANTDB_Plugin
*
* @param cls closure
* @param instance_id instance to lookup deposits for
+ * @param deposit_timestamp time when the exchange generated the deposit
confirmation
* @param h_contract_terms proposal data's hashcode
* @param coin_pub public key of the coin
* @param exchange_url URL of the exchange that issued @a coin_pub
@@ -1026,6 +1023,7 @@ struct TALER_MERCHANTDB_Plugin
enum GNUNET_DB_QueryStatus
(*insert_deposit)(void *cls,
const char *instance_id,
+ struct GNUNET_TIME_Absolute deposit_timestamp,
const struct GNUNET_HashCode *h_contract_terms,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const char *exchange_url,
@@ -1300,7 +1298,6 @@ struct TALER_MERCHANTDB_Plugin
struct TALER_MasterSignatureP *master_sig);
- /* WIP: */
/**
* Lookup information about coin payments by @a h_contract_terms and
* @a coin_pub.
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-merchant] 97/277: integrate POST /tranfers handler, (continued)
- [taler-merchant] 97/277: integrate POST /tranfers handler, gnunet, 2020/07/05
- [taler-merchant] 105/277: API design for /transfers, gnunet, 2020/07/05
- [taler-merchant] 113/277: use unregister, gnunet, 2020/07/05
- [taler-merchant] 112/277: rename _v to _mv for merchant, gnunet, 2020/07/05
- [taler-merchant] 118/277: implement POST /reserves, gnunet, 2020/07/05
- [taler-merchant] 122/277: fixed bool casts in plugin initialization, gnunet, 2020/07/05
- [taler-merchant] 129/277: fixed coding style in db tests and double callbacks in lookup_instances, gnunet, 2020/07/05
- [taler-merchant] 131/277: towards POST tips pickup impl, gnunet, 2020/07/05
- [taler-merchant] 120/277: implement insert_reserve, gnunet, 2020/07/05
- [taler-merchant] 125/277: more work on GET /reserves logic, gnunet, 2020/07/05
- [taler-merchant] 99/277: more work on post /transfers and the like,
gnunet <=
- [taler-merchant] 93/277: updates, gnunet, 2020/07/05
- [taler-merchant] 100/277: more work on POST /transfer, gnunet, 2020/07/05
- [taler-merchant] 121/277: Merge branch 'master' into protocolV1, gnunet, 2020/07/05
- [taler-merchant] 126/277: more instance and product related tests, gnunet, 2020/07/05
- [taler-merchant] 124/277: expanding DB API, gnunet, 2020/07/05
- [taler-merchant] 128/277: more work on tipping implementation, gnunet, 2020/07/05
- [taler-merchant] 132/277: Merge branch 'protocolV1' of git+ssh://git.taler.net/merchant into protocolV1, gnunet, 2020/07/05
- [taler-merchant] 136/277: add GET /tips/ID handler, gnunet, 2020/07/05
- [taler-merchant] 138/277: wrote some db tests for orders, gnunet, 2020/07/05
- [taler-merchant] 123/277: added tests for instance creation and lookup, gnunet, 2020/07/05