donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit f120768d219d12a07cd3bf3ffb546bb45f20b7bf
parent 723c6ea1ee08a5ff564e53f575806381825cecce
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Mon, 11 Mar 2024 21:14:55 +0100

[donau][db] return charity id after post

Diffstat:
Msrc/donau/donau-httpd_post-charity.c | 17+++++++++++------
Msrc/donaudb/pg_insert_charity.c | 34+++++++++++++++++++++++-----------
Msrc/donaudb/pg_insert_charity.h | 3++-
Msrc/include/donau_service.h | 7++++++-
Msrc/include/donaudb_plugin.h | 3++-
Msrc/lib/donau_api_charity_post.c | 16++++++++++++++++
Msrc/testing/test_donau_api.c | 4++--
Msrc/testing/testing_api_cmd_charity_post.c | 2+-
8 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/src/donau/donau-httpd_post-charity.c b/src/donau/donau-httpd_post-charity.c @@ -44,7 +44,7 @@ struct InsertCharityContext struct TALER_Amount max_per_year; struct TALER_Amount receipts_to_date; uint64_t current_year; - + uint64_t charity_id; }; @@ -77,7 +77,8 @@ insert_charity (void *cls, icc->charity_url, &icc->max_per_year, &icc->receipts_to_date, - icc->current_year); + &icc->current_year, + &icc->charity_id); if (qs <= 0) { if (GNUNET_DB_STATUS_SOFT_ERROR != qs) @@ -150,12 +151,16 @@ DH_handler_charity_post (struct DH_RequestContext *rc, return mhd_ret; } } - return TALER_MHD_reply_static ( + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "generated charity id: %lu\n", + icc.charity_id); + + return TALER_MHD_REPLY_JSON_PACK ( rc->connection, MHD_HTTP_CREATED, - NULL, - NULL, - 0); + GNUNET_JSON_pack_uint64 ("charity-id", + icc.charity_id)); } diff --git a/src/donaudb/pg_insert_charity.c b/src/donaudb/pg_insert_charity.c @@ -17,6 +17,7 @@ * @file donaudb/pg_insert_charity.c * @brief Implementation of the insert_charity function for Postgres * @author Johannes Casaburi + * @author Lukas Matyja */ #include <taler/platform.h> #include <taler/taler_error_codes.h> @@ -25,14 +26,17 @@ #include "pg_insert_charity.h" #include "pg_helper.h" + enum GNUNET_DB_QueryStatus -DH_PG_insert_charity (void *cls, - const struct DONAU_CharityPublicKeyP *charity_pub, - const char *charity_name, - const char *charity_url, - struct TALER_Amount *max_per_year, - struct TALER_Amount *receipts_to_date, - uint64_t current_year) +DH_PG_insert_charity ( + void *cls, + const struct DONAU_CharityPublicKeyP *charity_pub, + const char *charity_name, + const char *charity_url, + struct TALER_Amount *max_per_year, + struct TALER_Amount *receipts_to_date, + uint64_t *current_year, + uint64_t *charity_id) { struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { @@ -43,10 +47,16 @@ DH_PG_insert_charity (void *cls, max_per_year), TALER_PQ_query_param_amount (pg->conn, receipts_to_date), - GNUNET_PQ_query_param_uint64 (&current_year), + GNUNET_PQ_query_param_uint64 (current_year), GNUNET_PQ_query_param_end }; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_uint64 ("charity_id", + charity_id), + GNUNET_PQ_result_spec_end + }; + PREPARE (pg, "insert_charity", "INSERT INTO charities " @@ -57,8 +67,10 @@ DH_PG_insert_charity (void *cls, ",receipts_to_date" ",current_year" ") VALUES " - "($1, $2, $3, $4, $5, $6);"); - return GNUNET_PQ_eval_prepared_non_select (pg->conn, + "($1, $2, $3, $4, $5, $6) " + "RETURNING charity_id;"); + return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "insert_charity", - params); + params, + rs); } diff --git a/src/donaudb/pg_insert_charity.h b/src/donaudb/pg_insert_charity.h @@ -45,6 +45,7 @@ DH_PG_insert_charity ( const char *charity_url, struct TALER_Amount *max_per_year, struct TALER_Amount *receipts_to_date, - uint64_t current_year); + uint64_t *current_year, + uint64_t *charity_id); #endif diff --git a/src/include/donau_service.h b/src/include/donau_service.h @@ -909,6 +909,11 @@ struct DONAU_Charity char *name; /** + * charity url + */ + char *charity_url; + + /** * public key of the charity */ struct DONAU_CharityPublicKeyP charity_pub; @@ -1096,7 +1101,7 @@ struct DONAU_PostCharityResponse /** * charity id */ - unsigned long long charity_id; + uint64_t charity_id; } ok; diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h @@ -392,7 +392,8 @@ struct DONAUDB_Plugin const char *charity_url, struct TALER_Amount *max_per_year, struct TALER_Amount *receipts_to_date, - uint64_t current_year); + uint64_t *current_year, + uint64_t *charity_id); /** * Iterate donation units. diff --git a/src/lib/donau_api_charity_post.c b/src/lib/donau_api_charity_post.c @@ -82,6 +82,7 @@ handle_charity_post_finished (void *cls, { struct DONAU_CharityPostHandle *cph = cls; const json_t *j = resp_obj; + struct DONAU_PostCharityResponse pcresp = { .hr.reply = j, .hr.http_status = (unsigned int) response_code @@ -91,6 +92,21 @@ handle_charity_post_finished (void *cls, switch (response_code) { case MHD_HTTP_CREATED: + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_uint64 ("charity-id", + &pcresp.details.ok.charity_id), + GNUNET_JSON_spec_end () + }; + if (GNUNET_OK != + GNUNET_JSON_parse (j, + spec, + NULL, + NULL)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not parse response from charity POST\n"); + GNUNET_break_op (0); + } break; case MHD_HTTP_NO_CONTENT: pcresp.hr.ec = TALER_JSON_get_error_code (j); diff --git a/src/testing/test_donau_api.c b/src/testing/test_donau_api.c @@ -95,14 +95,14 @@ run (void *cls, MHD_HTTP_CREATED), TALER_TESTING_cmd_charity_get ("get-charity-by-id", 8, - "post-charity", + "post-charity", // cmd trait reference &bearer, MHD_HTTP_OK), TALER_TESTING_cmd_charities_get ("get-charities", &bearer, MHD_HTTP_OK), // TALER_TESTING_cmd_charity_delete("delete-charity", -// 8, +// "post-charity", // cmd trait reference // &bearer, // MHD_HTTP_NO_CONTENT), /* End the suite. */ diff --git a/src/testing/testing_api_cmd_charity_post.c b/src/testing/testing_api_cmd_charity_post.c @@ -99,7 +99,7 @@ charity_status_cb (void *cls, return; } if (ss->expected_response_code == gcr->hr.http_status) - ss->charity_id = gcr->details.ok.charity_id; + ss->charity_id = (unsigned long long) gcr->details.ok.charity_id; TALER_TESTING_interpreter_next (ss->is); }