diff --git a/api.go b/api.go new file mode 100644 index 0000000..16c73a4 --- /dev/null +++ b/api.go @@ -0,0 +1,75 @@ +package main + +import ( + "net/http" + "encoding/json" + //"io/ioutil" + + //"context" + "fmt" + "log" + + _ "github.com/lib/pq" + "github.com/jmoiron/sqlx" + "github.com/go-chi/chi/v5" + "github.com/ggicci/httpin" +) + +const DEFAULT_RESULT_COUNT = 50; + +type GetTransactionPaginationInput struct { + ResultCount int `in:"query=result_count"` + PageNum int `in:"query=page_num"` +} + +func apiRouter() http.Handler { + r := chi.NewRouter() + //r.Use(ApiLoginRequired) + r.With( + httpin.NewInput(GetTransactionPaginationInput{}), + ).Get("/get_transactions", getTransactions) + r.Post("/new_transaction", newTransaction) + return r +} + +func getTransactions(w http.ResponseWriter, req *http.Request) { + db, err := sqlx.Connect("postgres", "user=rcntuser password=Devel@pmentPa$$w0rd host=10.0.0.183 dbname=Borealis sslmode=disable") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + input := req.Context().Value(httpin.Input).(*GetTransactionPaginationInput) + + if input.ResultCount == 0 { + input.ResultCount = DEFAULT_RESULT_COUNT + } + + transactions := []Transaction{} + + err = db.Select(&transactions, + "SELECT trns_id, trns_amount, trns_description, " + + "trns_account, trns_bucket, trns_date " + + "FROM rcnt.transactions ORDER BY trns_id DESC " + + fmt.Sprintf("OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", + input.PageNum, input.ResultCount)) + + for _, trns := range transactions { + //bytes, err := json.Marshal(trns) + bytes, err := json.MarshalIndent(trns, "", "\t") + if err != nil { + log.Fatal(err) + } + fmt.Fprintf(w, string(bytes)) + } +} + +func newTransaction(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "ding") + /* + body, err := ioutil.ReadAll(req.Body) + if err != nil { + log.Fatal(err) + } + */ +} diff --git a/go.mod b/go.mod index 6686461..a8470b4 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,11 @@ module nickiel.net/recount_server go 1.21.5 require ( + github.com/ggicci/httpin v0.14.2 + github.com/go-chi/chi/v5 v5.0.11 github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/shopspring/decimal v1.3.1 ) + +require github.com/ggicci/owl v0.4.0 // indirect diff --git a/go.sum b/go.sum index 9b95f85..4f1a104 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,29 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ggicci/httpin v0.14.2 h1:rGrG/OgXg3XZbRBBcqf8TSeu1nW9XX6L9F42XGhwgRQ= +github.com/ggicci/httpin v0.14.2/go.mod h1:m/RhY5rRPkNQs4VMPK66LxBX4ZMPxPyXQvrnmBEo2Y8= +github.com/ggicci/owl v0.4.0 h1:1cwRlynLe6P5ylLyjNWtOP5qVO1bYUmziPYVbOphGHQ= +github.com/ggicci/owl v0.4.0/go.mod h1:TRPWshRwYej6uES//YW5aNgLB370URwyta1Ytfs7KXs= +github.com/go-chi/chi/v5 v5.0.11 h1:BnpYbFZ3T3S1WMpD79r7R5ThWX40TaFB7L31Y8xqSwA= +github.com/go-chi/chi/v5 v5.0.11/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo= +github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/recount-server.go b/main.go similarity index 52% rename from recount-server.go rename to main.go index a148595..4313d3f 100644 --- a/recount-server.go +++ b/main.go @@ -2,18 +2,15 @@ package main import ( "database/sql" - "encoding/json" "net/http" - "errors" "fmt" "log" - "os" "time" "github.com/shopspring/decimal" - _ "github.com/lib/pq" - "github.com/jmoiron/sqlx" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" ) // "json:"json_code_name,omitempty"" (omit empty) @@ -43,43 +40,6 @@ func main() { log.SetPrefix("RecountServer: ") log.SetFlags(0) - // - db, err := sqlx.Connect("postgres", "user=rcntuser password=Devel@pmentPa$$w0rd host=10.0.0.183 dbname=Borealis sslmode=disable") - if err != nil { - log.Fatal(err) - } - log.Print("Database connected") - defer db.Close() - - // Confirm a successful connection. - if err := db.Ping(); err != nil { - log.Fatal(err) - } - log.Print("Database successfully pinged") - - transactions := []Transaction{} - err = db.Select(&transactions, "SELECT trns_id, trns_amount, trns_description, trns_account, trns_bucket, trns_date FROM rcnt.transactions ORDER BY trns_id DESC") - if err != nil { - log.Fatal(err) - } - fmt.Print(fmt.Sprintf("%+v\n", transactions)) - log.Print("Select has been run") - - for _, trns := range transactions { - if trns.Description.Valid { - //bytes, err := json.Marshal(trns) - bytes, err := json.MarshalIndent(trns, "", "\t") - if err != nil { - log.Fatal(err) - } - log.Println(string(bytes)) - } else { - log.Print("amount invalid") - } - } - - log.Print("select all run is done") - /* jsonExample := `{ "Id": 3, @@ -105,17 +65,27 @@ func main() { log.Println(trns.Amount) } */ + r := chi.NewRouter() - http.HandleFunc("/hello", hello) - //http.HandleFunc("/headers", headers) + // A good base middleware stack + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Recoverer) + r.Use(middleware.Logger) - http.ListenAndServe(":8090", nil) + // Set a timeout value on the request context (ctx), that will signal + // through ctx.Done() that the request has timed out and further + // processing should be stopped. + //r.Use(middleware.Timeout(60 * time.Second)) - if errors.Is(err, http.ErrServerClosed) { - fmt.Printf("server closed\n") - } else if err != nil { - fmt.Printf("error starting server: %s\n", err) - os.Exit(1) + r.Get("/", hello) + r.Get("/headers", headers) + r.Mount("/api", apiRouter()) + + err := http.ListenAndServe(":8090", r) + if err != nil { + log.Fatal(err) } + //fmt.Println("Hello World") }