Files
btcdata/src/clj/pmagnus/btcdata/web/controllers/transactions.clj
T
magnusandClaude Opus 4.6 0446d928e6 Add deposit totals API endpoint
GET /api/deposits/totals returns fiat deposited per exchange per currency
from bank_to_exchange events, aggregated via SQL.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:32:05 +01:00

54 lines
2.2 KiB
Clojure

(ns pmagnus.btcdata.web.controllers.transactions
(:require
[clojure.string :as str]
[ring.util.http-response :as response])
(:import
[java.time Instant]
[java.util UUID]))
(defn list-wallets [{:keys [query-fn]} _req]
(response/ok (query-fn :get-all-wallets {})))
(defn create-wallet! [{:keys [query-fn]} req]
(let [{:keys [name]} (:body-params req)]
(if (str/blank? name)
(response/bad-request {:error "name is required"})
(do (query-fn :insert-wallet! {:name name})
(response/created "/api/wallets" {:name name})))))
(defn get-wallet-balances [{:keys [query-fn]} _req]
(response/ok (query-fn :get-wallet-balances {})))
(defn create-event! [{:keys [query-fn]} req]
(let [params (:body-params req)
event-type (:event_type params)]
(if-not (#{"bank_to_exchange" "exchange_to_wallet" "wallet_to_wallet"} event-type)
(response/bad-request {:error "Invalid event_type"})
(let [occurred-at (if-let [ts (:occurred_at params)]
(Instant/parse ts)
(Instant/now))
row {:event-type event-type
:occurred-at occurred-at
:sats (:sats params)
:fee-sats (:fee_sats params)
:fiat-amount (:fiat_amount params)
:fiat-currency (:fiat_currency params)
:from-wallet-id (some-> (:from_wallet_id params) UUID/fromString)
:to-wallet-id (some-> (:to_wallet_id params) UUID/fromString)
:note (:note params)}]
(query-fn :insert-event! row)
(response/created "/api/events" {:status "ok"})))))
(defn get-deposit-totals [{:keys [query-fn]} _req]
(response/ok (query-fn :get-deposit-totals {})))
(defn list-events [{:keys [query-fn]} req]
(let [event-type (get-in req [:query-params "type"])]
(if event-type
(response/ok (query-fn :get-events-by-type {:event-type event-type}))
(response/ok (query-fn :get-all-events {})))))
(defn get-wallet-events [{:keys [query-fn]} req]
(let [id (UUID/fromString (get-in req [:path-params :id]))]
(response/ok (query-fn :get-events-by-wallet {:wallet-id id}))))