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 == "" {