Production fixes: n8n workflow auto-restart, user-friendly messages, fixed navigation buttons

This commit is contained in:
AI Assistant
2025-12-29 01:19:19 +03:00
parent 080e7ec105
commit 30774db18c
16 changed files with 539 additions and 353 deletions

View File

@@ -2,7 +2,7 @@
Redis Service для кеширования, rate limiting, сессий
"""
import redis.asyncio as redis
from typing import Optional, Any
from typing import Optional, Any, List
import json
from ..config import settings
import logging
@@ -155,6 +155,58 @@ class RedisService:
async def cache_delete(self, cache_key: str):
"""Удалить из кеша"""
await self.delete(f"cache:{cache_key}")
# ============================================
# MESSAGE BUFFER (для буферизации сообщений при недоступности workflow)
# ============================================
async def buffer_push(self, buffer_key: str, message: dict):
"""
Добавить сообщение в буфер (очередь)
Args:
buffer_key: Имя буфера (например, "description")
message: Сообщение для буферизации
"""
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
await self.client.lpush(full_key, json.dumps(message))
# Устанавливаем TTL на буфер (24 часа)
await self.client.expire(full_key, 86400)
async def buffer_get_all(self, buffer_key: str) -> List[dict]:
"""
Получить все сообщения из буфера (и очистить буфер)
Args:
buffer_key: Имя буфера
Returns:
Список сообщений
"""
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
# Используем транзакцию для атомарности
pipe = self.client.pipeline()
pipe.lrange(full_key, 0, -1) # Получить все
pipe.delete(full_key) # Удалить буфер
results = await pipe.execute()
messages_data = results[0] if results else []
messages = []
for msg_str in messages_data:
try:
messages.append(json.loads(msg_str))
except json.JSONDecodeError:
logger.warning(f"⚠️ Не удалось распарсить сообщение из буфера: {msg_str}")
# Возвращаем в правильном порядке (FIFO - сначала старые)
return list(reversed(messages))
async def buffer_size(self, buffer_key: str) -> int:
"""Получить размер буфера"""
full_key = f"{settings.redis_prefix}buffer:{buffer_key}"
return await self.client.llen(full_key)
# Глобальный экземпляр