제가 알아낸 바에 따르면, 불행히도 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, }},
이제 유효성 검사를 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!