Files
sendico/api/server/internal/mutil/param/getter.go
Stephan D 49b86efecb
Some checks failed
ci/woodpecker/push/db Pipeline was successful
ci/woodpecker/push/fx/1 Pipeline failed
ci/woodpecker/push/nats Pipeline was successful
ci/woodpecker/push/fx/2 Pipeline failed
fx build fix
2025-11-08 00:30:29 +01:00

136 lines
3.5 KiB
Go

package mutil
import (
"net/http"
"strconv"
"github.com/go-chi/chi/v5"
"github.com/tech/sendico/pkg/mlogger"
"github.com/tech/sendico/pkg/model"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.uber.org/zap"
)
func GetParam(r *http.Request, paramName string) string {
return chi.URLParam(r, paramName)
}
func GetID(r *http.Request) string {
return GetParam(r, "id")
}
func GetAccountID(r *http.Request) string {
return GetParam(r, AccountRefName())
}
func GetObjRef(r *http.Request) string {
return GetParam(r, ObjRefName())
}
func GetOrganizationID(r *http.Request) string {
return GetParam(r, OrganizationRefName())
}
func GetOrganizationRef(r *http.Request) (primitive.ObjectID, error) {
return primitive.ObjectIDFromHex(GetOrganizationID(r))
}
func GetStatusID(r *http.Request) string {
return GetParam(r, OrganizationRefName())
}
func GetStatusRef(r *http.Request) (primitive.ObjectID, error) {
return primitive.ObjectIDFromHex(GetStatusID(r))
}
func GetProjectID(r *http.Request) string {
return GetParam(r, ProjectRefName())
}
func GetProjectRef(r *http.Request) (primitive.ObjectID, error) {
return primitive.ObjectIDFromHex(GetProjectID(r))
}
func GetInvitationID(r *http.Request) string {
return GetParam(r, InvitationRefName())
}
func GetInvitationRef(r *http.Request) (primitive.ObjectID, error) {
return primitive.ObjectIDFromHex(GetOrganizationID(r))
}
func GetToken(r *http.Request) string {
return GetParam(r, TokenName())
}
// parseFunc is a function type that parses a string to a specific type
type parseFunc[T any] func(string) (T, error)
// getOptionalParam is a generic function that handles optional query parameters
func GetOptionalParam[T any](logger mlogger.Logger, r *http.Request, key string, parse parseFunc[T]) (*T, error) {
vals := r.URL.Query()
s := vals.Get(key)
if s == "" {
return nil, nil
}
val, err := parse(s)
if err != nil {
logger.Debug("Malformed query parameter", zap.Error(err), zap.String(key, s))
return nil, err
}
return &val, nil
}
// getOptionalInt64Param gets an optional int64 query parameter
func GetOptionalInt64Param(logger mlogger.Logger, r *http.Request, key string) (*int64, error) {
return GetOptionalParam(logger, r, key, func(s string) (int64, error) {
return strconv.ParseInt(s, 10, 64)
})
}
func GetLimit(logger mlogger.Logger, r *http.Request) (*int64, error) {
return GetOptionalInt64Param(logger, r, "limit")
}
func GetOffset(logger mlogger.Logger, r *http.Request) (*int64, error) {
return GetOptionalInt64Param(logger, r, "offset")
}
func GetLimitAndOffset(logger mlogger.Logger, r *http.Request) (*int64, *int64, error) {
limit, err := GetLimit(logger, r)
if err != nil {
return nil, nil, err
}
offset, err := GetOffset(logger, r)
if err != nil {
return nil, nil, err
}
return limit, offset, nil
}
func GetOptionalBoolParam(logger mlogger.Logger, r *http.Request, key string) (*bool, error) {
return GetOptionalParam(logger, r, key, strconv.ParseBool)
}
func GetCascadeParam(logger mlogger.Logger, r *http.Request) (*bool, error) {
return GetOptionalBoolParam(logger, r, "cascade")
}
func GetArchiveParam(logger mlogger.Logger, r *http.Request) (*bool, error) {
return GetOptionalBoolParam(logger, r, "archived")
}
func GetViewCursor(logger mlogger.Logger, r *http.Request) (*model.ViewCursor, error) {
var res model.ViewCursor
var err error
if res.Limit, res.Offset, err = GetLimitAndOffset(logger, r); err != nil {
return nil, err
}
if res.IsArchived, err = GetArchiveParam(logger, r); err != nil {
return nil, err
}
return &res, nil
}