From f9ea943ed95c3242b72840423a065d483865f36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Jurmanovi=C4=87?= Date: Sat, 22 May 2021 16:51:05 +0200 Subject: [PATCH 1/2] added build and run cli task --- Taskfile.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 7fc7b4c..f1082e5 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,12 +1,15 @@ -version: '3' +version: "3" tasks: - build: - cmds: - - go build -o "./bin/api.exe" "./cmd/api/main.go" - run: - cmds: - - go run cmd/api/main.go - migrate: - cmds: - - go run cmd/migrate/main.go \ No newline at end of file + build: + cmds: + - go build -o "./bin/api.exe" "./cmd/api/main.go" + run: + cmds: + - go run cmd/api/main.go + migrate: + cmds: + - go run cmd/migrate/main.go + build-run: + cmds: + - go build -o "./bin/api.exe" "./cmd/api/main.go" && ./bin/api.exe From 8d4dc3ff57f12f591f223f14b6a77f29734b88aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Jurmanovi=C4=87?= Date: Sat, 22 May 2021 16:51:18 +0200 Subject: [PATCH 2/2] Added filtered GET request --- pkg/controllers/controllers.go | 35 +++++++++++++++++++++++++++++++++ pkg/controllers/transactions.go | 6 +++--- pkg/models/models.go | 14 +++++++++++++ pkg/services/services.go | 18 +++++++++++++++++ pkg/services/transactions.go | 7 ++----- pkg/utl/common/common.go | 11 +++++++++++ 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 pkg/controllers/controllers.go create mode 100644 pkg/models/models.go create mode 100644 pkg/services/services.go diff --git a/pkg/controllers/controllers.go b/pkg/controllers/controllers.go new file mode 100644 index 0000000..b42cf6d --- /dev/null +++ b/pkg/controllers/controllers.go @@ -0,0 +1,35 @@ +package controllers + +import ( + "fmt" + "strconv" + "strings" + "wallet-api/pkg/models" + "wallet-api/pkg/utl/common" + + "github.com/gin-gonic/gin" +) + +func FilteredResponse(c *gin.Context) *models.FilteredResponse { + filtered := new(models.FilteredResponse) + page, _ := c.GetQuery("page") + rpp, _ := c.GetQuery("rpp") + sortBy, _ := c.GetQuery("sortBy") + + dividers := [5]string{"|", " ", ".", "/", ","} + + for _, div := range dividers { + sortArr := strings.Split(sortBy, div) + + if len(sortArr) >= 2 { + sortBy = fmt.Sprintf("%s %s", common.ToSnakeCase(sortArr[0]), strings.ToUpper(sortArr[1])) + } + } + + filtered.Embed, _ = c.GetQuery("embed") + filtered.Page, _ = strconv.Atoi(page) + filtered.Rpp, _ = strconv.Atoi(rpp) + filtered.SortBy = sortBy + + return filtered +} diff --git a/pkg/controllers/transactions.go b/pkg/controllers/transactions.go index 3a50c19..c1971d8 100644 --- a/pkg/controllers/transactions.go +++ b/pkg/controllers/transactions.go @@ -34,10 +34,10 @@ func (wc *TransactionController) New(c *gin.Context) { } func (wc *TransactionController) GetAll(c *gin.Context) { - embed, _ := c.GetQuery("embed") + fr := FilteredResponse(c) wallet, _ := c.GetQuery("walletId") - wm := wc.TransactionService.GetAll(wallet, embed) + wc.TransactionService.GetAll(wallet, fr) - c.JSON(200, wm) + c.JSON(200, fr) } diff --git a/pkg/models/models.go b/pkg/models/models.go new file mode 100644 index 0000000..f1ab492 --- /dev/null +++ b/pkg/models/models.go @@ -0,0 +1,14 @@ +package models + +import "github.com/gin-gonic/gin" + +type FilteredResponse struct { + Items interface{} `json:"items"` + SortBy string `json:"sortBy"` + Embed string `json:"embed"` + Page int `json:"page"` + Rpp int `json:"rpp"` + TotalRecords int `json:"totalRecords"` +} + +type ResponseFunc func(*gin.Context) *[]interface{} diff --git a/pkg/services/services.go b/pkg/services/services.go new file mode 100644 index 0000000..3694de0 --- /dev/null +++ b/pkg/services/services.go @@ -0,0 +1,18 @@ +package services + +import ( + "wallet-api/pkg/models" + "wallet-api/pkg/utl/common" + + "github.com/go-pg/pg/v10" +) + +func FilteredResponse(qry *pg.Query, mdl interface{}, filtered *models.FilteredResponse) { + qry = qry.Limit(filtered.Rpp).Offset((filtered.Page - 1) * filtered.Rpp) + common.GenerateEmbed(qry, filtered.Embed) + count, err := qry.SelectAndCount() + common.CheckError(err) + + filtered.TotalRecords = count + filtered.Items = mdl +} diff --git a/pkg/services/transactions.go b/pkg/services/transactions.go index 11b25b7..2f9949f 100644 --- a/pkg/services/transactions.go +++ b/pkg/services/transactions.go @@ -2,7 +2,6 @@ package services import ( "wallet-api/pkg/models" - "wallet-api/pkg/utl/common" "github.com/go-pg/pg/v10" ) @@ -25,11 +24,9 @@ func (as *TransactionService) New(body *models.NewTransactionBody) *models.Trans return tm } -func (as *TransactionService) GetAll(walletId string, embed string) *[]models.Transaction { +func (as *TransactionService) GetAll(walletId string, filtered *models.FilteredResponse) { wm := new([]models.Transaction) query := as.Db.Model(wm).Where("? = ?", pg.Ident("wallet_id"), walletId) - common.GenerateEmbed(query, embed).Select() - - return wm + FilteredResponse(query, wm, filtered) } diff --git a/pkg/utl/common/common.go b/pkg/utl/common/common.go index 0e898b1..5f709f8 100644 --- a/pkg/utl/common/common.go +++ b/pkg/utl/common/common.go @@ -2,6 +2,8 @@ package common import ( "log" + "regexp" + "strings" ) func CheckError(err error) { @@ -9,3 +11,12 @@ func CheckError(err error) { log.Fatalf("Error occured. %v", err) } } + +var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)") +var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])") + +func ToSnakeCase(str string) string { + snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}") + snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}") + return strings.ToLower(snake) +} \ No newline at end of file