from apollo_utils.service.exceptions import QueryParamsValidationError from apollo_utils.service.schemas.fields.list import SplitUniqueListField from flask import request from marshmallow import Schema, ValidationError, fields, validate from src.constants.core import Service class QueryParams(Schema): """ Base class for serializers that validate query string parameters. """ def load_from_request(self) -> dict: """ Parse, clean and validate query parameters from request. If serializer has List fields, corresponding query parameters are correctly parsed as lists. Returns: Dictionary with validated and cleaned query parameters. Raises: QueryParamsValidationError: If parameters validation failed. """ data = {} for field_name, field in self.fields.items(): if field.data_key: field_name = field.data_key if field_name not in request.args: continue if isinstance(field, fields.List): data[field_name] = request.args.getlist(field_name) else: data[field_name] = request.args[field_name] try: cleaned_data = self.load(data) except ValidationError as errors: raise QueryParamsValidationError(extra=errors.data) return cleaned_data class HealthCheckParams(QueryParams): """Health check endpoint params.""" include = SplitUniqueListField(fields.String(validate=validate.OneOf(Service.ALL_VALUES)), missing=[])