From 90f7f7a64bf4ed0cf128f4b7783f53cd97b42b0a Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Thu, 23 Feb 2023 16:29:31 +1300 Subject: [PATCH 1/8] Add a new internal api call "getboltcard" --- db/db.go | 34 +++++++++++++++++++++- internalapi/getboltcard.go | 59 ++++++++++++++++++++++++++++++++++++++ main.go | 6 ++-- 3 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 internalapi/getboltcard.go diff --git a/db/db.go b/db/db.go index 0d8c17a..2b6d7cf 100644 --- a/db/db.go +++ b/db/db.go @@ -4,8 +4,9 @@ import ( "database/sql" "errors" "fmt" - _ "github.com/lib/pq" "os" + + _ "github.com/lib/pq" ) type Card struct { @@ -371,6 +372,37 @@ func Get_card_from_card_id(card_id int) (*Card, error) { return &c, nil } +func Get_card_from_card_name(card_name string) (*Card, error) { + + c := Card{} + + db, err := open() + if err != nil { + return &c, err + } + defer db.Close() + + sqlStatement := `SELECT card_id, k2_cmac_key, uid,` + + ` last_counter_value, lnurlw_request_timeout_sec,` + + ` lnurlw_enable, tx_limit_sats, day_limit_sats` + + ` FROM cards WHERE card_name=$1 AND wiped='N';` + row := db.QueryRow(sqlStatement, card_name) + err = row.Scan( + &c.Card_id, + &c.K2_cmac_key, + &c.Db_uid, + &c.Last_counter_value, + &c.Lnurlw_request_timeout_sec, + &c.Lnurlw_enable, + &c.Tx_limit_sats, + &c.Day_limit_sats) + if err != nil { + return &c, err + } + + return &c, nil +} + func Check_lnurlw_timeout(card_payment_id int) (bool, error) { db, err := open() diff --git a/internalapi/getboltcard.go b/internalapi/getboltcard.go new file mode 100644 index 0000000..9e1fa97 --- /dev/null +++ b/internalapi/getboltcard.go @@ -0,0 +1,59 @@ +package internalapi + +import ( + "net/http" + "strconv" + + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" + log "github.com/sirupsen/logrus" +) + +func Getboltcard(w http.ResponseWriter, r *http.Request) { + if db.Get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + msg := "getboltcard: internal API function is not enabled" + log.Debug(msg) + resp_err.Write_message(w, msg) + return + } + card_name := r.URL.Query().Get("card_name") + + // check if card_name exists + + card_count, err := db.Get_card_name_count(card_name) + if err != nil { + log.Warn(err.Error()) + return + } + + if card_count == 0 { + msg := "getboltcard: the card name does not exist in the database" + log.Warn(msg) + resp_err.Write_message(w, msg) + return + } + + // log the request + + log.WithFields(log.Fields{ + "card_name": card_name}).Info("getboltcard API request") + + // get the card record + + c, err := db.Get_card_from_card_name(card_name) + if err != nil { + log.Warn(err.Error()) + return + } + + jsonData := []byte(`{"status":"OK",` + + `"uid": "` + c.Db_uid + `",` + + `"last_counter_value": "` + strconv.FormatUint(uint64(c.Last_counter_value), 10) + `",` + + `"lnurlw_enable": "` + c.Lnurlw_enable + `",` + + `"tx_limit_sats": "` + strconv.Itoa(c.Tx_limit_sats) + `",` + + `"day_limit_sats": "` + strconv.Itoa(c.Day_limit_sats) + `"}`) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(jsonData) +} diff --git a/main.go b/main.go index 3456d93..7464ea1 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,15 @@ package main import ( + "net/http" + "time" + "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/internalapi" "github.com/boltcard/boltcard/lnurlp" "github.com/boltcard/boltcard/lnurlw" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" - "net/http" - "time" ) var router = mux.NewRouter() @@ -55,6 +56,7 @@ func main() { internal_router.Path("/createboltcard").Methods("GET").HandlerFunc(internalapi.Createboltcard) internal_router.Path("/updateboltcard").Methods("GET").HandlerFunc(internalapi.Updateboltcard) internal_router.Path("/wipeboltcard").Methods("GET").HandlerFunc(internalapi.Wipeboltcard) + internal_router.Path("/getboltcard").Methods("GET").HandlerFunc(internalapi.Getboltcard) port := db.Get_setting("HOST_PORT") if port == "" { From 1acbe9895a9eef8c605b238da398d200a2e29ead Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Thu, 23 Feb 2023 17:13:26 +1300 Subject: [PATCH 2/8] Update the 'updateboltcard' api call. Allow updating 'day_limit_sats' --- db/db.go | 6 +++--- internalapi/updateboltcard.go | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/db/db.go b/db/db.go index 2b6d7cf..f8c16bf 100644 --- a/db/db.go +++ b/db/db.go @@ -867,7 +867,7 @@ func Wipe_card(card_name string) (*Card_wipe_info, error) { return &card_wipe_info, nil } -func Update_card(card_name string, tx_limit_sats int, lnurlw_enable bool) error { +func Update_card(card_name string, tx_limit_sats int, day_limit_sats int, lnurlw_enable bool) error { lnurlw_enable_yn := "N" if lnurlw_enable { @@ -882,10 +882,10 @@ func Update_card(card_name string, tx_limit_sats int, lnurlw_enable bool) error defer db.Close() - sqlStatement := `UPDATE cards SET tx_limit_sats = $2, lnurlw_enable = $3 ` + + sqlStatement := `UPDATE cards SET tx_limit_sats = $2, lnurlw_enable = $3, day_limit_sats = $4 ` + `WHERE card_name = $1;` - res, err := db.Exec(sqlStatement, card_name, tx_limit_sats, lnurlw_enable_yn) + res, err := db.Exec(sqlStatement, card_name, tx_limit_sats, lnurlw_enable_yn, day_limit_sats) if err != nil { return err diff --git a/internalapi/updateboltcard.go b/internalapi/updateboltcard.go index b754456..39d83c2 100644 --- a/internalapi/updateboltcard.go +++ b/internalapi/updateboltcard.go @@ -1,11 +1,12 @@ package internalapi import ( + "net/http" + "strconv" + "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/resp_err" log "github.com/sirupsen/logrus" - "net/http" - "strconv" ) func Updateboltcard(w http.ResponseWriter, r *http.Request) { @@ -25,6 +26,15 @@ func Updateboltcard(w http.ResponseWriter, r *http.Request) { return } + day_max_str := r.URL.Query().Get("day_max") + day_max, err := strconv.Atoi(day_max_str) + if err != nil { + msg := "updateboltcard: day_max is not a valid integer" + log.Warn(msg) + resp_err.Write_message(w, msg) + return + } + enable_flag_str := r.URL.Query().Get("enable") enable_flag, err := strconv.ParseBool(enable_flag_str) if err != nil { @@ -54,12 +64,12 @@ func Updateboltcard(w http.ResponseWriter, r *http.Request) { // log the request log.WithFields(log.Fields{ - "card_name": card_name, "tx_max": tx_max, + "card_name": card_name, "tx_max": tx_max, "day_max": day_max, "enable": enable_flag}).Info("updateboltcard API request") // update the card record - err = db.Update_card(card_name, tx_max, enable_flag) + err = db.Update_card(card_name, tx_max, day_max, enable_flag) if err != nil { log.Warn(err.Error()) return From 91478af75efcd779201cf2eb4bfd03a578912eb8 Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Thu, 23 Feb 2023 17:35:12 +1300 Subject: [PATCH 3/8] Update 'Get_card_from_card_name' sql statement. Remove wiped='N' --- db/db.go | 2 +- internalapi/getboltcard.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/db/db.go b/db/db.go index f8c16bf..1dfac20 100644 --- a/db/db.go +++ b/db/db.go @@ -385,7 +385,7 @@ func Get_card_from_card_name(card_name string) (*Card, error) { sqlStatement := `SELECT card_id, k2_cmac_key, uid,` + ` last_counter_value, lnurlw_request_timeout_sec,` + ` lnurlw_enable, tx_limit_sats, day_limit_sats` + - ` FROM cards WHERE card_name=$1 AND wiped='N';` + ` FROM cards WHERE card_name=$1;` row := db.QueryRow(sqlStatement, card_name) err = row.Scan( &c.Card_id, diff --git a/internalapi/getboltcard.go b/internalapi/getboltcard.go index 9e1fa97..357b793 100644 --- a/internalapi/getboltcard.go +++ b/internalapi/getboltcard.go @@ -42,7 +42,9 @@ func Getboltcard(w http.ResponseWriter, r *http.Request) { c, err := db.Get_card_from_card_name(card_name) if err != nil { - log.Warn(err.Error()) + msg := "getboltcard: the card name does not exist in the database" + log.Warn(msg) + resp_err.Write_message(w, msg) return } From 484dd75c4417ced282aac4a9b9e3c6f8bc95991a Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Fri, 24 Feb 2023 09:12:34 +1300 Subject: [PATCH 4/8] Remove 'last_counter_value' from getboltcard api call --- sql/create_db_user.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/create_db_user.sql b/sql/create_db_user.sql index 678c8b1..88792fb 100644 --- a/sql/create_db_user.sql +++ b/sql/create_db_user.sql @@ -1,2 +1,2 @@ DROP USER cardapp; -CREATE USER cardapp WITH PASSWORD 'database_password'; \ No newline at end of file +CREATE USER cardapp WITH PASSWORD '$DB_PASSWORD'; \ No newline at end of file From 715f01d1617f808c17f30ba505baef70a3851c45 Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Fri, 24 Feb 2023 09:14:18 +1300 Subject: [PATCH 5/8] Re-order imports on the main.go - visual studio reordered automatically on save --- main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 7464ea1..4390985 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,14 @@ package main import ( - "net/http" - "time" - "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/internalapi" "github.com/boltcard/boltcard/lnurlp" "github.com/boltcard/boltcard/lnurlw" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" + "net/http" + "time" ) var router = mux.NewRouter() From f9b52cac13ca115df69542bf7f5c4b01c06688a5 Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Fri, 24 Feb 2023 09:22:17 +1300 Subject: [PATCH 6/8] re-do unnecessary changes --- db/db.go | 3 +-- internalapi/getboltcard.go | 1 - internalapi/updateboltcard.go | 6 +++--- sql/create_db_user.sql | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/db/db.go b/db/db.go index 316dceb..cd6e43a 100644 --- a/db/db.go +++ b/db/db.go @@ -4,9 +4,8 @@ import ( "database/sql" "errors" "fmt" - "os" - _ "github.com/lib/pq" + "os" ) type Card struct { diff --git a/internalapi/getboltcard.go b/internalapi/getboltcard.go index 357b793..b0d16e9 100644 --- a/internalapi/getboltcard.go +++ b/internalapi/getboltcard.go @@ -50,7 +50,6 @@ func Getboltcard(w http.ResponseWriter, r *http.Request) { jsonData := []byte(`{"status":"OK",` + `"uid": "` + c.Db_uid + `",` + - `"last_counter_value": "` + strconv.FormatUint(uint64(c.Last_counter_value), 10) + `",` + `"lnurlw_enable": "` + c.Lnurlw_enable + `",` + `"tx_limit_sats": "` + strconv.Itoa(c.Tx_limit_sats) + `",` + `"day_limit_sats": "` + strconv.Itoa(c.Day_limit_sats) + `"}`) diff --git a/internalapi/updateboltcard.go b/internalapi/updateboltcard.go index 4566681..a2d1998 100644 --- a/internalapi/updateboltcard.go +++ b/internalapi/updateboltcard.go @@ -1,12 +1,12 @@ package internalapi import ( - "net/http" - "strconv" - "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/resp_err" log "github.com/sirupsen/logrus" + "net/http" + "strconv" + ) func Updateboltcard(w http.ResponseWriter, r *http.Request) { diff --git a/sql/create_db_user.sql b/sql/create_db_user.sql index 88792fb..678c8b1 100644 --- a/sql/create_db_user.sql +++ b/sql/create_db_user.sql @@ -1,2 +1,2 @@ DROP USER cardapp; -CREATE USER cardapp WITH PASSWORD '$DB_PASSWORD'; \ No newline at end of file +CREATE USER cardapp WITH PASSWORD 'database_password'; \ No newline at end of file From 3f8863c463b55a0abd7dff540fa639b096d288da Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Fri, 24 Feb 2023 09:22:51 +1300 Subject: [PATCH 7/8] Remove spave --- internalapi/updateboltcard.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internalapi/updateboltcard.go b/internalapi/updateboltcard.go index a2d1998..ae6ea20 100644 --- a/internalapi/updateboltcard.go +++ b/internalapi/updateboltcard.go @@ -6,7 +6,6 @@ import ( log "github.com/sirupsen/logrus" "net/http" "strconv" - ) func Updateboltcard(w http.ResponseWriter, r *http.Request) { From c298bf0a3aa85e155c5a652afaa27f0dace3ef38 Mon Sep 17 00:00:00 2001 From: Chloe Jung Date: Fri, 24 Feb 2023 09:25:12 +1300 Subject: [PATCH 8/8] update docker install readme --- docs/DOCKER_INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/DOCKER_INSTALL.md b/docs/DOCKER_INSTALL.md index 33e8156..a2d87ed 100644 --- a/docs/DOCKER_INSTALL.md +++ b/docs/DOCKER_INSTALL.md @@ -58,3 +58,4 @@ Run `$ docker ps` to list containers and get container names/ids - `docker exec boltcard_main curl 'localhost:9001/createboltcard?card_name=card_5&enable=false&tx_max=1000&day_max=10000&uid_privacy=true&allow_neg_bal=true'` - `docker exec boltcard_main curl 'localhost:9001/updateboltcard?card_name=card_5&enable=true&tx_max=100&day_max=1000'` - `docker exec boltcard_main curl 'localhost:9001/wipeboltcard?card_name=card_5'` +- `docker exec boltcard_main curl 'localhost:9001/getboltcard?card_name=card_5'` \ No newline at end of file