nowme-images / cloudfunction.py
Moibe's picture
Disponibilidad de Espacios se maneja desde Firebase
b453f44
# 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.")