Skip to content

Commit

Permalink
feat: add order by for get orders (#17)
Browse files Browse the repository at this point in the history
* fix: order model FromAddress gorm column name

* feat: orderBy for GET /orders impl

* refactor: sort query param name
  • Loading branch information
santiagohirsch authored Mar 25, 2024
1 parent c3387b9 commit 439da4d
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 11 deletions.
6 changes: 6 additions & 0 deletions constant/order_by_constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package constant

var (
SortArray = []string{"order_id", "origin_network", "from_address", "amount", "status", "created_at", "transferred_at", "completed_at"}
DirectionArray = []string{"asc", "desc"}
)
16 changes: 15 additions & 1 deletion controllers/order_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import (
"fmt"
"math"
"net/http"
"slices"
"strconv"
"strings"
"yab-explorer/constant"
"yab-explorer/services"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -48,6 +50,8 @@ func (o OrderControllerImpl) GetOrder(c *gin.Context) {
func (o OrderControllerImpl) GetOrders(c *gin.Context) {
pageStr := c.DefaultQuery("page", "1")
pageSizeStr := c.DefaultQuery("pageSize", "10")
sortBy := c.DefaultQuery("sort", "order_id")
direction := c.DefaultQuery("direction", "desc")

page, err := strconv.Atoi(pageStr)
if err != nil {
Expand All @@ -71,7 +75,17 @@ func (o OrderControllerImpl) GetOrders(c *gin.Context) {
return
}

orders, err := o.service.GetOrders(page, pageSize)
if !slices.Contains[[]string](constant.SortArray, sortBy) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid sortBy parameter"})
return
}

if !slices.Contains[[]string](constant.DirectionArray, direction) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid direction parameter"})
return
}

orders, err := o.service.GetOrders(page, pageSize, sortBy, direction)

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get orders"})
Expand Down
2 changes: 1 addition & 1 deletion models/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ type Order struct {
OrderId int `gorm:"column:order_id;primaryKey" json:"order_id"`
OriginNetwork string `gorm:"column:origin_network;not null;primaryKey" json:"origin_network"`
RecipientAddress string `gorm:"column:recipient_address;not null;size:42" json:"recipient_address"`
FromAddress string `gorm:"column:recipient_address;not null;size:42" json:"from_address"`
FromAddress string `gorm:"column:from_address;not null;size:42" json:"from_address"`
Amount string `gorm:"column:amount;not null" json:"amount"`
Fee string `gorm:"column:fee;not null" json:"fee"`
Status string `gorm:"column:status;not null;default:PENDING" json:"status"`
Expand Down
9 changes: 5 additions & 4 deletions repository/order_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

type OrderRepository interface {
GetOrder(id int) (models.Order, error)
GetOrders(page, pageSize int) ([]models.Order, error)
GetOrders(page, pageSize int, sortBy, direction string) ([]models.Order, error)
GetTotalOrders() (int, error)
}

Expand All @@ -32,11 +32,12 @@ func (o OrderRepositoryImpl) GetOrder(id int) (models.Order, error) {
return order, nil
}

func (o OrderRepositoryImpl) GetOrders(page, pageSize int) ([]models.Order, error) {
func (o OrderRepositoryImpl) GetOrders(page, pageSize int, sortBy, direction string) ([]models.Order, error) {
var orders []models.Order
err := o.db.Limit(pageSize).Offset((page - 1) * pageSize).Order("created_at desc").Find(&orders).Error
orderByStr := sortBy + " " + direction
err := o.db.Limit(pageSize).Offset((page - 1) * pageSize).Order(orderByStr).Find(&orders).Error
if err != nil {
log.Error("Error getting orders with page: ", page, " and pageSize: ", pageSize, " in OrderRepositoryImpl. Error: ", err)
log.Error("Error getting orders with page: ", page, " and pageSize: ", pageSize, " with sortBy: ", sortBy, " and direction: ", direction, " in OrderRepositoryImpl. Error: ", err)
return nil, err
}
return orders, nil
Expand Down
10 changes: 5 additions & 5 deletions services/order_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

type OrderService interface {
GetOrder(orderId int) (models.Order, error)
GetOrders(page, pageSize int) ([]models.Order, error)
GetOrders(page, pageSize int, sortBy, direction string) ([]models.Order, error)
GetTotalOrders() (int, error)
}

Expand All @@ -31,11 +31,11 @@ func (o OrderServiceImpl) GetOrder(orderId int) (models.Order, error) {
return order, nil
}

func (o OrderServiceImpl) GetOrders(page, pageSize int) ([]models.Order, error) {
log.Info("Called GetOrders with page: ", page, " and pageSize: ", pageSize, " in OrderServiceImpl.")
orders, err := o.orderRepository.GetOrders(page, pageSize)
func (o OrderServiceImpl) GetOrders(page, pageSize int, sortBy, direction string) ([]models.Order, error) {
log.Info("Called GetOrders with page: ", page, " and pageSize: ", pageSize, " with sortBy: ", sortBy, " and direction: ", direction, " in OrderServiceImpl.")
orders, err := o.orderRepository.GetOrders(page, pageSize, sortBy, direction)
if err != nil {
log.Error("Error getting orders with page: ", page, " and pageSize: ", pageSize, " in OrderServiceImpl. Error: ", err)
log.Error("Error getting orders with page: ", page, " and pageSize: ", pageSize, " with sortBy: ", sortBy, " and direction: ", direction, " in OrderServiceImpl. Error: ", err)
return []models.Order{}, err
}
return orders, nil
Expand Down

0 comments on commit 439da4d

Please sign in to comment.