merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

taler-merchant-httpd_get-private-pots.c (4009B)


      1 /*
      2   This file is part of TALER
      3   (C) 2025 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or modify it under the
      6   terms of the GNU Affero General Public License as published by the Free Software
      7   Foundation; either version 3, or (at your option) any later version.
      8 
      9   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     10   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11   A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
     12   details.
     13 
     14   You should have received a copy of the GNU Affero General Public License
     15   along with TALER; see the file COPYING.  If not, see
     16   <http://www.gnu.org/licenses/>
     17 */
     18 /**
     19  * @file taler-merchant-httpd_get-private-pots.c
     20  * @brief implementation of GET /private/pots
     21  * @author Christian Grothoff
     22  */
     23 #include "taler/platform.h"
     24 #include "taler-merchant-httpd_get-private-pots.h"
     25 #include <taler/taler_json_lib.h>
     26 
     27 
     28 /**
     29  * Sensible bound on the limit.
     30  */
     31 #define MAX_DELTA 1024
     32 
     33 
     34 /**
     35  * Callback for listing money pots.
     36  *
     37  * @param cls closure with a `json_t *`
     38  * @param money_pot_id unique identifier of the pot
     39  * @param name name of the pot
     40  * @param description human-readable description (ignored for listing)
     41  * @param pot_total_len length of the @a pot_totals array
     42  * @param pot_totals current total amounts in the pot
     43  */
     44 static void
     45 add_pot (void *cls,
     46          uint64_t money_pot_id,
     47          const char *name,
     48          size_t pot_total_len,
     49          const struct TALER_Amount *pot_totals)
     50 {
     51   json_t *pots = cls;
     52   json_t *entry;
     53 
     54   entry = GNUNET_JSON_PACK (
     55     GNUNET_JSON_pack_uint64 ("pot_serial",
     56                              money_pot_id),
     57     GNUNET_JSON_pack_string ("pot_name",
     58                              name),
     59     (0 == pot_total_len)
     60     ? GNUNET_JSON_pack_array_steal ("pot_totals",
     61                                     json_array ())
     62     : TALER_JSON_pack_amount_array ("pot_totals",
     63                                     pot_total_len,
     64                                     pot_totals));
     65   GNUNET_assert (NULL != entry);
     66   GNUNET_assert (0 ==
     67                  json_array_append_new (pots,
     68                                         entry));
     69 }
     70 
     71 
     72 MHD_RESULT
     73 TMH_private_get_pots (const struct TMH_RequestHandler *rh,
     74                       struct MHD_Connection *connection,
     75                       struct TMH_HandlerContext *hc)
     76 {
     77   int64_t limit = -20;
     78   uint64_t offset;
     79   json_t *pots;
     80 
     81   (void) rh;
     82   TALER_MHD_parse_request_snumber (connection,
     83                                    "limit",
     84                                    &limit);
     85   if (limit > 0)
     86     offset = 0;
     87   else
     88     offset = INT64_MAX;
     89   TALER_MHD_parse_request_number (connection,
     90                                   "offset",
     91                                   &offset);
     92   if ( (-MAX_DELTA > limit) ||
     93        (limit > MAX_DELTA) )
     94   {
     95     GNUNET_break_op (0);
     96     return TALER_MHD_reply_with_error (connection,
     97                                        MHD_HTTP_BAD_REQUEST,
     98                                        TALER_EC_GENERIC_PARAMETER_MALFORMED,
     99                                        "limit");
    100   }
    101 
    102   pots = json_array ();
    103   GNUNET_assert (NULL != pots);
    104   {
    105     enum GNUNET_DB_QueryStatus qs;
    106 
    107     qs = TMH_db->select_money_pots (TMH_db->cls,
    108                                     hc->instance->settings.id,
    109                                     limit,
    110                                     offset,
    111                                     &add_pot,
    112                                     pots);
    113     if (qs < 0)
    114     {
    115       GNUNET_break (0);
    116       json_decref (pots);
    117       return TALER_MHD_reply_with_error (connection,
    118                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
    119                                          TALER_EC_GENERIC_DB_FETCH_FAILED,
    120                                          "select_money_pots");
    121     }
    122   }
    123   return TALER_MHD_REPLY_JSON_PACK (
    124     connection,
    125     MHD_HTTP_OK,
    126     GNUNET_JSON_pack_array_steal ("pots",
    127                                   pots));
    128 }