Add support for prev notification collection structure
All checks were successful
CI / ci (pull_request) Successful in 19s
All checks were successful
CI / ci (pull_request) Successful in 19s
This commit is contained in:
@@ -11,6 +11,8 @@ Usage:
|
||||
|
||||
import sys
|
||||
import time
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
import yaml
|
||||
from google.cloud.firestore import Client
|
||||
@@ -19,6 +21,21 @@ _SECONDS_PER_HOUR = 3600
|
||||
_DEFAULT_WINDOW_HOURS = 48
|
||||
|
||||
|
||||
def _extract_ts(n: dict[str, Any]) -> float:
|
||||
"""Return the creation timestamp of a notification as epoch seconds."""
|
||||
raw = n.get("timestamp_creacion", n.get("timestampCreacion", 0))
|
||||
if isinstance(raw, (int, float)):
|
||||
return float(raw)
|
||||
if isinstance(raw, datetime):
|
||||
return raw.timestamp()
|
||||
if isinstance(raw, str):
|
||||
try:
|
||||
return float(raw)
|
||||
except ValueError:
|
||||
return 0.0
|
||||
return 0.0
|
||||
|
||||
|
||||
def main() -> None:
|
||||
if len(sys.argv) < 2:
|
||||
print(f"Usage: {sys.argv[0]} <phone> [--hours N]")
|
||||
@@ -55,11 +72,8 @@ def main() -> None:
|
||||
|
||||
cutoff = time.time() - (window_hours * _SECONDS_PER_HOUR)
|
||||
|
||||
def _ts(n: dict) -> float:
|
||||
return n.get("timestamp_creacion", n.get("timestampCreacion", 0))
|
||||
|
||||
recent = [n for n in all_notifications if _ts(n) >= cutoff]
|
||||
recent.sort(key=_ts, reverse=True)
|
||||
recent = [n for n in all_notifications if _extract_ts(n) >= cutoff]
|
||||
recent.sort(key=_extract_ts, reverse=True)
|
||||
|
||||
if not recent:
|
||||
print(
|
||||
@@ -74,14 +88,13 @@ def main() -> None:
|
||||
)
|
||||
now = time.time()
|
||||
for i, n in enumerate(recent, 1):
|
||||
ts = _ts(n)
|
||||
ts = _extract_ts(n)
|
||||
ago = _format_time_ago(now, ts)
|
||||
categoria = n.get("parametros", {}).get(
|
||||
"notification_po_Categoria", ""
|
||||
)
|
||||
texto = n.get("texto", "")
|
||||
params = n.get("parameters", n.get("parametros", {}))
|
||||
categoria = params.get("notification_po_Categoria", "")
|
||||
texto = n.get("text", n.get("texto", ""))
|
||||
print(f" [{i}] {ago}")
|
||||
print(f" ID: {n.get('id_notificacion', '?')}")
|
||||
print(f" ID: {n.get('notificationId', n.get('id_notificacion', '?'))}")
|
||||
if categoria:
|
||||
print(f" Category: {categoria}")
|
||||
print(f" {texto[:120]}{'…' if len(texto) > 120 else ''}")
|
||||
|
||||
@@ -8,51 +8,54 @@ Usage:
|
||||
uv run utils/register_notification_firestore.py <phone>
|
||||
|
||||
Reads project/database/collection settings from config.yaml.
|
||||
|
||||
The generated notification follows the latest English-camelCase schema
|
||||
used in the production collection (``artifacts/default-app-id/notifications``).
|
||||
"""
|
||||
|
||||
import random
|
||||
import sys
|
||||
import time
|
||||
import uuid
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import yaml
|
||||
from google.cloud.firestore import Client
|
||||
from google.cloud.firestore import Client, SERVER_TIMESTAMP
|
||||
|
||||
NOTIFICATION_TEMPLATES = [
|
||||
{
|
||||
"texto": "Se detectó un cargo de $1,500 en tu cuenta",
|
||||
"parametros": {
|
||||
"text": "Se detectó un cargo de $1,500 en tu cuenta",
|
||||
"parameters": {
|
||||
"notification_po_transaction_id": "TXN15367",
|
||||
"notification_po_amount": 5814,
|
||||
},
|
||||
},
|
||||
{
|
||||
"texto": (
|
||||
"text": (
|
||||
"💡 Recuerda que puedes obtener tu Adelanto de Nómina en"
|
||||
" cualquier momento, sólo tienes que seleccionar Solicitud"
|
||||
" adelanto de Nómina en tu app."
|
||||
),
|
||||
"parametros": {
|
||||
"parameters": {
|
||||
"notification_po_Categoria": "Adelanto de Nómina solicitud",
|
||||
"notification_po_caption": "Adelanto de Nómina",
|
||||
},
|
||||
},
|
||||
{
|
||||
"texto": (
|
||||
"text": (
|
||||
"Estás a un clic de Programa de Lealtad, entra a tu app y"
|
||||
" finaliza Tu contratación en instantes. ⏱ 🤳"
|
||||
),
|
||||
"parametros": {
|
||||
"parameters": {
|
||||
"notification_po_Categoria": "Tarjeta de Crédito Contratación",
|
||||
"notification_po_caption": "Tarjeta de Crédito",
|
||||
},
|
||||
},
|
||||
{
|
||||
"texto": (
|
||||
"text": (
|
||||
"🚀 ¿Listo para obtener tu Cápsula Plus? Continúa en tu app"
|
||||
" y termina al instante. Conoce más en: va.app"
|
||||
),
|
||||
"parametros": {},
|
||||
"parameters": {},
|
||||
},
|
||||
]
|
||||
|
||||
@@ -75,15 +78,16 @@ def main() -> None:
|
||||
collection_path = cfg["notifications_collection_path"]
|
||||
doc_ref = db.collection(collection_path).document(phone)
|
||||
|
||||
now = datetime.now(tz=timezone.utc)
|
||||
template = random.choice(NOTIFICATION_TEMPLATES)
|
||||
notification = {
|
||||
"id_notificacion": str(uuid.uuid4()),
|
||||
"notificationId": str(uuid.uuid4()),
|
||||
"telefono": phone,
|
||||
"timestamp_creacion": time.time(),
|
||||
"texto": template["texto"],
|
||||
"nombre_evento_dialogflow": "notificacion",
|
||||
"codigo_idioma_dialogflow": "es",
|
||||
"parametros": template["parametros"],
|
||||
"timestampCreacion": now,
|
||||
"text": template["text"],
|
||||
"event": "notificacion",
|
||||
"languageCode": "es",
|
||||
"parameters": template["parameters"],
|
||||
"status": "active",
|
||||
}
|
||||
|
||||
@@ -92,14 +96,23 @@ def main() -> None:
|
||||
data = doc.to_dict() or {}
|
||||
notifications = data.get("notificaciones", [])
|
||||
notifications.append(notification)
|
||||
doc_ref.update({"notificaciones": notifications})
|
||||
doc_ref.update({
|
||||
"notificaciones": notifications,
|
||||
"ultimaActualizacion": SERVER_TIMESTAMP,
|
||||
})
|
||||
else:
|
||||
doc_ref.set({"notificaciones": [notification]})
|
||||
doc_ref.set({
|
||||
"sessionId": "",
|
||||
"telefono": phone,
|
||||
"fechaCreacion": SERVER_TIMESTAMP,
|
||||
"ultimaActualizacion": SERVER_TIMESTAMP,
|
||||
"notificaciones": [notification],
|
||||
})
|
||||
|
||||
total = len(doc_ref.get().to_dict().get("notificaciones", []))
|
||||
print(f"✅ Registered notification for {phone}")
|
||||
print(f" ID: {notification['id_notificacion']}")
|
||||
print(f" Text: {template['texto'][:80]}...")
|
||||
print(f" ID: {notification['notificationId']}")
|
||||
print(f" Text: {template['text'][:80]}...")
|
||||
print(f" Collection: {collection_path}")
|
||||
print(f" Total notifications for this phone: {total}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user