|
import firebase_admin |
|
from firebase_admin import credentials |
|
from firebase_admin import firestore |
|
import time |
|
|
|
from firebase_admin import auth |
|
|
|
|
|
cred = credentials.Certificate('config.json') |
|
firebase_admin.initialize_app(cred) |
|
|
|
db = firestore.client() |
|
|
|
def obtenDatosUIDFirebase(uid): |
|
""" |
|
Verifica si un UID existe en Firebase Authentication. |
|
Esto con el fin de evitar que se cambié el id arbitrareamente desde localstorage. |
|
|
|
Args: |
|
uid (str): El User ID (UID) que se desea verificar. |
|
|
|
Returns: |
|
bool: True si el usuario con ese UID existe, False en caso contrario. |
|
""" |
|
try: |
|
user = auth.get_user(uid) |
|
print("Ésto es el user obtenido de la comprobación: ", user) |
|
email = user.email |
|
displayName = user.display_name |
|
|
|
|
|
print(f"✔️ Usuario con UID '{uid}' encontrado en Firebase Auth: {user.email or 'sin email'}") |
|
return email, displayName |
|
except auth.UserNotFoundError: |
|
|
|
print(f"❌ Usuario con UID '{uid}' NO encontrado en Firebase Auth.") |
|
return None, None |
|
except Exception as e: |
|
|
|
print(f"❌ Error al verificar usuario con UID '{uid}': {e}") |
|
return None, None |
|
|
|
def obtenDato(coleccion, dato, info): |
|
|
|
print(f"Estoy dentro de obtenDato y los valores que recibí son: {coleccion}, {dato}, {info}...") |
|
doc_ref = db.collection(coleccion).document(dato) |
|
|
|
documento = doc_ref.get() |
|
print("Esto es el documento obtenido: ", documento) |
|
|
|
|
|
if documento.exists: |
|
print("El documento existe....") |
|
|
|
documento = doc_ref.get() |
|
diccionario = documento.to_dict() |
|
print("Esto es el diccionario: ", diccionario) |
|
resultado = diccionario.get(info) |
|
print("Éste es el resultado...", resultado) |
|
return resultado |
|
pass |
|
else: |
|
print("No existe el documento, es un nuevo usuario.") |
|
return None |
|
|
|
|
|
|
|
def editaDato(coleccion, dato, info, contenido): |
|
|
|
|
|
doc_ref = db.collection(coleccion).document(dato) |
|
|
|
doc_ref.update({ |
|
|
|
info: contenido, |
|
}) |
|
|
|
def creaDato(coleccion, dato, info, contenido): |
|
|
|
|
|
doc_ref = db.collection(coleccion).document(dato) |
|
|
|
doc_ref.set({ |
|
|
|
info: contenido, |
|
}) |
|
|
|
def creaDatoMultiple(coleccion, dato, data_dict): |
|
""" |
|
Crea un nuevo documento o sobrescribe uno existente en Firestore |
|
con múltiples pares de campo-contenido. |
|
|
|
Args: |
|
coleccion (str): El nombre de la colección donde se creará/actualizará el documento. |
|
dato (str): El ID del documento que se va a crear o sobrescribir. |
|
data_dict (dict): Un diccionario donde las claves son los nombres de los campos |
|
y los valores son el contenido de esos campos. |
|
Ej: {'nombre': 'Juan', 'edad': 30, 'activo': True} |
|
""" |
|
|
|
doc_ref = db.collection(coleccion).document(dato) |
|
|
|
try: |
|
|
|
|
|
doc_ref.set(data_dict) |
|
|
|
print(f"✔️ Documento '{dato}' creado/sobrescrito en la colección '{coleccion}' con los siguientes datos:") |
|
for key, value in data_dict.items(): |
|
print(f" - {key}: {value}") |
|
|
|
except Exception as e: |
|
print(f"❌ Error al crear/sobrescribir documento '{dato}' en '{coleccion}': {e}") |
|
|
|
def verificar_token(id_token): |
|
"""Verifica el token de ID de Firebase.""" |
|
try: |
|
|
|
decoded_token = auth.verify_id_token(id_token) |
|
uid = decoded_token['uid'] |
|
return uid |
|
except auth.InvalidIdTokenError as e: |
|
print(f"Token inválido: {e}") |
|
return None |
|
|
|
def encontrar_documento_por_cus(valor_cus): |
|
""" |
|
Busca un documento en la colección 'usuario' donde el campo 'cus' |
|
coincide con el valor_cus especificado. |
|
|
|
Args: |
|
valor_cus (str): El valor exacto del campo 'cus' a buscar. |
|
|
|
Returns: |
|
tuple: Una tupla (document_id, document_data) si se encuentra, |
|
o (None, None) si no se encuentra o hay un error. |
|
Retorna solo el primer documento encontrado si hay múltiples coincidencias. |
|
""" |
|
print(f"\n--- Buscando documento en 'usuario' con cus: '{valor_cus}' ---") |
|
|
|
try: |
|
|
|
query_results = db.collection('usuarios').where( |
|
filter=firestore.FieldFilter('cus', '==', valor_cus) |
|
).limit(1).get() |
|
|
|
if not query_results: |
|
print(f"❌ No se encontró ningún documento con 'cus' = '{valor_cus}'.") |
|
return None, None |
|
|
|
|
|
|
|
doc_snapshot = query_results[0] |
|
|
|
doc_id = doc_snapshot.id |
|
doc_data = doc_snapshot.to_dict() |
|
|
|
print(f"✔️ Documento encontrado: ID='{doc_id}', Datos: {doc_data}") |
|
return doc_id |
|
|
|
except Exception as e: |
|
print(f"❌ Error al buscar documento por 'cus': {e}") |
|
return None, None |
|
|
|
def incrementar_campo_numerico(collection_name, document_id, field_name, amount=1): |
|
""" |
|
Incrementa un campo numérico en un documento de Firestore de forma atómica. |
|
Si el documento no existe, lo crea e inicializa el campo con el 'amount'. |
|
Si el campo no existe en un documento existente, lo inicializa y aplica el incremento. |
|
|
|
Args: |
|
collection_name (str): El nombre de la colección. |
|
document_id (str): El ID del documento. |
|
field_name (str): El nombre del campo numérico a incrementar. |
|
amount (int/float): La cantidad por la cual incrementar (puede ser negativo para decrementar). |
|
""" |
|
doc_ref = db.collection(collection_name).document(document_id) |
|
|
|
try: |
|
|
|
|
|
|
|
|
|
doc_ref.set( |
|
{field_name: firestore.Increment(amount)}, |
|
merge=True |
|
) |
|
print(f"✔️ Campo '{field_name}' en el documento '{document_id}' actualizado/creado e incrementado en {amount}.") |
|
except Exception as e: |
|
print(f"❌ Error al operar en el campo '{field_name}' del documento '{document_id}': {e}") |