feat: add reply/forward/pin message flow across backend and web
Some checks failed
CI / test (push) Failing after 24s

- add reply_to/forwarded_from message fields and chat pinned_message field

- add forward and pin APIs plus reply support in message create

- wire web actions: Reply, Fwd, Pin and reply composer state

- fix spam policy bug: allow repeated identical messages, keep rate limiting
This commit is contained in:
2026-03-08 00:28:43 +03:00
parent 4d704fc279
commit e1d0375392
18 changed files with 287 additions and 29 deletions

View File

@@ -1,16 +1,9 @@
import hashlib
from fastapi import HTTPException, status
from redis.exceptions import RedisError
from app.config.settings import settings
from app.utils.redis_client import get_redis_client
def _hash_text(text: str) -> str:
return hashlib.sha256(text.encode("utf-8")).hexdigest()
async def enforce_message_spam_policy(*, user_id: int, chat_id: int, text: str | None) -> None:
redis = get_redis_client()
rate_key = f"spam:msg_rate:{user_id}:{chat_id}"
@@ -23,15 +16,5 @@ async def enforce_message_spam_policy(*, user_id: int, chat_id: int, text: str |
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
detail="Message rate limit exceeded for this chat.",
)
normalized = (text or "").strip()
if normalized:
dup_key = f"spam:dup:{user_id}:{chat_id}:{_hash_text(normalized)}"
if await redis.exists(dup_key):
raise HTTPException(
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
detail="Duplicate message cooldown is active.",
)
await redis.set(dup_key, "1", ex=settings.duplicate_message_cooldown_seconds)
except RedisError:
return