2021-03-23 11:48:05 +01:00
|
|
|
// Copyright (c) Mainflux
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2022-03-03 17:13:46 +01:00
|
|
|
package apiutil
|
2021-03-23 11:48:05 +01:00
|
|
|
|
|
|
|
import (
|
2022-03-03 17:13:46 +01:00
|
|
|
"context"
|
2021-03-23 11:48:05 +01:00
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
|
2022-03-03 17:13:46 +01:00
|
|
|
kithttp "github.com/go-kit/kit/transport/http"
|
2021-03-23 11:48:05 +01:00
|
|
|
"github.com/go-zoo/bone"
|
2022-03-03 17:13:46 +01:00
|
|
|
"github.com/mainflux/mainflux/logger"
|
2021-03-23 11:48:05 +01:00
|
|
|
"github.com/mainflux/mainflux/pkg/errors"
|
|
|
|
)
|
|
|
|
|
2022-03-03 17:13:46 +01:00
|
|
|
// LoggingErrorEncoder is a go-kit error encoder logging decorator.
|
|
|
|
func LoggingErrorEncoder(logger logger.Logger, enc kithttp.ErrorEncoder) kithttp.ErrorEncoder {
|
|
|
|
return func(ctx context.Context, err error, w http.ResponseWriter) {
|
|
|
|
switch err {
|
|
|
|
case ErrBearerToken,
|
|
|
|
ErrMissingID,
|
|
|
|
ErrBearerKey,
|
|
|
|
ErrInvalidAuthKey,
|
|
|
|
ErrInvalidIDFormat,
|
|
|
|
ErrNameSize,
|
|
|
|
ErrLimitSize,
|
|
|
|
ErrOffsetSize,
|
|
|
|
ErrInvalidOrder,
|
|
|
|
ErrInvalidDirection,
|
|
|
|
ErrEmptyList,
|
|
|
|
ErrMalformedPolicy,
|
|
|
|
ErrMissingPolicySub,
|
|
|
|
ErrMissingPolicyObj,
|
|
|
|
ErrMissingPolicyAct,
|
|
|
|
ErrMissingCertData,
|
|
|
|
ErrInvalidTopic,
|
|
|
|
ErrInvalidContact,
|
|
|
|
ErrMissingEmail,
|
|
|
|
ErrMissingHost,
|
|
|
|
ErrMissingPass,
|
|
|
|
ErrMissingConfPass,
|
|
|
|
ErrInvalidResetPass,
|
|
|
|
ErrInvalidComparator,
|
|
|
|
ErrMissingMemberType,
|
|
|
|
ErrInvalidAPIKey,
|
|
|
|
ErrMaxLevelExceeded,
|
|
|
|
ErrBootstrapState:
|
|
|
|
logger.Error(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
enc(ctx, err, w)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-23 11:48:05 +01:00
|
|
|
// ReadUintQuery reads the value of uint64 http query parameters for a given key
|
|
|
|
func ReadUintQuery(r *http.Request, key string, def uint64) (uint64, error) {
|
|
|
|
vals := bone.GetQuery(r, key)
|
|
|
|
if len(vals) > 1 {
|
|
|
|
return 0, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(vals) == 0 {
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
strval := vals[0]
|
|
|
|
val, err := strconv.ParseUint(strval, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
return 0, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
return val, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadStringQuery reads the value of string http query parameters for a given key
|
|
|
|
func ReadStringQuery(r *http.Request, key string, def string) (string, error) {
|
|
|
|
vals := bone.GetQuery(r, key)
|
|
|
|
if len(vals) > 1 {
|
|
|
|
return "", errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(vals) == 0 {
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return vals[0], nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadMetadataQuery reads the value of json http query parameters for a given key
|
|
|
|
func ReadMetadataQuery(r *http.Request, key string, def map[string]interface{}) (map[string]interface{}, error) {
|
|
|
|
vals := bone.GetQuery(r, key)
|
|
|
|
if len(vals) > 1 {
|
|
|
|
return nil, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(vals) == 0 {
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
m := make(map[string]interface{})
|
|
|
|
err := json.Unmarshal([]byte(vals[0]), &m)
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(errors.ErrInvalidQueryParams, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return m, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadBoolQuery reads boolean query parameters in a given http request
|
|
|
|
func ReadBoolQuery(r *http.Request, key string, def bool) (bool, error) {
|
|
|
|
vals := bone.GetQuery(r, key)
|
|
|
|
if len(vals) > 1 {
|
|
|
|
return false, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(vals) == 0 {
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := strconv.ParseBool(vals[0])
|
|
|
|
if err != nil {
|
|
|
|
return false, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
return b, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadFloatQuery reads the value of float64 http query parameters for a given key
|
|
|
|
func ReadFloatQuery(r *http.Request, key string, def float64) (float64, error) {
|
|
|
|
vals := bone.GetQuery(r, key)
|
|
|
|
if len(vals) > 1 {
|
|
|
|
return 0, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(vals) == 0 {
|
|
|
|
return def, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
fval := vals[0]
|
|
|
|
val, err := strconv.ParseFloat(fval, 64)
|
|
|
|
if err != nil {
|
|
|
|
return 0, errors.ErrInvalidQueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
return val, nil
|
|
|
|
}
|