Spaces:
Running
Running
File size: 7,710 Bytes
75ef9c2 be3f751 75ef9c2 be3f751 25ac1f6 be3f751 67828a3 b668c98 67828a3 2177bd7 67828a3 e3c2c56 |
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
import globales
import firebase_admin
from firebase_admin import auth
from firebase_admin import firestore
from firebase_admin import credentials
# Use the application default credentials.
cred = credentials.Certificate('archivos/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) #Obtengo el objeto con todos los datos.
print("Ésto es el user obtenido de la comprobación: ", user)
email = user.email
displayName = user.display_name
# Si la operación es exitosa, el usuario existe
print(f"✔️ Usuario con UID '{uid}' encontrado en Firebase Auth: {user.email or 'sin email'}")
return email, displayName
except auth.UserNotFoundError:
# Esta excepción se lanza específicamente si el UID no existe
print(f"❌ Usuario con UID '{uid}' NO encontrado en Firebase Auth.")
return None, None
except Exception as e:
# Captura cualquier otro error (ej. problemas de conexión, permisos)
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)
#Quizá éste segmento que comenté era el que producia nuevos documentos sin deber.
if documento.exists:
print("El documento existe....")
#Recuerda la conversión a diccionario.
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 #El documento si existe.
else:
print("No existe el documento, es un nuevo usuario.")
return None
#No crees nada pero avisa que no existe.
#creaDato(coleccion, dato, 'tokens', 5) #porque agregará 5 tokens.
def editaDato(coleccion, dato, info, contenido):
#Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
doc_ref = db.collection(coleccion).document(dato)
doc_ref.update({
# 'quote': quote,
info: contenido,
})
def creaDato(coleccion, dato, info, contenido):
#Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
doc_ref = db.collection(coleccion).document(dato)
doc_ref.set({
# 'quote': quote,
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}
"""
# Primero definimos la referencia al documento
doc_ref = db.collection(coleccion).document(dato)
try:
# Usamos .set() y le pasamos el diccionario completo.
# Esto sobrescribirá el documento si ya existe con los nuevos datos.
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:
# Verifica el token y decodifica la información del usuario
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
return uid # Retorna el UID del usuario si el token es válido
except auth.InvalidIdTokenError as e:
print(f"Token inválido: {e}")
return None # Retorna None si el token es inválido
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:
# Realizamos la consulta: filtra por documentos donde 'cus' sea igual a valor_cus
query_results = db.collection('usuarios').where(
filter=firestore.FieldFilter('cus', '==', valor_cus)
).limit(1).get() # Agregamos .limit(1) porque esperas un único documento
if not query_results:
print(f"❌ No se encontró ningún documento con 'cus' = '{valor_cus}'.")
return None, None
# Si se encuentra, query_results será una lista de instantáneas de documentos
# Tomamos el primer resultado (ya que usamos limit(1))
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:
# Usamos .set() con merge=True para comportamiento de "upsert".
# Si el documento no existe, lo crea.
# Si el campo no existe, lo crea e inicializa con 'amount'.
# Si el campo ya existe, lo incrementa con 'amount'.
doc_ref.set(
{field_name: firestore.Increment(amount)},
merge=True # Esta es la clave para que se cree si no existe y no sobrescriba otros campos
)
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}") |