AIdeaText commited on
Commit
3d560cd
verified
1 Parent(s): 6e40c50

Update modules/database/database_init.py

Browse files
Files changed (1) hide show
  1. modules/database/database_init.py +142 -79
modules/database/database_init.py CHANGED
@@ -1,80 +1,143 @@
1
- import os
2
- import logging
3
- from azure.cosmos import CosmosClient
4
- from pymongo import MongoClient
5
- import certifi
6
-
7
- logging.basicConfig(level=logging.DEBUG)
8
- logger = logging.getLogger(__name__)
9
-
10
- # Variables globales para Cosmos DB SQL API
11
- cosmos_client = None
12
- user_database = None
13
- user_container = None
14
- application_requests_container = None
15
- user_feedback_container = None
16
-
17
- # Variables globales para Cosmos DB MongoDB API
18
- mongo_client = None
19
- mongo_db = None
20
-
21
- def initialize_cosmos_sql_connection():
22
- global cosmos_client, user_database, user_container, application_requests_container, user_feedback_container
23
- try:
24
- cosmos_endpoint = os.environ.get("COSMOS_ENDPOINT")
25
- cosmos_key = os.environ.get("COSMOS_KEY")
26
-
27
- if not cosmos_endpoint or not cosmos_key:
28
- raise ValueError("COSMOS_ENDPOINT and COSMOS_KEY environment variables must be set")
29
-
30
- cosmos_client = CosmosClient(cosmos_endpoint, cosmos_key)
31
- user_database = cosmos_client.get_database_client("user_database")
32
- user_container = user_database.get_container_client("users")
33
- application_requests_container = user_database.get_container_client("application_requests")
34
- user_feedback_container = user_database.get_container_client("user_feedback")
35
-
36
- logger.info("Conexi贸n a Cosmos DB SQL API exitosa")
37
- return True
38
- except Exception as e:
39
- logger.error(f"Error al conectar con Cosmos DB SQL API: {str(e)}", exc_info=True)
40
- return False
41
-
42
- def initialize_mongodb_connection():
43
- global mongo_client, mongo_db
44
- try:
45
- cosmos_mongodb_connection_string = os.getenv("MONGODB_CONNECTION_STRING")
46
- if not cosmos_mongodb_connection_string:
47
- raise ValueError("MONGODB_CONNECTION_STRING environment variable is not set")
48
-
49
- mongo_client = MongoClient(cosmos_mongodb_connection_string,
50
- tls=True,
51
- tlsCAFile=certifi.where(),
52
- retryWrites=False,
53
- serverSelectionTimeoutMS=5000,
54
- connectTimeoutMS=10000,
55
- socketTimeoutMS=10000)
56
-
57
- mongo_client.admin.command('ping')
58
-
59
- mongo_db = mongo_client['aideatext_db']
60
-
61
- logger.info("Conexi贸n a Cosmos DB MongoDB API exitosa")
62
- return True
63
- except Exception as e:
64
- logger.error(f"Error al conectar con Cosmos DB MongoDB API: {str(e)}", exc_info=True)
65
- return False
66
-
67
- def initialize_database_connections():
68
- sql_success = initialize_cosmos_sql_connection()
69
- mongodb_success = initialize_mongodb_connection()
70
- return sql_success and mongodb_success
71
-
72
- def get_sql_containers():
73
- if user_container is None or application_requests_container is None or user_feedback_container is None:
74
- initialize_cosmos_sql_connection()
75
- return user_container, application_requests_container, user_feedback_container
76
-
77
- def get_mongodb():
78
- if mongo_db is None:
79
- initialize_mongodb_connection()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  return mongo_db
 
