File size: 9,284 Bytes
5a585eb
29ca692
3d560cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a585eb
3d560cd
 
 
 
 
da81392
3d560cd
 
 
 
 
 
5a585eb
3d560cd
 
 
 
da81392
e9d3c28
1471b74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a585eb
 
220a9a0
 
 
da81392
e9d3c28
 
 
 
 
 
 
 
 
da81392
 
74be285
32ec062
 
da81392
 
32ec062
 
 
e9d3c28
32ec062
 
 
1471b74
e9d3c28
da81392
1471b74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d560cd
da81392
 
3d560cd
 
da81392
220a9a0
 
3d560cd
 
 
 
da81392
3d560cd
 
 
 
74be285
da81392
 
 
74be285
da81392
5a585eb
3d560cd
 
 
5a585eb
3d560cd
1471b74
da81392
 
3d560cd
da81392
3d560cd
 
da81392
 
 
3d560cd
 
da81392
3d560cd
 
 
 
 
 
 
 
 
 
 
da81392
3d560cd
 
da81392
3d560cd
da81392
5a585eb
3d560cd
da81392
3d560cd
5a585eb
3d560cd
 
c58df45
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# 1. modules/database/database_init.py

import os
import logging
from azure.cosmos import CosmosClient
from pymongo import MongoClient
import certifi

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# Variables globales para Cosmos DB SQL API
cosmos_client = None
user_database = None
user_container = None
application_requests_container = None
user_feedback_container = None
user_sessions_container = None

# Variables globales para Cosmos DB MongoDB API
mongo_client = None
mongo_db = None

###################################################################
def verify_container_partition_key(container, expected_path):
    """Verifica la configuraci贸n de partition key de un contenedor"""
    try:
        container_props = container.read()
        partition_key_paths = container_props['partitionKey']['paths']
        logger.info(f"Container: {container.id}, Partition Key Paths: {partition_key_paths}")
        return expected_path in partition_key_paths
    except Exception as e:
        logger.error(f"Error verificando partition key en {container.id}: {str(e)}")
        return False

###################################################################

def get_container(container_name):
    """Obtiene un contenedor espec铆fico"""
    logger.info(f"Solicitando contenedor: {container_name}")
    
    if not initialize_cosmos_sql_connection():
        logger.error("No se pudo inicializar la conexi贸n")
        return None
    
    # Verificar estado de los contenedores
    containers_status = {
        "users": user_container is not None,
        "users_sessions": user_sessions_container is not None,
        "application_requests": application_requests_container is not None
    }
    
    logger.info(f"Estado actual de los contenedores: {containers_status}")
    
    # Mapear nombres a contenedores
    containers = {
        "users": user_container,
        "users_sessions": user_sessions_container,
        "application_requests": application_requests_container
    }
    
    container = containers.get(container_name)
    
    if container is None:
        logger.error(f"Contenedor '{container_name}' no encontrado o no inicializado")
        logger.error(f"Contenedores disponibles: {[k for k, v in containers_status.items() if v]}")
        return None
        
    logger.info(f"Contenedor '{container_name}' obtenido exitosamente")
    return container


###################################################################
'''
def get_container(container_name):
    """Obtiene un contenedor espec铆fico"""
    if not initialize_cosmos_sql_connection():
        logger.error("No se pudo inicializar la conexi贸n")
        return None
    
    # Loggear los contenedores disponibles para debug
    available_containers = {
        "users": user_container is not None,
        "users_sessions": user_sessions_container is not None,
        "application_requests": application_requests_container is not None,
        "user_feedback": user_feedback_container is not None
    }
    logger.debug(f"Contenedores disponibles: {available_containers}")
    
    containers = {
        "users": user_container,
        "users_sessions": user_sessions_container,
        "application_requests": application_requests_container,
        "user_feedback": user_feedback_container
    }
    
    container = containers.get(container_name)
    if not container:
        logger.error(f"Contenedor no encontrado: {container_name}")
        logger.error(f"Contenedores disponibles: {list(containers.keys())}")
        return None
        
    return container
'''

###################################################################

