"""Request helper methods.""" from flask import abort, request from marshmallow import ValidationError from payment.constants.constants import ( DEFAULT_PAGE_LIMIT, DEFAULT_PAGE_OFFSET, DEFAULT_SORT_BY, DEFAULT_SORT_ORDER, PAYMENT_ACCOUNT_SORTABLE_COLUMNS, ) from payment.constants.error import ( ERROR_INVALID_LIMIT_OFFSET, ERROR_INVALID_SORT_BY, ERROR_INVALID_SORT_ORDER, ) def validate_payload(payload, schema): """Validate request payload.""" try: return schema().load(payload) except ValidationError as err: abort( description=err.messages, code=400, ) def validate_pagination_params( limit: int = DEFAULT_PAGE_LIMIT, offset: int = DEFAULT_PAGE_OFFSET, sort_by: str = DEFAULT_SORT_BY, sort_order: str = DEFAULT_SORT_ORDER, valid_sortable_columns: list = PAYMENT_ACCOUNT_SORTABLE_COLUMNS, search_term: str = None, ): """Validate pagination request parameters.""" try: limit = int(limit) offset = int(offset) except ValueError: raise ValidationError(ERROR_INVALID_LIMIT_OFFSET) if sort_by.lower() not in valid_sortable_columns: raise ValidationError(ERROR_INVALID_SORT_BY.format(sort_by=sort_by)) if sort_order.lower() not in ['asc', 'desc']: raise ValidationError(ERROR_INVALID_SORT_ORDER) params = { 'limit': limit, 'offset': offset, 'sort_by': sort_by, 'sort_order': sort_order, } if search_term: params['search_term'] = search_term return params def get_optional_numeric_list_from_params(): """Get ids from request params and validate them.""" optional_params = request.json if not optional_params: return return [int(param) for param in optional_params]