> 백엔드 개발 > Golang > Go Huma에 필터 쿼리 매개변수 추가

Go Huma에 필터 쿼리 매개변수 추가

Patricia Arquette
풀어 주다: 2024-12-07 04:38:16
원래의
689명이 탐색했습니다.

제가 알아낸 바에 따르면, 불행히도 Huma는 다음과 같은 배열 쿼리 필터를 지원하지 않습니다. 필터를 쉼표(https://github.com/danielgtaylor/huma/issues/325)로 구분하는 예를 제공하는 Github 문제를 발견했습니다. 이것이 우리가 수행한 작업입니다.filters=postcode:eq:RM7(EX, 생성일:gt:2024-01-01

문서화 필터

단순히 구조체로 지정한 다음 문서에서 유효성을 검사하고 생성할 수 있는 본문 매개변수와 달리 필터에 대한 문서화와 유효성 검사는 별도로 수행해야 합니다.

문서는 Huma.Param 개체의 설명 속성(작업 아래)에 간단히 추가할 수 있습니다.

Parameters: []*huma.Param{{
            Name: "filters",
            In:   "query",
            Description: "Filter properties by various fields. Separate filters by comma.\n\n" +
                "Format: field:operator:value\n\n" +
                "Supported fields:\n" +
                "- postcode (operator: eq)\n" +
                "- created (operators: gt, lt, gte, lte)\n",
            Schema: &huma.Schema{
                Type: "string",
                Items: &huma.Schema{
                    Type:    "string",
                    Pattern: "^[a-zA-Z_]+:(eq|neq|gt|lt|gte|lte):[a-zA-Z0-9-:.]+$",
                },
                Examples: []any{
                    "postcode:eq:RM7 8EX",
                    "created:gt:2024-01-01",
                },
            },
            Required: false,
        }},
로그인 후 복사

Adding filter query parameters in Go Huma

이제 유효성 검사를 위해 PropertyFilterParams 구조체를 정의할 수 있습니다.

type FilterParam struct {
    Field    string
    Operator string
    Value    interface{}
}

type PropertyFilterParams struct {
    Items []FilterParam
}

func (s *PropertyFilterParams) UnmarshalText(text []byte) error {
    equalityFields := []string{"postcode"}
    greaterSmallerFields := []string{}
    dateFields := []string{"created"}

    for _, item := range strings.Split(string(text), ",") {
        filterParam, err := parseAndValidateFilterItem(item, equalityFields, greaterSmallerFields, dateFields)
        if err != nil {
            return err
        }
        s.Items = append(s.Items, filterParam)
    }

    return nil
}

func (s *PropertyFilterParams) Schema(registry huma.Registry) *huma.Schema {
    return &huma.Schema{
        Type: huma.TypeString,
    }
}

func parseAndValidateFilterItem(item string, equalityFields []string, greaterSmallerFields []string, dateFields []string) (FilterParam, error) {
    parts := strings.SplitN(item, ":", 3)

    field := parts[0]
    operator := parts[1]
    value := parts[2]

    if contains(equalityFields, field) {
        if operator != "eq" && operator != "neq" {
            return FilterParam{}, fmt.Errorf("Unsupported operator %s for field %s. Only 'eq' and 'neq' are supported.", operator, field)
        }
    } else if contains(greaterSmallerFields, field) {
        if !validation.IsValidCompareGreaterSmallerOperator(operator) {
            return FilterParam{}, fmt.Errorf("Unsupported operator %s for field %s. Supported operators: eq, neq, gt, lt, gte, lte.", operator, field)
        }
    } else if contains(dateFields, field) {
        if !validation.IsValidCompareGreaterSmallerOperator(operator) {
            return FilterParam{}, fmt.Errorf("Unsupported operator %s for field %s. Supported operators: eq, neq, gt, lt, gte, lte.", operator, field)
        }
        if !validation.IsValidDate(value) {
            return FilterParam{}, fmt.Errorf("Invalid date format: %s. Expected: YYYY-MM-DD", value)
        }
    } else {
        return FilterParam{}, fmt.Errorf("Unsupported filter field: %s", field)
    }

    return FilterParam{Field: field, Operator: operator, Value: value}, nil
}
로그인 후 복사

PropertyFilterParams를 PropertyQueryParams 구조체에 추가했습니다.

type PropertyQueryParams struct {
    PaginationParams
    Filter PropertyFilterParams `query:"filters" doc:"Filter properties by various fields"`
    Sort   PropertySortParams   `query:"sorts" doc:"Sort properties by various fields"`
}
로그인 후 복사

경로에 PropertyQueryParams를 추가하는 방법은 다음과 같습니다(필터 설명을 포함한 작업 코드 자체는 getAllPropertyOperation 아래에 있습니다. 전체 코드를 붙여넣지는 않았지만 요점을 이해하시기 바랍니다). . 유효성 검사에 실패하면 422 응답이 발생합니다. 또한 전달된 필터 값을 반복하는 방법도 추가했습니다.

huma.Register(api, getAllPropertyOperation(schema, "get-properties", "/properties", []string{"Properties"}),
        func(ctx context.Context, input *struct {
            models.Headers
            models.PropertyQueryParams
        }) (*models.MultiplePropertyOutput, error) {

            for _, filter := range input.Filter.Items {
                fmt.Println(filter)
            }

            return mockMultiplePropertyResponse(), err
        })
}
로그인 후 복사

이 글이 누군가에게 도움이 되기를 바랍니다. 더 나은 해결책을 찾았다면 댓글로 알려주세요.

위 내용은 Go Huma에 필터 쿼리 매개변수 추가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