"""Request helper methods.""" import re from flask import request from abacus_contract.constants.constants import DEFAULT_PAGE_LIMIT, DEFAULT_PAGE_OFFSET from abacus_contract.constants.error import ERROR_INVALID_LIMIT_OFFSET _LIKE_WILDCARD_RE = re.compile(r'([\\%_])') def escape_like_pattern(search_term: str) -> str: r"""Escape MySQL LIKE wildcards (``\``, ``%``, ``_``) in user-supplied search input. Without this, ``search_term=%`` matches every row and ``search_term=foo_bar`` matches ``foobar``. Mirrors ``abacus_account.models.Account``'s private helper at module scope so other endpoints can reuse it. """ return _LIKE_WILDCARD_RE.sub(r'\\\1', str(search_term)) def get_optional_numeric_list_from_params(optional: bool = False): """Get contract_ids from request params and validate them.""" optional_params = request.json if not optional_params: if optional: return raise ValueError() return [int(param) for param in optional_params] def validate_pagination_params( limit: int = DEFAULT_PAGE_LIMIT, offset: int = DEFAULT_PAGE_OFFSET ) -> dict: """Format and validate pagination parameters.""" try: limit = int(limit) offset = int(offset) except ValueError: raise Exception(ERROR_INVALID_LIMIT_OFFSET) pagination_params = { 'limit': max(limit, 1), 'offset': max(offset, DEFAULT_PAGE_OFFSET), } return pagination_params