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