ListFeatures implements backend.StrictServerInterface. nolint:ireturn // Expected ireturn for openapi generation.
( ctx context.Context, req backend.ListFeaturesRequestObject, )
| 29 | // ListFeatures implements backend.StrictServerInterface. |
| 30 | // nolint:ireturn // Expected ireturn for openapi generation. |
| 31 | func (s *Server) ListFeatures( |
| 32 | ctx context.Context, |
| 33 | req backend.ListFeaturesRequestObject, |
| 34 | ) (backend.ListFeaturesResponseObject, error) { |
| 35 | var cachedResponse backend.ListFeatures200JSONResponse |
| 36 | found := s.operationResponseCaches.listFeaturesCache.Lookup(ctx, req, &cachedResponse) |
| 37 | if found { |
| 38 | return cachedResponse, nil |
| 39 | } |
| 40 | |
| 41 | var node *searchtypes.SearchNode |
| 42 | if req.Params.Q != nil { |
| 43 | // Try to decode the url. |
| 44 | decodedStr, err := url.QueryUnescape(*req.Params.Q) |
| 45 | if err != nil { |
| 46 | slog.WarnContext(ctx, "unable to decode string", "input string", *req.Params.Q, "error", err) |
| 47 | |
| 48 | return backend.ListFeatures400JSONResponse{ |
| 49 | Code: http.StatusBadRequest, |
| 50 | Message: "query string cannot be decoded", |
| 51 | }, nil |
| 52 | } |
| 53 | |
| 54 | parser := searchtypes.FeaturesSearchQueryParser{} |
| 55 | node, err = parser.Parse(decodedStr) |
| 56 | if err != nil { |
| 57 | slog.WarnContext(ctx, "unable to parse query string", "query", decodedStr, "error", err) |
| 58 | |
| 59 | return backend.ListFeatures400JSONResponse{ |
| 60 | Code: http.StatusBadRequest, |
| 61 | Message: "query string does not match expected grammar", |
| 62 | }, nil |
| 63 | } |
| 64 | } |
| 65 | featurePage, err := s.wptMetricsStorer.FeaturesSearch( |
| 66 | ctx, |
| 67 | req.Params.PageToken, |
| 68 | getPageSizeOrDefault(req.Params.PageSize), |
| 69 | node, |
| 70 | req.Params.Sort, |
| 71 | getWPTMetricViewOrDefault(req.Params.WptMetricView), |
| 72 | backendtypes.DefaultBrowsers(), |
| 73 | ) |
| 74 | |
| 75 | if err != nil { |
| 76 | if errors.Is(err, backendtypes.ErrInvalidPageToken) { |
| 77 | slog.WarnContext(ctx, errMsgInvalidPageToken, "token", req.Params.PageToken, "error", err) |
| 78 | |
| 79 | return backend.ListFeatures400JSONResponse{ |
| 80 | Code: 400, |
| 81 | Message: errMsgInvalidPageToken, |
| 82 | }, nil |
| 83 | } |
| 84 | |
| 85 | if errors.Is(err, backendtypes.ErrSavedSearchNotFound) || |
| 86 | errors.Is(err, backendtypes.ErrHotlistNotFound) || |
| 87 | errors.Is(err, backendtypes.ErrSavedSearchCycleDetected) || |
| 88 | errors.Is(err, backendtypes.ErrSavedSearchMaxDepthExceeded) || |
nothing calls this directly
no test coverage detected