fakebank_tbi_get_withdrawal_operation.c (4782B)
1 /* 2 This file is part of TALER 3 (C) 2016-2023 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or 6 modify it under the terms of the GNU General Public License 7 as published by the Free Software Foundation; either version 3, 8 or (at your option) any later version. 9 10 TALER is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public 16 License along with TALER; see the file COPYING. If not, 17 see <http://www.gnu.org/licenses/> 18 */ 19 /** 20 * @file bank-lib/fakebank_tbi_get_withdrawal_operation.c 21 * @brief Implementation of the GET /withdrawal-operation/ request of the Taler Bank Integration API 22 * @author Christian Grothoff <christian@grothoff.org> 23 */ 24 #include <pthread.h> 25 #include "taler/taler_fakebank_lib.h" 26 #include "taler/taler_bank_service.h" 27 #include "taler/taler_mhd_lib.h" 28 #include <gnunet/gnunet_mhd_compat.h> 29 #include "fakebank.h" 30 #include "fakebank_common_lookup.h" 31 #include "fakebank_common_lp.h" 32 #include "fakebank_tbi_get_withdrawal_operation.h" 33 34 /** 35 * Function called to clean up a withdraw context. 36 * 37 * @param cls a `struct WithdrawContext *` 38 */ 39 static void 40 withdraw_cleanup (void *cls) 41 { 42 struct WithdrawContext *wc = cls; 43 44 GNUNET_free (wc); 45 } 46 47 48 MHD_RESULT 49 TALER_FAKEBANK_tbi_get_withdrawal_operation_ ( 50 struct TALER_FAKEBANK_Handle *h, 51 struct MHD_Connection *connection, 52 const char *wopid, 53 struct GNUNET_TIME_Relative lp, 54 void **con_cls) 55 { 56 struct ConnectionContext *cc = *con_cls; 57 struct WithdrawContext *wc; 58 const char *status_string; 59 60 GNUNET_assert (0 == 61 pthread_mutex_lock (&h->big_lock)); 62 if (NULL == cc) 63 { 64 cc = GNUNET_new (struct ConnectionContext); 65 cc->ctx_cleaner = &withdraw_cleanup; 66 *con_cls = cc; 67 wc = GNUNET_new (struct WithdrawContext); 68 cc->ctx = wc; 69 wc->wo = TALER_FAKEBANK_lookup_withdrawal_operation_ (h, 70 wopid); 71 if (NULL == wc->wo) 72 { 73 GNUNET_assert (0 == 74 pthread_mutex_unlock (&h->big_lock)); 75 return TALER_MHD_reply_with_error (connection, 76 MHD_HTTP_NOT_FOUND, 77 TALER_EC_BANK_TRANSACTION_NOT_FOUND, 78 wopid); 79 } 80 wc->timeout = GNUNET_TIME_relative_to_absolute (lp); 81 } 82 else 83 { 84 wc = cc->ctx; 85 } 86 if (GNUNET_TIME_absolute_is_past (wc->timeout) || 87 h->in_shutdown || 88 wc->wo->confirmation_done || 89 wc->wo->aborted) 90 { 91 json_t *wt; 92 93 wt = json_array (); 94 GNUNET_assert (NULL != wt); 95 GNUNET_assert (0 == 96 json_array_append_new (wt, 97 json_string ("x-taler-bank"))); 98 GNUNET_assert (0 == 99 pthread_mutex_unlock (&h->big_lock)); 100 if (wc->wo->aborted) 101 status_string = "aborted"; 102 else if (wc->wo->confirmation_done) 103 status_string = "confirmed"; 104 else if (wc->wo->selection_done) 105 status_string = "selected"; 106 else 107 status_string = "pending"; 108 return TALER_MHD_REPLY_JSON_PACK ( 109 connection, 110 MHD_HTTP_OK, 111 // FIXME: deprecated field, should be removed in the future. 112 GNUNET_JSON_pack_bool ("aborted", 113 wc->wo->aborted), 114 // FIXME: deprecated field, should be removed in the future. 115 GNUNET_JSON_pack_bool ("selection_done", 116 wc->wo->selection_done), 117 // FIXME: deprecated field, should be removed in the future. 118 GNUNET_JSON_pack_bool ("transfer_done", 119 wc->wo->confirmation_done), 120 GNUNET_JSON_pack_string ("status", 121 status_string), 122 GNUNET_JSON_pack_string ("sender_wire", 123 wc->wo->debit_account->payto_uri), 124 GNUNET_JSON_pack_allow_null ( 125 GNUNET_JSON_pack_string ("suggested_exchange", 126 h->exchange_url)), 127 GNUNET_JSON_pack_allow_null ( 128 TALER_JSON_pack_amount ("amount", 129 wc->wo->amount)), 130 GNUNET_JSON_pack_array_steal ("wire_types", 131 wt)); 132 } 133 134 TALER_FAKEBANK_start_lp_ (h, 135 connection, 136 wc->wo->debit_account, 137 GNUNET_TIME_absolute_get_remaining (wc->timeout), 138 LP_WITHDRAW, 139 wc->wo); 140 GNUNET_assert (0 == 141 pthread_mutex_unlock (&h->big_lock)); 142 return MHD_YES; 143 }