WACRM: historial completo con paginacion desde el origen, sync refleja eliminaciones y trae todo el historial
This commit is contained in:
@@ -162,6 +162,9 @@ class SkeenWacrmProxyController(http.Controller):
|
||||
contacts_map[item['id']] = request.env['skeen.wacrm.contact'].sudo().create(vals)
|
||||
|
||||
# 2. Conversations
|
||||
# Además del upsert, se REFLEJAN ELIMINACIONES: lo que ya no exista
|
||||
# en Supabase se borra del caché local (antes el caché acumulaba
|
||||
# conversaciones borradas y la bandeja de SKEEN mostraba chats muertos).
|
||||
conversations_data = _supabase_request_paginated('conversations', {'select': '*'})
|
||||
conversations_map = {}
|
||||
for item in conversations_data:
|
||||
@@ -184,12 +187,25 @@ class SkeenWacrmProxyController(http.Controller):
|
||||
else:
|
||||
conversations_map[item['id']] = request.env['skeen.wacrm.conversation'].sudo().create(vals)
|
||||
|
||||
# 3. Messages (últimos 5000 paginados)
|
||||
remote_conv_ids = set(conversations_map.keys())
|
||||
stale_convs = request.env['skeen.wacrm.conversation'].sudo().search([
|
||||
('external_id', 'not in', list(remote_conv_ids))]) if remote_conv_ids else \
|
||||
request.env['skeen.wacrm.conversation'].sudo().search([])
|
||||
if stale_convs:
|
||||
stale_convs.unlink()
|
||||
conversations_map = {k: v for k, v in conversations_map.items()}
|
||||
|
||||
# 3. Messages (todos los del origen, sin recorte)
|
||||
messages_data = _supabase_request_paginated(
|
||||
'messages',
|
||||
{'select': '*', 'order': 'created_at.desc'},
|
||||
page_size=1000
|
||||
)[:5000]
|
||||
)
|
||||
remote_msg_ids = {item['id'] for item in messages_data}
|
||||
stale_msgs = request.env['skeen.wacrm.message'].sudo().search([
|
||||
('external_id', 'not in', list(remote_msg_ids))]) if remote_msg_ids else \
|
||||
request.env['skeen.wacrm.message'].sudo().search([])
|
||||
stale_msgs.unlink()
|
||||
for item in messages_data:
|
||||
conversation = conversations_map.get(item.get('conversation_id'))
|
||||
if not conversation:
|
||||
@@ -418,6 +434,50 @@ class SkeenWacrmProxyController(http.Controller):
|
||||
_logger.exception('Error listando mensajes WACRM')
|
||||
return json_response({'status': 'error', 'message': str(e)}, 500)
|
||||
|
||||
def _supabase_message_to_dict(self, m):
|
||||
"""Mensaje de Supabase en el formato que consume el frontend."""
|
||||
return {
|
||||
'id': m.get('id'),
|
||||
'external_id': m.get('id'),
|
||||
'conversation_id': m.get('conversation_id'),
|
||||
'sender_type': {'contact': 'customer', 'user': 'agent'}.get(m.get('sender_type', 'customer'), m.get('sender_type', 'customer')),
|
||||
'content_type': m.get('content_type', 'text'),
|
||||
'content_text': m.get('content_text') or m.get('content') or '',
|
||||
'media_url': m.get('media_url') or '',
|
||||
'template_name': m.get('template_name') or '',
|
||||
'status': m.get('status', 'sent'),
|
||||
'created_at': (m.get('created_at') or '')[:19].replace('T', ' '),
|
||||
}
|
||||
|
||||
@http.route('/skeen/frontend/v1/wacrm/conversations/<string:external_id>/messages', type='http', auth='none', methods=['GET', 'OPTIONS'], csrf=False)
|
||||
def list_conversation_messages_origin(self, external_id, **kw):
|
||||
"""Historial COMPLETO de una conversación, leído directo del origen
|
||||
(Supabase del WACRM), paginado. Devuelve los mensajes en orden
|
||||
ascendente dentro de la página; `has_more` indica si hay página previa
|
||||
(mensajes más antiguos)."""
|
||||
try:
|
||||
page = max(int(kw.get('page', 1) or 1), 1)
|
||||
page_size = min(max(int(kw.get('page_size', 50) or 50), 1), 200)
|
||||
data = _supabase_request('GET', 'messages', params={
|
||||
'select': '*',
|
||||
'conversation_id': f'eq.{external_id}',
|
||||
'order': 'created_at.desc',
|
||||
'limit': page_size,
|
||||
'offset': (page - 1) * page_size,
|
||||
})
|
||||
msgs = [self._supabase_message_to_dict(m) for m in data]
|
||||
msgs.reverse() # ascendente dentro de la página
|
||||
return json_response({
|
||||
'status': 'success',
|
||||
'messages': msgs,
|
||||
'page': page,
|
||||
'page_size': page_size,
|
||||
'has_more': len(data) == page_size,
|
||||
})
|
||||
except Exception as e:
|
||||
_logger.exception('Error listando mensajes del origen WACRM')
|
||||
return json_response({'status': 'error', 'message': str(e)}, 500)
|
||||
|
||||
@http.route('/skeen/frontend/v1/wacrm/conversations', type='http', auth='none', methods=['GET', 'OPTIONS'], csrf=False)
|
||||
def list_conversations(self, **kw):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user