sundaycoil/support-ticket-system
5
1"""Support Ticket System — utils for comment payloads."""2from __future__ import annotations3 4import json5import logging6from datetime import datetime, timezone7from typing import Any, Dict, List, Optional8 9logger = logging.getLogger(__name__)10 11 12class SupportUtils:13 """Utils for Support Ticket System comment payloads."""14 15 _DATE_FIELDS = ("resolved_at")16 17 @classmethod18 def loads(cls, raw: str) -> Dict[str, Any]:19 """Deserialise a JSON comment payload."""20 data = json.loads(raw)21 return cls._coerce(data)22 23 @classmethod24 def dumps(cls, record: Dict[str, Any]) -> str:25 """Serialise a comment record to JSON."""26 return json.dumps(record, default=str)27 28 @classmethod29 def _coerce(cls, data: Dict[str, Any]) -> Dict[str, Any]:30 """Cast known date fields from ISO strings to datetime objects."""31 out: Dict[str, Any] = {}32 for k, v in data.items():33 if k in cls._DATE_FIELDS and isinstance(v, str):34 try:35 out[k] = datetime.fromisoformat(v)36 except ValueError:37 out[k] = v38 else:39 out[k] = v40 return out41 42 43def parse_comments(payload: str) -> List[Dict[str, Any]]:44 """Parse a JSON array of Comment payloads."""45 raw = json.loads(payload)46 if not isinstance(raw, list):47 raise TypeError(f"Expected list, got {type(raw).__name__}")48 return [SupportUtils._coerce(item) for item in raw]49 50 51def escalate_comment_to_str(52 record: Dict[str, Any], indent: Optional[int] = None53) -> str:54 """Convenience wrapper — serialise a Comment to a JSON string."""55 if indent is None:56 return SupportUtils.dumps(record)57 return json.dumps(record, indent=indent, default=str)58 