from dataclasses import dataclass, field from typing import Optional, List from marshmallow import validate from api import ma import marshmallow_dataclass from global_search.constants import SEARCH_ENTITY_LIMIT from services.recent_search.schemas import ProjectSearchModel, CampaignSearchModel, ArtistSearchSchema @dataclass class GlobalSearchQueryParams: query: Optional[str] = field(default=None, metadata={"validate": validate.Length(max=500)}) include_artists: Optional[bool] = field(default=True) include_campaigns: Optional[bool] = field(default=True) include_projects: Optional[bool] = field(default=True) limit: Optional[int] = field(default=SEARCH_ENTITY_LIMIT) offset: Optional[int] = field(default_factory=int) global_search_query_params = marshmallow_dataclass.class_schema(GlobalSearchQueryParams, base_schema=ma.Schema) @dataclass class GlobalSearchResponseMetadataCounts: artists: Optional[int] projects: Optional[int] campaigns: Optional[int] @dataclass class GlobalSearchResponseMetadata: counts: GlobalSearchResponseMetadataCounts @dataclass class GlobalSearchResponse: artists: List[ArtistSearchSchema] projects: List[ProjectSearchModel] campaigns: List[CampaignSearchModel] metadata: GlobalSearchResponseMetadata limit: Optional[int] = None offset: Optional[int] = None global_search_response_schema = marshmallow_dataclass.class_schema(GlobalSearchResponse, base_schema=ma.Schema)