feat(repo): add pagination to getallkindboxreq (#32)

Co-authored-by: mohammad mahdi rezaei <rezaei_21@yahoo.com>
Reviewed-on: ebhomengo/niki#32
Co-authored-by: mehdi <lmehdirezl@gmail.com>
Co-committed-by: mehdi <lmehdirezl@gmail.com>
This commit is contained in:
mehdi 2024-04-28 11:27:23 +00:00 committed by Alireza Mokhtari Garakani
parent 93b0f51911
commit 0d9f98a2e0
8 changed files with 109 additions and 18 deletions

View File

@ -7,16 +7,16 @@ auth:
http_server: http_server:
port: 1313 port: 1313
mysql: mariadb:
port: 3306 port: 3306
host: niki-mariadb host: localhost
db_name: niki_db db_name: niki_db
username: niki username: niki
password: nikiappt0lk2o20 password: nikiappt0lk2o20
redis: redis:
port: 6379 port: 6380
host: niki-redis host: localhost
password: "" password: ""
db: 0 db: 0

View File

@ -14,7 +14,7 @@ type HTTPServer struct {
type Config struct { type Config struct {
HTTPServer HTTPServer `koanf:"http_server"` HTTPServer HTTPServer `koanf:"http_server"`
Mysql mysql.Config `koanf:"mysql"` Mysql mysql.Config `koanf:"mariadb"`
Auth authservice.Config `koanf:"auth"` Auth authservice.Config `koanf:"auth"`
AdminAuth authservice.Config `koanf:"admin_auth"` AdminAuth authservice.Config `koanf:"admin_auth"`
Redis redis.Config `koanf:"redis"` Redis redis.Config `koanf:"redis"`

View File

@ -2,7 +2,9 @@ package adminkindboxreqhandler
import ( import (
"net/http" "net/http"
"strconv"
paginationparam "git.gocasts.ir/ebhomengo/niki/param"
param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req" param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req"
httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg" httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
echo "github.com/labstack/echo/v4" echo "github.com/labstack/echo/v4"
@ -14,7 +16,16 @@ func (h Handler) GetAll(c echo.Context) error {
return echo.NewHTTPError(http.StatusBadRequest) return echo.NewHTTPError(http.StatusBadRequest)
} }
resp, sErr := h.adminKindBoxReqSvc.GetAll(c.Request().Context(), req) var paginationReq paginationparam.PaginationRequest
// TODO : pkg convert string to uint
//nolint
pageNumber, _ := strconv.ParseUint(c.QueryParam("page_number"), 0, 64)
//nolint
pageSize, _ := strconv.ParseUint(c.QueryParam("page_size"), 0, 64)
paginationReq.PageSize = uint(pageSize)
paginationReq.PageNumber = uint(pageNumber)
resp, sErr := h.adminKindBoxReqSvc.GetAll(c.Request().Context(), req, paginationReq)
if sErr != nil { if sErr != nil {
msg, code := httpmsg.Error(sErr) msg, code := httpmsg.Error(sErr)

View File

@ -1,9 +1,13 @@
package adminkindboxreqparam package adminkindboxreqparam
import entity "git.gocasts.ir/ebhomengo/niki/entity" import (
entity "git.gocasts.ir/ebhomengo/niki/entity"
paginationparam "git.gocasts.ir/ebhomengo/niki/param"
)
type KindBoxReqGetAllRequest struct{} type KindBoxReqGetAllRequest struct{}
type KindBoxReqGetAllResponse struct { type KindBoxReqGetAllResponse struct {
AllKindBoxReq []entity.KindBoxReq AllKindBoxReq []entity.KindBoxReq
Pagination paginationparam.PaginationResponse
} }

40
param/pagination.go Normal file
View File

@ -0,0 +1,40 @@
package param
const (
defaultPageNumber = 1
dafaultPageSize = 10
)
type PaginationRequest struct {
PageSize uint
PageNumber uint
}
type PaginationResponse struct {
PageSize uint
PageNumber uint
Total uint
}
func (p *PaginationRequest) GetPageNumber() uint {
if p.PageNumber <= 0 {
p.PageNumber = defaultPageNumber
}
return p.PageNumber
}
func (p *PaginationRequest) GetOffset() uint {
return (p.GetPageNumber() - 1) * p.GetPageSize()
}
func (p *PaginationRequest) GetPageSize() uint {
validPageSizes := []uint{10, 25, 50, 100}
for _, size := range validPageSizes {
if p.PageSize == size {
return size
}
}
return dafaultPageSize
}

View File

@ -4,17 +4,40 @@ import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
paginationparam "git.gocasts.ir/ebhomengo/niki/param"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
) )
func (d DB) GetAllKindBoxReq(ctx context.Context) ([]entity.KindBoxReq, error) { func (d DB) GetAllKindBoxReq(ctx context.Context, pagination paginationparam.PaginationRequest) ([]entity.KindBoxReq, paginationparam.PaginationResponse, error) {
const op = "mysqlkindboxreq.GetAllKindBoxReq" const op = "mysqlkindboxreq.GetAllKindBoxReq"
// TODO - add sort and filter // TODO: create getCount function
rows, err := d.conn.Conn().QueryContext(ctx, "select * from kind_box_reqs") var count uint
rows, err := d.conn.Conn().QueryContext(ctx, "SELECT COUNT(*) FROM kind_box_reqs")
if err != nil { if err != nil {
return nil, return nil, paginationparam.PaginationResponse{},
richerror.New(op).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithErr(err).WithKind(richerror.KindUnexpected)
}
defer rows.Close()
// Iterate through the rows (should only be one) and extract the count:
for rows.Next() {
err := rows.Scan(&count)
if err != nil {
panic(err)
}
}
if rErr := rows.Err(); rErr != nil {
return nil, paginationparam.PaginationResponse{}, richerror.New(op).WithErr(rErr).
WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
}
// TODO - add sort and filter
rows, err = d.conn.Conn().QueryContext(ctx, "select * from kind_box_reqs limit ? offset ?", pagination.GetPageSize(), pagination.GetOffset())
if err != nil {
return nil, paginationparam.PaginationResponse{},
richerror.New(op).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithErr(err).WithKind(richerror.KindUnexpected) richerror.New(op).WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithErr(err).WithKind(richerror.KindUnexpected)
} }
@ -27,16 +50,20 @@ func (d DB) GetAllKindBoxReq(ctx context.Context) ([]entity.KindBoxReq, error) {
for rows.Next() { for rows.Next() {
kindBoxReq, sErr := scanKindBoxReq(rows) kindBoxReq, sErr := scanKindBoxReq(rows)
if sErr != nil { if sErr != nil {
return nil, richerror.New(op).WithErr(sErr). return nil, paginationparam.PaginationResponse{}, richerror.New(op).WithErr(sErr).
WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected) WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected)
} }
kindBoxReqs = append(kindBoxReqs, kindBoxReq) kindBoxReqs = append(kindBoxReqs, kindBoxReq)
} }
if rErr := rows.Err(); rErr != nil { if rErr := rows.Err(); rErr != nil {
return nil, richerror.New(op).WithErr(rErr). return nil, paginationparam.PaginationResponse{}, richerror.New(op).WithErr(rErr).
WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected) WithMessage(errmsg.ErrorMsgSomethingWentWrong).WithKind(richerror.KindUnexpected)
} }
return kindBoxReqs, nil return kindBoxReqs, paginationparam.PaginationResponse{
PageSize: pagination.GetPageSize(),
PageNumber: pagination.GetPageNumber(),
Total: count,
}, nil
} }

View File

@ -3,18 +3,26 @@ package adminkindboxreqservice
import ( import (
"context" "context"
paginationparam "git.gocasts.ir/ebhomengo/niki/param"
param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req" param "git.gocasts.ir/ebhomengo/niki/param/admin/kind_box_req"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
) )
// TODO: Pagination, Filters, Sort. // TODO: Pagination, Filters, Sort.
func (s Service) GetAll(ctx context.Context, _ param.KindBoxReqGetAllRequest) (param.KindBoxReqGetAllResponse, error) { func (s Service) GetAll(ctx context.Context, _ param.KindBoxReqGetAllRequest, paginationreq paginationparam.PaginationRequest) (param.KindBoxReqGetAllResponse, error) {
const op = "adminkindboxreqservice.GetAll" const op = "adminkindboxreqservice.GetAll"
allKindBoxReq, err := s.repo.GetAllKindBoxReq(ctx) allKindBoxReq, pagination, err := s.repo.GetAllKindBoxReq(ctx, paginationreq)
if err != nil { if err != nil {
return param.KindBoxReqGetAllResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) return param.KindBoxReqGetAllResponse{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected)
} }
return param.KindBoxReqGetAllResponse{AllKindBoxReq: allKindBoxReq}, nil return param.KindBoxReqGetAllResponse{
AllKindBoxReq: allKindBoxReq,
Pagination: paginationparam.PaginationResponse{
PageSize: pagination.PageSize,
PageNumber: pagination.PageNumber,
Total: pagination.Total,
},
}, nil
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
paginationparam "git.gocasts.ir/ebhomengo/niki/param"
) )
type Repository interface { type Repository interface {
@ -11,7 +12,7 @@ type Repository interface {
GetByID(ctx context.Context, id uint) (entity.KindBoxReq, error) GetByID(ctx context.Context, id uint) (entity.KindBoxReq, error)
RejectKindBoxReq(ctx context.Context, kindBoxReqID uint, description string) error RejectKindBoxReq(ctx context.Context, kindBoxReqID uint, description string) error
RollbackKindBoxRequestStatus(ctx context.Context, id uint) error RollbackKindBoxRequestStatus(ctx context.Context, id uint) error
GetAllKindBoxReq(ctx context.Context) ([]entity.KindBoxReq, error) GetAllKindBoxReq(ctx context.Context, pagination paginationparam.PaginationRequest) ([]entity.KindBoxReq, paginationparam.PaginationResponse, error)
} }
type Service struct { type Service struct {