feat: added exercises handler/service/repo
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package request
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrFailedToDecodeRequestQuery = errors.New("failed to decode request query")
|
||||
ErrInvalidPageValue = errors.New("invalid value for page")
|
||||
ErrInvalidCountValue = errors.New("invalid value for count")
|
||||
)
|
||||
|
||||
func ParsePaginatedQueryParams(r *http.Request) (int, int, error) {
|
||||
ctx := r.Context()
|
||||
|
||||
pageStr := r.URL.Query().Get("page")
|
||||
if pageStr == "" {
|
||||
pageStr = "1"
|
||||
}
|
||||
countStr := r.URL.Query().Get("count")
|
||||
if countStr == "" {
|
||||
countStr = "10"
|
||||
}
|
||||
|
||||
page, err := strconv.Atoi(pageStr)
|
||||
if err != nil {
|
||||
slog.ErrorContext(ctx,
|
||||
"failed to read page from query",
|
||||
slog.String("page", pageStr))
|
||||
return 0, 0, ErrFailedToDecodeRequestQuery
|
||||
}
|
||||
|
||||
count, err := strconv.Atoi(countStr)
|
||||
if err != nil {
|
||||
slog.ErrorContext(ctx,
|
||||
"failed to read count from query",
|
||||
slog.String("count", countStr))
|
||||
return 0, 0, ErrFailedToDecodeRequestQuery
|
||||
}
|
||||
|
||||
if page < 1 {
|
||||
slog.ErrorContext(ctx,
|
||||
"page parameter is invalid",
|
||||
slog.Int("page", page))
|
||||
return 0, 0, ErrInvalidPageValue
|
||||
}
|
||||
if count <= 0 {
|
||||
slog.ErrorContext(ctx,
|
||||
"count parameter is invalid",
|
||||
slog.Int("count", count))
|
||||
return 0, 0, ErrInvalidCountValue
|
||||
}
|
||||
|
||||
return page, count, nil
|
||||
}
|
||||
Reference in New Issue
Block a user