File size: 8,045 Bytes
8889c22
421e233
8889c22
421e233
18aeb74
8889c22
46bd98e
18aeb74
8889c22
dc99960
8889c22
 
db44719
8889c22
 
 
db44719
8889c22
 
 
 
 
 
 
db44719
 
 
 
 
 
 
 
 
 
 
8889c22
5a47dee
8889c22
 
219c926
8889c22
 
 
 
 
 
 
 
 
 
 
421e233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db44719
421e233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a39dde
 
421e233
 
 
 
 
 
 
 
 
 
0a39dde
 
 
 
 
 
 
 
 
421e233
db44719
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
190
191
192
193
194
195
196
197
198
199
200
201
import firebase_admin
from datetime import datetime
from firebase_admin import auth
from firebase_admin import firestore
from firebase_admin import credentials

firebase_cred = credentials.Certificate('archivos/config.json')
firebase_admin.initialize_app(firebase_cred)

db = firestore.client(database_id='nowme')
#dato es el dato que traes  como el nombre del user. 
#info es la info de ese dato que estás buscando, como token.
def obtenDato(coleccion, documento, info):
    #Future: Tentativamente ésta parte podría solo hacerse una vez y vivir en la app para ser reutilizado.
    
    #Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
    doc_ref = db.collection(coleccion).document(documento)    
    documento = doc_ref.get()
    
    #Recuerda la conversión a diccionario.
    documento = doc_ref.get() 
    diccionario = documento.to_dict()
    return diccionario.get(info)

def obtenAllDatos(coleccion, documento):

    doc_ref = db.collection(coleccion).document(documento) 
    documento = doc_ref.get()

    #Recuerda la conversión a diccionario.
    documento = doc_ref.get() 
    diccionario = documento.to_dict()

    return diccionario

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({
        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({
        info: contenido,
    })

def registraLog(servidor_val, prompt_val, modelo_val, seed_val):
    """
    Agrega un nuevo documento a la colección 'logs'.
    El ID del documento es la fecha y hora actual en formato string.
    Los campos del documento son 'servidor', 'prompt', 'modelo' y 'seed'.

    Args:
        servidor_val (str): El nombre o ID del servidor.
        prompt_val (str): El valor del campo 'prompt'.
        modelo_val (str): El valor del campo 'modelo'.
        seed_val (int): El valor del campo 'seed'.
    """
    try:
        # 1. Generar el ID del documento (fecha y hora actual formateada)
        # Es importante usar una zona horaria si tus logs vienen de diferentes lugares
        # o si quieres que el timestamp refleje una hora local específica.
        # Por defecto, datetime.now() usa la hora local de tu sistema.
        # Si prefieres UTC (recomendado para consistencia global), puedes usar datetime.now(pytz.utc).
        
        # Obtenemos la hora actual del sistema
        now = datetime.now() 
        # Formateamos la hora para que sea el ID del documento
        document_id_fecha_hora = now.strftime("%Y-%m-%d %H:%M:%S")

        nombre_final = servidor_val + " - " + document_id_fecha_hora

        # 2. Definir la referencia al documento específico con el ID de fecha y hora
        doc_ref = db.collection('logs').document(nombre_final)

        # 3. Definir los datos del log
        datos_log = {
            'servidor': servidor_val,
            'prompt': prompt_val,
            'modelo': modelo_val,
            'seed': seed_val,
            # Opcional: También puedes guardar el timestamp como un campo Timestamp
            # esto facilita consultas de rango si la fecha/hora del ID no es perfecta
            # o si necesitas ordenar por milisegundos.
            'timestamp_creacion': firestore.SERVER_TIMESTAMP
        }

        # 4. Guardar los datos en el documento
        # Usamos .set(). Si un log ya existe para ese EXACTO segundo, se sobrescribirá.
        # Si esto es una preocupación (dos logs en el mismo segundo), podríamos añadir
        # milisegundos al ID o usar un ID automático y un campo de timestamp.
        doc_ref.set(datos_log)

        #print(f"✔️ Log agregado exitosamente en 'logs/{document_id_fecha_hora}'.")
        print(f"   Datos: Servidor='{servidor_val}', Prompt='{prompt_val}'...")

    except Exception as e:
        print(f"❌ Error al agregar log a Firestore: {e}")
        # Considera registrar el error o manejarlo de forma más robusta.


def buscar_log_por_prompt(valor_prompt):
    """
    Busca documentos en la colección 'logs' donde el campo 'prompt' coincide
    con el valor_prompt especificado.

    Args:
        valor_prompt (str): El valor exacto del prompt a buscar.

    Returns:
        list: Una lista de diccionarios, donde cada diccionario representa un documento
              que coincide con la búsqueda. Incluye el ID del documento.
    """
    print(f"\n--- Buscando logs con prompt: '{valor_prompt}' ---")

    # --- CAMBIO AQUÍ: Usando firestore.FieldFilter en lugar de .where() directamente ---
    query_results = db.collection('logs').where(
        filter=firestore.FieldFilter('prompt', '==', valor_prompt)
    ).get()

    logs_encontrados = []
    if not query_results:
        print(f"No se encontraron documentos con el prompt '{valor_prompt}'.")
        return []

    for doc in query_results:
        log_data = doc.to_dict()
        log_data['id'] = doc.id # Añade el ID del documento al diccionario de datos
        logs_encontrados.append(log_data)
        
    return logs_encontrados

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}")

def obtener_documentos_habilitados(coleccion):
    """
    Obtiene una lista de los IDs de todos los documentos en la colección
    cuyo campo 'habilitado' es true.

    Args:
        coleccion (str): El nombre de la colección a consultar.

    Returns:
        list: Una lista de strings, donde cada string es el ID de un documento
              habilitado.
    """
    print(f"--- Buscando documentos habilitados en la colección '{coleccion}' ---")
    
    try:
        # 1. Referencia a la colección con el nombre del parámetro
        query_results = db.collection(coleccion).where(
            filter=firestore.FieldFilter('habilitado', '==', True)
        ).get()
        
        # 2. Itera sobre los resultados y almacena solo el ID en una lista
        # Usamos una lista por comprensión para una mayor eficiencia y simplicidad
        documentos_habilitados_ids = [doc.id for doc in query_results]
        
        if not documentos_habilitados_ids:
            print("❌ No se encontraron documentos habilitados.")
            return []
            
        print(f"✔️ Se encontraron {len(documentos_habilitados_ids)} IDs de documentos.")
        return documentos_habilitados_ids
        
    except Exception as e:
        print(f"❌ Error al obtener documentos habilitados: {e}")
        return []