diff --git a/README.org b/README.org index 30f84dc..4c45299 100644 --- a/README.org +++ b/README.org @@ -37,19 +37,13 @@ CREATE TABLE sites ( ); #+END_SRC -#+BEGIN_SRC sql :results silent -INSERT INTO sites (folder, status, due, name, sur, email, phone, code) -VALUES ('athos', 'up', '2025-08-31T20:26:58Z', 'John', 'Doe', 'john@doe', '8888-8888', 'CR'); -#+END_SRC - #+BEGIN_SRC sql SELECT * FROM sites; #+END_SRC #+RESULTS: -| id | folder | status | due | name | sur | email | phone | code | raw | -|----+-----------+--------+------------------------+------+-----+---------------------------------------+------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1 | gofitness | down | 2025-09-01 01:18:08-06 | John | Doe | sb-8kx8c32267916@personal.example.com | 5068031951 | CR | {"time": 1725175087581, "blocks": [{"id": "dGd_EGtUWN", "data": {"text": "asdfasdfasdfasdf", "level": 2}, "type": "header"}, {"id": "z9UoyyRH_4", "data": {"text": "asdfasdfasdfasdfa Hi
"}, "type": "paragraph"}], "version": "2.30.5"} | +| id | folder | status | due | name | sur | email | phone | code | raw | +|----+--------+--------+-----+------+-----+-------+-------+------+-----| ** Payments table @@ -68,11 +62,6 @@ CREATE TABLE payments ( ); #+END_SRC -#+BEGIN_SRC sql :results silent -INSERT INTO payments (capture, site, amount, currency, date, status) -VALUES ('5PS47268T4115691X', 1, 20.00, 'USD', '2024-08-30', 'COMPLETED'); -#+END_SRC - #+BEGIN_SRC sql SELECT * FROM payments; #+END_SRC @@ -103,8 +92,7 @@ SELECT * FROM changes; #+END_SRC #+RESULTS: -| id | by | site | payment | col | prev | next | date | -|----+----+------+---------+-----+------+------+------| +|---| ** Types of changes diff --git a/server/db.go b/server/db.go index 42bc70e..f67974a 100644 --- a/server/db.go +++ b/server/db.go @@ -38,11 +38,13 @@ func RegisterSitePayment(capture Capture, directory string, editorData json.RawM country string ) - id = capture.PurchaseUnits[0].Payments.Captures[0].ID - amount = capture.PurchaseUnits[0].Payments.Captures[0].Amount.Value - currency = capture.PurchaseUnits[0].Payments.Captures[0].Amount.CurrencyCode - pstatus = capture.PurchaseUnits[0].Payments.Captures[0].Status - date = capture.PurchaseUnits[0].Payments.Captures[0].CreateTime + captureData := capture.PurchaseUnits[0].Payments.Captures[0] + + id = captureData.ID + amount = captureData.Amount.Value + currency = captureData.Amount.CurrencyCode + pstatus = captureData.Status + date = captureData.CreateTime wstatus = "down" due = date.AddDate(1, 0, 0) name = capture.Payer.Name.GivenName @@ -52,32 +54,34 @@ func RegisterSitePayment(capture Capture, directory string, editorData json.RawM country = capture.Payer.Address.CountryCode var pkey int - newSite := db.QueryRow(`SELECT id FROM sites WHERE folder = $1`, directory).Scan(&pkey) + newSite := db.QueryRow(` + SELECT id FROM sites WHERE folder = $1 + `, directory).Scan(&pkey) if newSite == sql.ErrNoRows { - if err := db.QueryRow( - `INSERT INTO sites (folder, status, due, name, sur, email, phone, code, raw) + if err := db.QueryRow(` + INSERT INTO sites (folder, status, due, name, sur, email, phone, code, raw) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) - RETURNING id`, - directory, wstatus, due, + RETURNING id + `, directory, wstatus, due, name, surname, email, phone, country, editorData).Scan(&pkey); err != nil { return fmt.Errorf("%s: %v", errDBRegisterSite, err) } } else { - if err := db.QueryRow( - `UPDATE sites SET due = due + INTERVAL '1 year' + if err := db.QueryRow(` + UPDATE sites SET due = due + INTERVAL '1 year' WHERE id = $1 - RETURNING id`, - pkey).Scan(&pkey); err != nil { + RETURNING id + `, pkey).Scan(&pkey); err != nil { return fmt.Errorf("%s: %v", errDBUpdateDue, err) } } - if _, err := db.Exec( - `INSERT INTO payments (capture, site, amount, currency, date, status) - VALUES ($1, $2, $3, $4, $5, $6)`, - id, pkey, amount, currency, date, pstatus); err != nil { + if _, err := db.Exec(` + INSERT INTO payments (capture, site, amount, currency, date, status) + VALUES ($1, $2, $3, $4, $5, $6) + `, id, pkey, amount, currency, date, pstatus); err != nil { return fmt.Errorf("%s: %v", errDBRegisterPayment, err) } @@ -97,22 +101,22 @@ func UpdateSite(by string, pkey int, editorData json.RawMessage) error { }() var prev json.RawMessage - if err := tx.QueryRow( - `SELECT raw FROM sites WHERE id = $1`, - pkey).Scan(&prev); err != nil { + if err := tx.QueryRow(` + SELECT raw FROM sites WHERE id = $1 + `, pkey).Scan(&prev); err != nil { return fmt.Errorf("%s: %v", errDBGetPrevRaw, err) } - if _, err = tx.Exec( - `UPDATE sites SET raw = $1 WHERE id = $2`, - editorData, pkey); err != nil { + if _, err = tx.Exec(` + UPDATE sites SET raw = $1 WHERE id = $2 + `, editorData, pkey); err != nil { return fmt.Errorf("%s: %v", errDBUpdateRaw, err) } - if _, err = tx.Exec( - `INSERT INTO changes (by, site, payment, col, prev, next, date) - VALUES ($1, $2, NULL, 'raw', $3, $4, CURRENT_DATE);`, - by, pkey, prev, editorData); err != nil { + if _, err = tx.Exec(` + INSERT INTO changes (by, site, payment, col, prev, next, date) + VALUES ($1, $2, NULL, 'raw', $3, $4, CURRENT_DATE); + `, by, pkey, prev, editorData); err != nil { return fmt.Errorf("%s: %v", errDBChangesRaw, err) } diff --git a/server/init.go b/server/init.go index ef2b73a..bf35430 100644 --- a/server/init.go +++ b/server/init.go @@ -2,7 +2,6 @@ package main import ( "database/sql" - "log" "os" "github.com/joho/godotenv" @@ -10,25 +9,25 @@ import ( ) const ( - msgClosingDBConn = "Msg: init.go: Closing database connection" - msgDBConn = "Msg: init.go: Established database connection" - errDBConn = "Fatal: init.go: Connect to database" - errDBPing = "Fatal: init.go: Ping database" - errClosingDBConn = "Fatal: init.go: Closing database connection" + msgClosingDBConn = "Msg: init.go: Closing database connection" + msgDBConn = "Msg: init.go: Established database connection" + errDBConn = "Fatal: init.go: Connect to database" + errDBPing = "Fatal: init.go: Ping database" + errClosingDBConn = "Fatal: init.go: Closing database connection" + errMissingCredentials = "Fatal: init.go: Credentials" ) var db *sql.DB func initialize() { godotenv.Load() - if os.Getenv("BASE_URL") == "" || os.Getenv("CLIENT_ID") == "" || os.Getenv("CLIENT_SECRET") == "" || os.Getenv("RETURN_URL") == "" || os.Getenv("CANCEL_URL") == "" || os.Getenv("PORT") == "" { - log.Fatalf("Error 000: Missing credentials") + fatal(nil, errMissingCredentials) } var err error @@ -38,21 +37,21 @@ func initialize() { " password="+os.Getenv("DB_PASS")+ " dbname="+os.Getenv("DB_NAME")) if err != nil { - log.Fatalf("%s: %v", errDBConn, err) + fatal(err, errDBConn) } if err := db.Ping(); err != nil { - log.Fatalf("%s: %v", errDBPing, err) + fatal(err, errDBPing) } - log.Println(msgDBConn) + msg(msgDBConn) } func shutdown() { if db != nil { - log.Println(msgClosingDBConn) + msg(msgClosingDBConn) if err := db.Close(); err != nil { - log.Fatalf("%s: %v", errClosingDBConn, err) + fatal(err, errClosingDBConn) } } } diff --git a/server/main.go b/server/main.go index 3f428f1..4a2058a 100644 --- a/server/main.go +++ b/server/main.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "io" "log" "net/http" "os" @@ -36,7 +35,7 @@ func main() { port := os.Getenv("PORT") go func() { - log.Println(msgServerStart + ": " + port + "...") + msg(msgServerStart + ": " + port + "...") if err := http.ListenAndServe(":"+port, nil); err != nil { fatal(err, errServerStart) } @@ -45,7 +44,11 @@ func main() { <-stop shutdown() - log.Println(msgServerShutdown) + msg(msgServerShutdown) +} + +func msg(notice string) { + log.Println(notice) } func fail(w http.ResponseWriter, err error, notice string) { @@ -76,28 +79,20 @@ func CreateOrderHandler(w http.ResponseWriter, r *http.Request) { } func CaptureOrderHandler(w http.ResponseWriter, r *http.Request) { - info, err := io.ReadAll(r.Body) - if err != nil { - fail(w, err, errReadBody) - return - } var cart struct { Directory string `json:"directory"` EditorData json.RawMessage `json:"editor_data"` } - err = json.Unmarshal(info, &cart) - if err != nil { - fail(w, err, errParseBody) + if err := json.NewDecoder(r.Body).Decode(&cart); err != nil { + fail(w, err, errReadBody) return } - directory := cart.Directory - editorData := cart.EditorData path := strings.TrimPrefix(r.URL.Path, "/api/orders/") parts := strings.Split(path, "/") orderID := parts[0] if orderID == "" { - fail(w, err, errGetOrderID) + fail(w, nil, errGetOrderID) return } @@ -107,8 +102,8 @@ func CaptureOrderHandler(w http.ResponseWriter, r *http.Request) { return } - if err := RegisterSitePayment(capture, directory, editorData); err != nil { - fail(w, err, errRegisterSite+": "+directory) + if err := RegisterSitePayment(capture, cart.Directory, cart.EditorData); err != nil { + fail(w, err, errRegisterSite+": "+cart.Directory) return } diff --git a/server/paypal.go b/server/paypal.go index 3166ccd..970712a 100644 --- a/server/paypal.go +++ b/server/paypal.go @@ -7,7 +7,6 @@ import ( "io" "net/http" "os" - "strings" "time" ) @@ -72,7 +71,7 @@ type Receipt struct { func Token() (string, error) { req, err := http.NewRequest("POST", os.Getenv("BASE_URL")+"/v1/oauth2/token", - strings.NewReader(`grant_type=client_credentials`)) + bytes.NewBufferString(`grant_type=client_credentials`)) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.SetBasicAuth(os.Getenv("CLIENT_ID"), os.Getenv("CLIENT_SECRET")) @@ -85,7 +84,6 @@ func Token() (string, error) { var response struct { AccessToken string `json:"access_token"` } - if err := json.NewDecoder(raw.Body).Decode(&response); err != nil { return "", fmt.Errorf("%s: %v", errTokenResp, err) } @@ -191,11 +189,11 @@ func CaptureOrder(orderID string) (Capture, Receipt, error) { return Capture{}, Receipt{}, fmt.Errorf("%s: %v", errCaptureOrderResp, err) } - if err := json.NewDecoder(bytes.NewReader(body)).Decode(&capture); err != nil { + if err := json.Unmarshal(body, &capture); err != nil { return Capture{}, Receipt{}, fmt.Errorf("%s: %v", errCaptureOrderDecodeCapture, err) } - if err := json.NewDecoder(bytes.NewReader(body)).Decode(&receipt); err != nil { + if err := json.Unmarshal(body, &receipt); err != nil { return Capture{}, Receipt{}, fmt.Errorf("%s: %v", errCaptureOrderDecodeReceipt, err) }