sms_service.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # app/services/sms_service.py
  2. import json
  3. from typing import List
  4. from redis.asyncio import Redis
  5. from app.schemas.sms import ShortMessageDetail
  6. async def save_short_message(
  7. redis_client: Redis,
  8. phone: str,
  9. message: str,
  10. received_at: str,
  11. max_ttl: int
  12. ) -> ShortMessageDetail:
  13. """
  14. 将短信保存到 Redis(异步版)
  15. key: sms:{phone}
  16. value: JSON 数组(最多保留最近 20 条)
  17. """
  18. key = f"sms:{phone}"
  19. # 1️⃣ 读取已有短信
  20. existing_data = await redis_client.get(key)
  21. if existing_data:
  22. messages = json.loads(existing_data)
  23. else:
  24. messages = []
  25. # 2️⃣ 添加新短信
  26. new_msg = ShortMessageDetail(
  27. phone=phone,
  28. message=message,
  29. received_at=received_at
  30. )
  31. messages.append(new_msg.dict())
  32. # 3️⃣ 保留最近 20 条
  33. messages = messages[-20:]
  34. # 4️⃣ 写回 Redis(重置 TTL)
  35. await redis_client.setex(
  36. key,
  37. max_ttl,
  38. json.dumps(messages)
  39. )
  40. return new_msg
  41. async def query_short_message(
  42. redis_client: Redis,
  43. phone: str,
  44. keyword: str = None,
  45. sent_at: str = None
  46. ) -> List[ShortMessageDetail]:
  47. """
  48. 从 Redis 查询短信(异步版)
  49. 支持关键字 / 时间过滤
  50. """
  51. key = f"sms:{phone}"
  52. existing_data = await redis_client.get(key)
  53. if not existing_data:
  54. return []
  55. messages = [
  56. ShortMessageDetail(**m)
  57. for m in json.loads(existing_data)
  58. ]
  59. # 关键字过滤
  60. if keyword:
  61. messages = [
  62. m for m in messages
  63. if keyword in m.message
  64. ]
  65. # 时间过滤(字符串比较,ISO8601 安全)
  66. if sent_at:
  67. messages = [
  68. m for m in messages
  69. if m.received_at >= sent_at
  70. ]
  71. return messages