from collections import defaultdict from typing import Any, Dict, Optional from server.utils.logger import logger def format_attributes(**attrs) -> Optional[Dict[str, Dict[str, Any]]]: """Prepare extra attributes for sns message from dict to aws required format. https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html """ if not attrs: return {} formatted = defaultdict(dict) for key, value in attrs.items(): if isinstance(value, str): formatted[key] = {"DataType": "String", "StringValue": value} elif isinstance(value, bytes): formatted[key] = {"DataType": "Binary", "BinaryValue": value} else: raise ValueError(f"Unsupported sns message attribute type: {type(value)}. Expected one of: str, bytes") return formatted def log(f): async def wrapped(*args, **kwargs): logger.info( f"{f.__name__} was called with\n" f"args: {','.join([str(a) for a in args])}\n" f"kwargs: {','.join([f'{k}={v}' for k, v in kwargs.items()])}" ) return await f(*args, **kwargs) return wrapped