no update fechas
Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
This commit is contained in:
@@ -54,7 +54,6 @@ class MongoDBArticleCache:
|
||||
self._articles_collection.create_index([('platform', 1), ('id', 1)], unique=True)
|
||||
self._articles_collection.create_index([('username', 1)])
|
||||
self._articles_collection.create_index([('worker_name', 1)])
|
||||
self._articles_collection.create_index([('notifiedAt', -1)])
|
||||
self._articles_collection.create_index([('expiresAt', 1)], expireAfterSeconds=0)
|
||||
|
||||
# Índices para workers
|
||||
@@ -82,95 +81,8 @@ class MongoDBArticleCache:
|
||||
|
||||
def mark_article_as_notified(self, article, username=None, worker_name=None):
|
||||
"""Marca un artículo como notificado en MongoDB con TTL usando estructura user_info"""
|
||||
try:
|
||||
expires_at = datetime.utcnow() + timedelta(days=NOTIFIED_ARTICLE_TTL_DAYS)
|
||||
|
||||
# Obtener artículo existente si existe
|
||||
existing = self._articles_collection.find_one({
|
||||
'platform': article.get_platform(),
|
||||
'id': str(article.get_id())
|
||||
})
|
||||
|
||||
# Preparar datos del artículo (sin user_info)
|
||||
article_data = {
|
||||
'platform': article.get_platform(),
|
||||
'id': str(article.get_id()),
|
||||
'title': article.get_title(),
|
||||
'description': article._description,
|
||||
'price': article.get_price(),
|
||||
'currency': article.get_currency(),
|
||||
'location': article.get_location(),
|
||||
'allows_shipping': article._allows_shipping,
|
||||
'url': article.get_url(),
|
||||
'images': article.get_images(),
|
||||
'modified_at': article.get_modified_at(),
|
||||
'expiresAt': expires_at,
|
||||
'updatedAt': datetime.utcnow(),
|
||||
}
|
||||
|
||||
# Preparar user_info para este usuario/worker
|
||||
user_info_entry = {
|
||||
'username': username,
|
||||
'worker_name': worker_name,
|
||||
'notified': True,
|
||||
'notified_at': datetime.utcnow(),
|
||||
'is_favorite': False,
|
||||
}
|
||||
|
||||
if existing:
|
||||
# Artículo existe, actualizar o añadir user_info
|
||||
existing_user_info = existing.get('user_info', [])
|
||||
|
||||
# Buscar si ya existe un user_info para este usuario
|
||||
user_info_index = None
|
||||
for i, ui in enumerate(existing_user_info):
|
||||
if ui.get('username') == username:
|
||||
user_info_index = i
|
||||
break
|
||||
|
||||
if user_info_index is not None:
|
||||
# Actualizar user_info existente pero mantener notified_at original
|
||||
existing_user_info[user_info_index].update({
|
||||
'worker_name': worker_name or existing_user_info[user_info_index].get('worker_name'),
|
||||
'notified': True,
|
||||
# NO actualizar notified_at, mantener el valor existente
|
||||
# Mantener is_favorite existente
|
||||
'is_favorite': existing_user_info[user_info_index].get('is_favorite', False),
|
||||
})
|
||||
else:
|
||||
# Añadir nuevo user_info
|
||||
existing_user_info.append(user_info_entry)
|
||||
|
||||
article_data['user_info'] = existing_user_info
|
||||
|
||||
# Solo actualizar precio si es diferente, no actualizar fechas de notificación
|
||||
existing_price = existing.get('price')
|
||||
new_price = article.get_price()
|
||||
if existing_price == new_price:
|
||||
# Si el precio es el mismo, no actualizar el artículo
|
||||
# Solo actualizar user_info si cambió
|
||||
self._articles_collection.update_one(
|
||||
{'platform': article.get_platform(), 'id': str(article.get_id())},
|
||||
{'$set': {'user_info': existing_user_info}}
|
||||
)
|
||||
else:
|
||||
# Precio diferente, actualizar artículo completo
|
||||
# Mantener updatedAt para saber cuándo cambió el precio
|
||||
# pero NO actualizar notified_at (ya se mantiene arriba)
|
||||
self._articles_collection.update_one(
|
||||
{'platform': article.get_platform(), 'id': str(article.get_id())},
|
||||
{'$set': article_data}
|
||||
)
|
||||
else:
|
||||
# Artículo nuevo, crear con user_info
|
||||
article_data['user_info'] = [user_info_entry]
|
||||
article_data['createdAt'] = datetime.utcnow()
|
||||
|
||||
# Insertar nuevo artículo
|
||||
self._articles_collection.insert_one(article_data)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error marcando artículo como notificado en MongoDB: {e}")
|
||||
# Delegar a mark_articles_as_notified para evitar duplicación de código
|
||||
self.mark_articles_as_notified([article], username=username, worker_name=worker_name)
|
||||
|
||||
def mark_articles_as_notified(self, articles, username=None, worker_name=None):
|
||||
"""Añade múltiples artículos a la lista de artículos ya notificados en MongoDB usando estructura user_info"""
|
||||
@@ -230,13 +142,14 @@ class MongoDBArticleCache:
|
||||
|
||||
if user_info_index is not None:
|
||||
# Actualizar user_info existente pero mantener notified_at original
|
||||
existing_user_info[user_info_index].update({
|
||||
'worker_name': worker_name or existing_user_info[user_info_index].get('worker_name'),
|
||||
existing_user_info_entry = existing_user_info[user_info_index]
|
||||
existing_user_info[user_info_index] = {
|
||||
'username': existing_user_info_entry.get('username'),
|
||||
'worker_name': worker_name or existing_user_info_entry.get('worker_name'),
|
||||
'notified': True,
|
||||
# NO actualizar notified_at, mantener el valor existente
|
||||
# Mantener is_favorite existente
|
||||
'is_favorite': existing_user_info[user_info_index].get('is_favorite', False),
|
||||
})
|
||||
'notified_at': existing_user_info_entry.get('notified_at'), # Preservar notified_at original
|
||||
'is_favorite': existing_user_info_entry.get('is_favorite', False),
|
||||
}
|
||||
else:
|
||||
# Añadir nuevo user_info
|
||||
existing_user_info.append({
|
||||
@@ -251,22 +164,28 @@ class MongoDBArticleCache:
|
||||
existing_price = existing.get('price')
|
||||
new_price = article.get_price()
|
||||
if existing_price == new_price:
|
||||
# Si el precio es el mismo, solo actualizar user_info
|
||||
# Si el precio es el mismo, solo actualizar user_info y eliminar notifiedAt a nivel de artículo
|
||||
operations.append(
|
||||
UpdateOne(
|
||||
{'platform': platform, 'id': article_id},
|
||||
{'$set': {'user_info': existing_user_info}}
|
||||
{
|
||||
'$set': {'user_info': existing_user_info},
|
||||
'$unset': {'notifiedAt': '', 'notified_at': ''}
|
||||
}
|
||||
)
|
||||
)
|
||||
else:
|
||||
# Precio diferente, actualizar artículo completo
|
||||
# Mantener updatedAt para saber cuándo cambió el precio
|
||||
# pero NO actualizar notified_at (ya se mantiene arriba)
|
||||
# Eliminar notifiedAt/notified_at a nivel de artículo (solo debe estar en user_info)
|
||||
article_data['user_info'] = existing_user_info
|
||||
operations.append(
|
||||
UpdateOne(
|
||||
{'platform': platform, 'id': article_id},
|
||||
{'$set': article_data}
|
||||
{
|
||||
'$set': article_data,
|
||||
'$unset': {'notifiedAt': '', 'notified_at': ''}
|
||||
}
|
||||
)
|
||||
)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user