1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/*
This file is part of TALER
(C) 2017-2020 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU 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 a GET /tips/ID handler
* @author Christian Grothoff
*/
#include "platform.h"
#include <microhttpd.h>
#include <jansson.h>
#include <taler/taler_json_lib.h>
#include <taler/taler_signatures.h>
#include "taler-merchant-httpd.h"
#include "taler-merchant-httpd_mhd.h"
#include "taler-merchant-httpd_exchanges.h"
#include "taler-merchant-httpd_tip-pickup.h"
/**
* Manages a GET /tips/$ID call, returning the status of a tip.
*
* @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_tips_ID (const struct TMH_RequestHandler *rh,
struct MHD_Connection *connection,
struct TMH_HandlerContext *hc)
{
char *exchange_url;
struct GNUNET_HashCode tip_id;
struct TALER_Amount tip_amount;
struct TALER_Amount tip_amount_left;
struct GNUNET_TIME_Absolute timestamp;
struct GNUNET_TIME_Absolute timestamp_expire;
MHD_RESULT ret;
enum GNUNET_DB_QueryStatus qs;
GNUNET_assert (NULL != hc->infix);
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");
}
db->preflight (db->cls);
// FIXME: logic here is completely bonkers!
qs = db->lookup_tip_by_id (db->cls,
&tip_id,
&exchange_url,
&extra,
&tip_amount,
&tip_amount_left,
×tamp);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
{
unsigned int response_code;
enum TALER_ErrorCode ec;
switch (qs)
{
case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
ec = TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN;
response_code = MHD_HTTP_NOT_FOUND;
break;
case GNUNET_DB_STATUS_SOFT_ERROR:
ec = TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
case GNUNET_DB_STATUS_HARD_ERROR:
ec = TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
default:
GNUNET_break (0);
ec = TALER_EC_INTERNAL_LOGIC_ERROR;
response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
break;
}
return TALER_MHD_reply_with_error (connection,
response_code,
ec,
"Could not determine exchange URL for the given tip id");
}
timestamp_expire = GNUNET_TIME_absolute_add (timestamp,
GNUNET_TIME_UNIT_DAYS);
ret = TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_OK,
"{s:s, s:o, s:o, s:o, s:o, s:o?}",
"reason", reason,
"total_authorized", TALER_JSON_from_amount (&tip_amount),
"total_picked_up", TALER_JSON_from_amount (&tip_amount_left),
"reserve_pub", GNUNET_JSON_from_data_auto (&reserve_pub),
"expiration", GNUNET_JSON_from_time_abs (timestamp_expire),
"pickups", pickups);
GNUNET_free (exchange_url);
return ret;
}
|