diff --git a/config.json b/config.json index e1d85f2..bd3e721 100644 --- a/config.json +++ b/config.json @@ -12,6 +12,6 @@ "Driver": "mysql", "User" : "sp", "Pass" : "sp", - "Schema": "goblog" + "Schema": "leanwork_pay" } } \ No newline at end of file diff --git a/config.test.json b/config.test.json index 25cd387..d19079e 100644 --- a/config.test.json +++ b/config.test.json @@ -12,6 +12,6 @@ "Driver": "mysql", "User" : "sp", "Pass" : "sp", - "Schema": "goblog" + "Schema": "leanwork_pay" } } \ No newline at end of file diff --git a/db.go b/db.go index 9f0e9a8..543f3f2 100644 --- a/db.go +++ b/db.go @@ -2,149 +2,57 @@ package main import ( "database/sql" + "fmt" "log" "net/http" - "text/template" - - _ "github.com/go-sql-driver/mysql" ) -type Employee struct { - Id int - Name string - City string +type TransactionDB struct { + h *sql.DB } -func dbConn() (db *sql.DB) { - dbDriver := Config.DB.Driver - dbUser := Config.DB.User - dbPass := Config.DB.Pass - dbName := Config.DB.Schema - db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) - if err != nil { - panic(err.Error()) - } - return db -} - -var tmpl = template.Must(template.ParseGlob("form/*")) +var db TransactionDB -func Index(w http.ResponseWriter, r *http.Request) { - db := dbConn() - selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC") +func (m *TransactionDB) conn(c AppConfig) error { + dbDriver := c.DB.Driver + dbUser := c.DB.User + dbPass := c.DB.Pass + dbName := c.DB.Schema + h, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) if err != nil { panic(err.Error()) } - emp := Employee{} - res := []Employee{} - for selDB.Next() { - var id int - var name, city string - err = selDB.Scan(&id, &name, &city) - if err != nil { - panic(err.Error()) - } - emp.Id = id - emp.Name = name - emp.City = city - res = append(res, emp) - } - tmpl.ExecuteTemplate(w, "Index", res) - defer db.Close() -} - -func Show(w http.ResponseWriter, r *http.Request) { - db := dbConn() - nId := r.URL.Query().Get("id") - selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) - if err != nil { - panic(err.Error()) - } - emp := Employee{} - for selDB.Next() { - var id int - var name, city string - err = selDB.Scan(&id, &name, &city) - if err != nil { - panic(err.Error()) - } - emp.Id = id - emp.Name = name - emp.City = city - } - tmpl.ExecuteTemplate(w, "Show", emp) - defer db.Close() + m.h = h + fmt.Printf("%x", h) + return err } -func New(w http.ResponseWriter, r *http.Request) { - tmpl.ExecuteTemplate(w, "New", nil) +func (m *TransactionDB) close() { + defer m.h.Close() } -func Edit(w http.ResponseWriter, r *http.Request) { - db := dbConn() - nId := r.URL.Query().Get("id") - selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) - if err != nil { - panic(err.Error()) - } - emp := Employee{} - for selDB.Next() { - var id int - var name, city string - err = selDB.Scan(&id, &name, &city) - if err != nil { - panic(err.Error()) - } - emp.Id = id - emp.Name = name - emp.City = city - } - tmpl.ExecuteTemplate(w, "Edit", emp) - defer db.Close() -} - -func Insert(w http.ResponseWriter, r *http.Request) { - db := dbConn() - if r.Method == "POST" { - name := r.FormValue("name") - city := r.FormValue("city") - insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)") - if err != nil { - panic(err.Error()) - } - insForm.Exec(name, city) - log.Println("INSERT: Name: " + name + " | City: " + city) +func (m *TransactionDB) addRequest(r *http.Request) error { + if err := m.conn(Config); err != nil { + return err } - defer db.Close() - http.Redirect(w, r, "/", 301) -} - -func Update(w http.ResponseWriter, r *http.Request) { - db := dbConn() - if r.Method == "POST" { - name := r.FormValue("name") - city := r.FormValue("city") - id := r.FormValue("uid") - insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?") - if err != nil { - panic(err.Error()) - } - insForm.Exec(name, city, id) - log.Println("UPDATE: Name: " + name + " | City: " + city) - } - defer db.Close() - http.Redirect(w, r, "/", 301) -} + r.ParseForm() + //assuming form has been parsed + pickupUrl := r.Form["pickupUrl"][0] + receiveUrl := r.Form["receiveUrl"][0] + signType := r.Form["signType"][0] + orderNo := r.Form["orderNo"][0] + orderAmount := r.Form["orderAmount"][0] + orderCurrency := r.Form["orderCurrency"][0] + customerId := r.Form["customerId"][0] + sign := r.Form["sign"][0] + valid := isLeanworkFormValid(r.Form) + ip4 := getClientIPLong(r) -func Delete(w http.ResponseWriter, r *http.Request) { - db := dbConn() - emp := r.URL.Query().Get("id") - delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?") - if err != nil { - panic(err.Error()) + insForm, err := m.h.Prepare("INSERT INTO request(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4) VALUES(?,?,?,?,?,?,?,?,?,?)") + if err == nil { + insForm.Exec(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4) + log.Println("INSERT: customerId: " + customerId + " | orderAmount: " + orderCurrency + " " + orderAmount) } - delForm.Exec(emp) - log.Println("DELETE") - defer db.Close() - http.Redirect(w, r, "/", 301) + m.close() + return err } diff --git a/db_crud.go b/db_crud.go new file mode 100644 index 0000000..3472148 --- /dev/null +++ b/db_crud.go @@ -0,0 +1,150 @@ +package main + +import ( + "database/sql" + "log" + "net/http" + "text/template" + + _ "github.com/go-sql-driver/mysql" +) + +type Employee struct { + Id int + Name string + City string +} + +var tmpl = template.Must(template.ParseGlob("form/*")) + +func dbConn() (db *sql.DB) { + dbDriver := Config.DB.Driver + dbUser := Config.DB.User + dbPass := Config.DB.Pass + dbName := Config.DB.Schema + db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) + if err != nil { + panic(err.Error()) + } + return db +} + +func Index(w http.ResponseWriter, r *http.Request) { + db := dbConn() + selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC") + if err != nil { + panic(err.Error()) + } + emp := Employee{} + res := []Employee{} + for selDB.Next() { + var id int + var name, city string + err = selDB.Scan(&id, &name, &city) + if err != nil { + panic(err.Error()) + } + emp.Id = id + emp.Name = name + emp.City = city + res = append(res, emp) + } + tmpl.ExecuteTemplate(w, "Index", res) + defer db.Close() +} + +func Show(w http.ResponseWriter, r *http.Request) { + db := dbConn() + nId := r.URL.Query().Get("id") + selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) + if err != nil { + panic(err.Error()) + } + emp := Employee{} + for selDB.Next() { + var id int + var name, city string + err = selDB.Scan(&id, &name, &city) + if err != nil { + panic(err.Error()) + } + emp.Id = id + emp.Name = name + emp.City = city + } + tmpl.ExecuteTemplate(w, "Show", emp) + defer db.Close() +} + +func New(w http.ResponseWriter, r *http.Request) { + tmpl.ExecuteTemplate(w, "New", nil) +} + +func Edit(w http.ResponseWriter, r *http.Request) { + db := dbConn() + nId := r.URL.Query().Get("id") + selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) + if err != nil { + panic(err.Error()) + } + emp := Employee{} + for selDB.Next() { + var id int + var name, city string + err = selDB.Scan(&id, &name, &city) + if err != nil { + panic(err.Error()) + } + emp.Id = id + emp.Name = name + emp.City = city + } + tmpl.ExecuteTemplate(w, "Edit", emp) + defer db.Close() +} + +func Insert(w http.ResponseWriter, r *http.Request) { + db := dbConn() + if r.Method == "POST" { + name := r.FormValue("name") + city := r.FormValue("city") + insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)") + if err != nil { + panic(err.Error()) + } + insForm.Exec(name, city) + log.Println("INSERT: Name: " + name + " | City: " + city) + } + defer db.Close() + http.Redirect(w, r, "/", 301) +} + +func Update(w http.ResponseWriter, r *http.Request) { + db := dbConn() + if r.Method == "POST" { + name := r.FormValue("name") + city := r.FormValue("city") + id := r.FormValue("uid") + insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?") + if err != nil { + panic(err.Error()) + } + insForm.Exec(name, city, id) + log.Println("UPDATE: Name: " + name + " | City: " + city) + } + defer db.Close() + http.Redirect(w, r, "/", 301) +} + +func Delete(w http.ResponseWriter, r *http.Request) { + db := dbConn() + emp := r.URL.Query().Get("id") + delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?") + if err != nil { + panic(err.Error()) + } + delForm.Exec(emp) + log.Println("DELETE") + defer db.Close() + http.Redirect(w, r, "/", 301) +} diff --git a/ip2long.go b/ip2long.go new file mode 100644 index 0000000..caa04ee --- /dev/null +++ b/ip2long.go @@ -0,0 +1,38 @@ +package main + +import ( + "bytes" + "encoding/binary" + "net" + "net/http" + "strconv" + "strings" +) + +func ip2Long(ip string) uint32 { + var long uint32 + binary.Read(bytes.NewBuffer(net.ParseIP(ip).To4()), binary.BigEndian, &long) + return long +} + +func backtoIP4(ipInt int64) string { + + // need to do two bit shifting and “0xff” masking + b0 := strconv.FormatInt((ipInt>>24)&0xff, 10) + b1 := strconv.FormatInt((ipInt>>16)&0xff, 10) + b2 := strconv.FormatInt((ipInt>>8)&0xff, 10) + b3 := strconv.FormatInt((ipInt & 0xff), 10) + return b0 + "." + b1 + "." + b2 + "." + b3 +} + +func getClientIP(r *http.Request) string { + //a := r.RemoteAddr // always be 127.0.0.1:300456 port number may vary + a := r.Header.Get("X-Forwarded-For") + s := strings.Split(a, ":") + return s[0] +} + +func getClientIPLong(r *http.Request) uint32 { + s := getClientIP(r) + return ip2Long(s) +} diff --git a/main.go b/main.go index 3937313..5575809 100644 --- a/main.go +++ b/main.go @@ -7,15 +7,15 @@ import ( func main() { readConfig() - log.Println("Server started on: http://localhost:8080") - //http.HandleFunc("/", StartPay) + http.HandleFunc("/", StartPay) - http.HandleFunc("/", Index) - http.HandleFunc("/show", Show) - http.HandleFunc("/new", New) - http.HandleFunc("/edit", Edit) - http.HandleFunc("/insert", Insert) - http.HandleFunc("/update", Update) - http.HandleFunc("/delete", Delete) + // http.HandleFunc("/", Index) + // http.HandleFunc("/show", Show) + // http.HandleFunc("/new", New) + // http.HandleFunc("/edit", Edit) + // http.HandleFunc("/insert", Insert) + // http.HandleFunc("/update", Update) + // http.HandleFunc("/delete", Delete) http.ListenAndServe(":8080", nil) + log.Println("Server started on: http://localhost:8080") } diff --git a/mysql-model.mwb b/mysql-model.mwb new file mode 100644 index 0000000..4908ade Binary files /dev/null and b/mysql-model.mwb differ diff --git a/purchase.go b/purchase.go index 633fd96..64cf659 100644 --- a/purchase.go +++ b/purchase.go @@ -11,7 +11,7 @@ func StartPay(w http.ResponseWriter, r *http.Request) { return } r.ParseForm() - + db.addRequest(r) if !isLeanworkFormValid(r.Form) { fmt.Fprintf(w, "invalid request") return