def initialize_cosmos_sql_connection():
    """Inicializa la conexi贸n a Cosmos DB SQL API"""
    global cosmos_client, user_database, user_container, user_sessions_container, application_requests_container

    try:
        # Verificar conexi贸n existente
        if all([
            cosmos_client,
            user_database,
            user_container,
            user_sessions_container,
            application_requests_container
        ]):
            logger.debug("Todas las conexiones ya est谩n inicializadas")
            return True

        # Obtener credenciales
        cosmos_endpoint = os.environ.get("COSMOS_ENDPOINT")
        cosmos_key = os.environ.get("COSMOS_KEY")
        
        if not cosmos_endpoint or not cosmos_key:
            raise ValueError("COSMOS_ENDPOINT y COSMOS_KEY deben estar configurados")

        # Inicializar cliente y base de datos
        cosmos_client = CosmosClient(cosmos_endpoint, cosmos_key)
        user_database = cosmos_client.get_database_client("user_database")
        
        # Inicializar cada contenedor individualmente con verificaci贸n
        try:
            user_container = user_database.get_container_client("users")
            logger.info("Contenedor 'users' inicializado correctamente")
        except Exception as e:
            logger.error(f"Error inicializando contenedor 'users': {str(e)}")
            user_container = None

        try:
            user_sessions_container = user_database.get_container_client("users_sessions")
            logger.info("Contenedor 'users_sessions' inicializado correctamente")
        except Exception as e:
            logger.error(f"Error inicializando contenedor 'users_sessions': {str(e)}")
            user_sessions_container = None

        try:
            application_requests_container = user_database.get_container_client("application_requests")
            logger.info("Contenedor 'application_requests' inicializado correctamente")
        except Exception as e:
            logger.error(f"Error inicializando contenedor 'application_requests': {str(e)}")
            application_requests_container = None

        # Verificar el estado de los contenedores
        containers_status = {
            'users': user_container is not None,
            'users_sessions': user_sessions_container is not None,
            'application_requests': application_requests_container is not None
        }
        
        logger.info(f"Estado de los contenedores: {containers_status}")
        
        # Solo retornar True si todos los contenedores se inicializaron correctamente
        if all(containers_status.values()):
            logger.info("Todos los contenedores inicializados correctamente")
            return True
        else:
            logger.error("No se pudieron inicializar todos los contenedores")
            return False

    except Exception as e:
        logger.error(f"Error al conectar con Cosmos DB SQL API: {str(e)}")
        return False



######################################################

'''
def initialize_cosmos_sql_connection():
    """Inicializa la conexi贸n a Cosmos DB SQL API"""
    global cosmos_client, user_database, user_container, user_sessions_container

    try:
        if cosmos_client and user_database and user_container and user_sessions_container:
            return True

        cosmos_endpoint = os.environ.get("COSMOS_ENDPOINT")
        cosmos_key = os.environ.get("COSMOS_KEY")
        
        if not cosmos_endpoint or not cosmos_key:
            raise ValueError("COSMOS_ENDPOINT y COSMOS_KEY deben estar configurados")

        cosmos_client = CosmosClient(cosmos_endpoint, cosmos_key)
        user_database = cosmos_client.get_database_client("user_database")
        
        
        # Inicializar contenedores manteniendo la estructura existente
        user_container = user_database.get_container_client("users")
        user_sessions_container = user_database.get_container_client("users_sessions")
        application_requests_container = user_database.get_container_client("application_requests")
        
        logger.info("Conexi贸n a Cosmos DB SQL API exitosa")
        return True

    except Exception as e:
        logger.error(f"Error al conectar con Cosmos DB SQL API: {str(e)}")
        return False
'''        
        
###################################################################
def initialize_mongodb_connection():
    """Inicializa la conexi贸n a MongoDB"""
    global mongo_client, mongo_db
    try:
        connection_string = os.getenv("MONGODB_CONNECTION_STRING")
        if not connection_string:
            raise ValueError("MONGODB_CONNECTION_STRING debe estar configurado")

        mongo_client = MongoClient(
            connection_string,
            tls=True,
            tlsCAFile=certifi.where(),
            retryWrites=False,
            serverSelectionTimeoutMS=5000,
            connectTimeoutMS=10000,
            socketTimeoutMS=10000
        )
        
        mongo_db = mongo_client['aideatext_db']
        return True
    except Exception as e:
        logger.error(f"Error conectando a MongoDB: {str(e)}")
        return False

###################################################################
def initialize_database_connections():
    """Inicializa todas las conexiones"""
    return initialize_cosmos_sql_connection() and initialize_mongodb_connection()

###################################################################
def get_mongodb():
    """Obtiene la conexi贸n MongoDB"""
    if mongo_db is None:
        initialize_mongodb_connection()
    return mongo_db