File size: 3,220 Bytes
b453f44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# main.py o donde definas tus funciones

import firebase_admin
from firebase_functions import pubsub_fn, options
from firebase_admin import firestore, exceptions # Import exceptions for better error handling

# Inicializa Firebase Admin si no lo has hecho ya en tu proyecto
# Esto generalmente se hace una vez en el punto de entrada de tus funciones (ej. en __init__.py o al inicio de tu main.py)
# Puedes usar un bloque try/except para evitar reinicializar si ya está inicializado.
# try:
#     firebase_admin.get_app()
# except ValueError:
#     firebase_admin.initialize_app()

# Obtén una referencia a la base de datos de Firestore con el nombre 'nowme'
# Asegúrate de que firebase_admin.initializeApp() se haya ejecutado antes de obtener esta referencia.
# firestore.client() obtiene el cliente para la app por defecto,
# y luego .instance('nowme') especifica la base de datos con nombre.
db = firestore.client().instance('nowme')

@pubsub_fn.on_message_published(
    # Puedes dar un nombre lógico al trabajo programado (Cloud Scheduler job) si quieres
    # topic="increment-segundos-job", # Este parámetro no es necesario para schedule, Firebase lo gestiona
    schedule="every 24 hours at 16:00",
    timezone="America/Mexico_City", # Establece la zona horaria a Ciudad de México
    # Opcional: puedes añadir opciones de runtime aquí si lo necesitas
    # memory=options.MemoryOption.GB_1, # Ejemplo: 1 GB de memoria
    # timeout_sec=300, # Ejemplo: 5 minutos de timeout
)
def incrementar_segundos_python(event: pubsub_fn.CloudEvent) -> None:
    """
    Cloud Function en Python activada por un programador
    para incrementar el campo 'segundos' en un documento de Firestore.
    """
    print(f"Function incrementar_segundos_python activada a las {event.time} por mensaje ID: {event.id}")
    # Para este caso, no necesitamos los datos específicos del evento Pub/Sub

    # Referencia al documento específico: colección 'nowme', documento 'sosa'
    doc_ref = db.collection('nowme').document('sosa')

    try:
        # Usa update con FieldValue.increment para una actualización atómica segura
        # Esto es especialmente bueno para valores numéricos que pueden ser
        # modificados por múltiples fuentes al mismo tiempo.
        doc_ref.update({
            "segundos": firestore.FieldValue.increment(1500)
        })
        print("Campo 'segundos' actualizado con éxito (+1500) en el documento 'nowme/sosa'.")

    except exceptions.NotFound:
        print("Error: Documento nowme/sosa no encontrado. No se pudo actualizar.")
        # Puedes decidir si quieres crear el documento si no existe,
        # pero update() solo funciona si el documento ya existe.
        # Si quieres crearlo si no existe, usarías set(..., merge=True).
        # doc_ref.set({"segundos": 1500}, merge=True) # Ejemplo de cómo crear/actualizar

    except Exception as e:
        print(f"Error al actualizar el documento nowme/sosa: {e}")
        # Puedes lanzar la excepción si quieres que Cloud Functions lo reporte como un fallo.
        # raise e
        pass # O simplemente pasar para que la Function no se marque como fallo en este caso

    print("Fin de la ejecución de la Function.")