File size: 6,509 Bytes
8889c22
421e233
8889c22
421e233
18aeb74
8889c22
18aeb74
 
8889c22
dc99960
8889c22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a47dee
8889c22
 
219c926
8889c22
 
 
 
 
 
 
 
 
 
 
 
421e233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a39dde
 
421e233
 
 
 
 
 
 
 
 
 
0a39dde
 
 
 
 
 
 
 
 
421e233
0a39dde
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
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('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, dato, 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(dato)    
    #Éste es el documento que tiene los datos de ella.
    documento = doc_ref.get()
    
    #Recuerda la conversión a diccionario.
    documento = doc_ref.get() 
    diccionario = documento.to_dict()
    return diccionario.get(info)

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