1
+ import os
2
+ import logging
3
+ from azure.cosmos import CosmosClient
4
+ from pymongo import MongoClient
5
+ import certifi
6
+
7
+ logging.basicConfig(level=logging.DEBUG)
8
+ logger = logging.getLogger(__name__)
9
+
10
+ # Variables globales para Cosmos DB SQL API
11
+ cosmos_client = None
12
+ user_database = None
13
+ user_container = None
14
+ application_requests_container = None
15
+ user_feedback_container = None
16
+ user_sessions_container = None # Agregado para sessions
17
+
18
+ # Variables globales para Cosmos DB MongoDB API
19
+ mongo_client = None
20
+ mongo_db = None
21
+
22
+ def verify_container_partition_key(container, expected_path):
23
+ """Verifica la configuraci贸n de partition key de un contenedor"""
24
+ try:
25
+ container_props = container.read()
26
+ partition_key_paths = container_props['partitionKey']['paths']
27
+
28
+ logger.info(f"Container: {container.id}, Partition Key Paths: {partition_key_paths}")
29
+
30
+ if expected_path not in partition_key_paths:
31
+ logger.warning(
32
+ f"Partition key incorrecta en {container.id}. "
33
+ f"Actual: {partition_key_paths}, Esperada: {expected_path}"
34
+ )
35
+ return False
36
+ return True
37
+ except Exception as e:
38
+ logger.error(f"Error verificando partition key en {container.id}: {str(e)}")
39
+ return False
40
+
41
+ def initialize_cosmos_sql_connection():
42
+ """Inicializa y verifica la conexi贸n a Cosmos DB SQL API"""
43
+ global cosmos_client, user_database, user_container, \
44
+ application_requests_container, user_feedback_container, \
45
+ user_sessions_container
46
+
47
+ try:
48
+ cosmos_endpoint = os.environ.get("COSMOS_ENDPOINT")
49
+ cosmos_key = os.environ.get("COSMOS_KEY")
50
+
51
+ if not cosmos_endpoint or not cosmos_key:
52
+ raise ValueError("COSMOS_ENDPOINT and COSMOS_KEY environment variables must be set")
53
+
54
+ # Inicializar cliente y obtener contenedores
55
+ cosmos_client = CosmosClient(cosmos_endpoint, cosmos_key)
56
+ user_database = cosmos_client.get_database_client("user_database")
57
+
58
+ # Configuraci贸n de contenedores y sus partition keys esperadas
59
+ containers_config = {
60
+ "users": ("/id", user_container),
61
+ "application_requests": ("/email", application_requests_container),
62
+ "user_feedback": ("/username", user_feedback_container),
63
+ "users_sessions": ("/username", user_sessions_container)
64
+ }
65
+
66
+ # Inicializar y verificar cada contenedor
67
+ for container_id, (expected_path, container_ref) in containers_config.items():
68
+ container = user_database.get_container_client(container_id)
69
+ if not verify_container_partition_key(container, expected_path):
70
+ logger.error(f"Verificaci贸n de partition key fall贸 para {container_id}")
71
+ return False
72
+
73
+ # Actualizar la referencia global
74
+ if container_id == "users":
75
+ user_container = container
76
+ elif container_id == "application_requests":
77
+ application_requests_container = container
78
+ elif container_id == "user_feedback":
79
+ user_feedback_container = container
80
+ elif container_id == "users_sessions":
81
+ user_sessions_container = container
82
+
83
+ logger.info("Conexi贸n a Cosmos DB SQL API exitosa y particiones verificadas")
84
+ return True
85
+
86
+ except Exception as e:
87
+ logger.error(f"Error al conectar con Cosmos DB SQL API: {str(e)}", exc_info=True)
88
+ return False
89
+
90
+ def initialize_mongodb_connection():
91
+ """Inicializa la conexi贸n a Cosmos DB MongoDB API"""
92
+ global mongo_client, mongo_db
93
+ try:
94
+ cosmos_mongodb_connection_string = os.getenv("MONGODB_CONNECTION_STRING")
95
+ if not cosmos_mongodb_connection_string:
96
+ raise ValueError("MONGODB_CONNECTION_STRING environment variable is not set")
97
+
98
+ mongo_client = MongoClient(
99
+ cosmos_mongodb_connection_string,
100
+ tls=True,
101
+ tlsCAFile=certifi.where(),
102
+ retryWrites=False,
103
+ serverSelectionTimeoutMS=5000,
104
+ connectTimeoutMS=10000,
105
+ socketTimeoutMS=10000
106
+ )
107
+
108
+ # Verificar conexi贸n
109
+ mongo_client.admin.command('ping')
110
+ mongo_db = mongo_client['aideatext_db']
111
+
112
+ logger.info("Conexi贸n a Cosmos DB MongoDB API exitosa")
113
+ return True
114
+
115
+ except Exception as e:
116
+ logger.error(f"Error al conectar con Cosmos DB MongoDB API: {str(e)}", exc_info=True)
117
+ return False
118
+
119
+ def initialize_database_connections():
120
+ """Inicializa todas las conexiones a bases de datos"""
121
+ sql_success = initialize_cosmos_sql_connection()
122
+ mongodb_success = initialize_mongodb_connection()
123
+
124
+ if sql_success and mongodb_success:
125
+ logger.info("Todas las conexiones a bases de datos inicializadas correctamente")
126
+ else:
127
+ logger.error("Fall贸 la inicializaci贸n de una o m谩s conexiones a bases de datos")
128
+
129
+ return sql_success and mongodb_success
130
+
131
+ def get_sql_containers():
132
+ """Obtiene los contenedores SQL, reinicializando si es necesario"""
133
+ if any(container is None for container in
134
+ [user_container, application_requests_container,
135
+ user_feedback_container, user_sessions_container]):
136
+ initialize_cosmos_sql_connection()
137
+ return user_container, application_requests_container, user_feedback_container, user_sessions_container
138
+
139
+ def get_mongodb():
140
+ """Obtiene la conexi贸n MongoDB, reinicializando si es necesario"""
141
+ if mongo_db is None:
142
+ initialize_mongodb_connection()
143
  return mongo_db