# 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.")