feat: random sort option for front page (#2363)

* Add hook for random sorting

* Add random sorting to front page

* Add multiple tests for random sorting.

* Be extra sure that all recipes are returned.

* Too stable random. seed doesn't reach backend.

* add timestamp to useRecipeSearch

* Update randomization tests for timestamp seeding

* ruff cleanup

* pass timestamp separately in getAll

* remove debugging log items

* remove timestamp from address bar

* remove defaults from backend timestamps

* timestamp should be optional

* fix edge case: query without timestamp

* similar edge case: no timestamp in pagination

* ruff :/

* better edge case handling

* stabilize random search test w/more recipes

* better pagination seeding

* update pagination seed test

* remove redundant random/seed check

* Test for api routes to random sorting.

* please the typing gods

* hack to make query parameters throw correct exc

* ruff

* fix validator message typo

* black reformatting

---------

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
This commit is contained in:
Jacob Corn
2023-05-30 02:56:20 +02:00
committed by GitHub
parent 7e0d29afc7
commit e1d3a247c7
10 changed files with 202 additions and 7 deletions

View File

@@ -3,7 +3,7 @@ from typing import Any, Generic, TypeVar
from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
from humps import camelize
from pydantic import UUID4, BaseModel
from pydantic import UUID4, BaseModel, validator
from pydantic.generics import GenericModel
from mealie.schema._mealie import MealieModel
@@ -23,6 +23,7 @@ class RecipeSearchQuery(MealieModel):
require_all_tools: bool = False
require_all_foods: bool = False
search: str | None
_search_seed: str | None = None
class PaginationQuery(MealieModel):
@@ -31,6 +32,13 @@ class PaginationQuery(MealieModel):
order_by: str = "created_at"
order_direction: OrderDirection = OrderDirection.desc
query_filter: str | None = None
pagination_seed: str | None = None
@validator("pagination_seed", always=True, pre=True)
def validate_randseed(cls, pagination_seed, values):
if values.get("order_by") == "random" and not pagination_seed:
raise ValueError("paginationSeed is required when orderBy is random")
return pagination_seed
class PaginationBase(GenericModel, Generic[DataT]):