13
13
load_dotenv ()
14
14
15
15
# Configuración de Supabase
16
- SUPABASE_URL = os .getenv ("SUPABASE_URL" )
17
- SUPABASE_KEY = os .getenv ("SUPABASE_KEY" )
16
+ SUPABASE_URL = os .getenv ("SUPABASE_URL" ) # URL de Supabase
17
+ SUPABASE_KEY = os .getenv ("SUPABASE_KEY" ) # Clave de la API de Supabase
18
+ # Crear cliente de Supabase
18
19
supabase = create_client (SUPABASE_URL , SUPABASE_KEY )
19
20
20
21
# Crear la aplicación FastAPI
@@ -31,7 +32,10 @@ def read_root():
31
32
return {"message" : "Bienvenido a la API de gestión de usuarios" }
32
33
33
34
# Clases Pydantic para ítems y usuarios
35
+
36
+
34
37
class Description (BaseModel ):
38
+ """Modelo para la descripción detallada de un ítem."""
35
39
DriverNumber : str
36
40
LapTime : Optional [str ] = None
37
41
Sector1Time : Optional [str ] = None
@@ -44,25 +48,36 @@ class Description(BaseModel):
44
48
45
49
46
50
class Item (BaseModel ):
51
+ """Modelo para un ítem que incluye id, nombre y descripción."""
47
52
id : int
48
53
name : str
49
54
description : Description
50
55
51
56
52
57
class ItemCreate (BaseModel ):
58
+ """Modelo para la creación de un nuevo ítem."""
53
59
name : str
54
60
description : Description
55
61
56
62
57
63
class UserUpdate (BaseModel ):
64
+ """Modelo para actualizar los datos de un usuario."""
58
65
nick : Optional [str ] = None
59
66
name : Optional [str ] = None
60
67
surname : Optional [str ] = None
61
68
gender : Optional [str ] = None
62
69
email : Optional [str ] = None
63
70
64
71
# Funciones auxiliares para manejo de JSON
72
+
73
+
65
74
def read_data ():
75
+ """
76
+ Lee los datos desde un archivo JSON y los procesa.
77
+
78
+ Returns:
79
+ list: Lista de ítems con id y nombre asignados si no existen.
80
+ """
66
81
try :
67
82
with open ("app/data/data_filtered_pilots.json" , "r" , encoding = "utf-8" ) as file :
68
83
data = json .load (file )
@@ -75,10 +90,18 @@ def read_data():
75
90
except FileNotFoundError :
76
91
return []
77
92
93
+
78
94
def write_data (data ):
95
+ """
96
+ Escribe los datos en un archivo JSON.
97
+
98
+ Args:
99
+ data (list): Lista de ítems a escribir.
100
+ """
79
101
with open ("app/data/data_filtered_pilots.json" , "w" , encoding = "utf-8" ) as file :
80
102
json .dump (data , file , indent = 4 )
81
103
104
+
82
105
@app .post ("/register" )
83
106
def register_user (
84
107
nick : str ,
@@ -89,9 +112,21 @@ def register_user(
89
112
password : str
90
113
):
91
114
"""
92
- endpoint registro usuarios
115
+ Endpoint para registrar nuevos usuarios.
116
+
117
+ Args:
118
+ nick (str): Apodo del usuario.
119
+ name (str): Nombre del usuario.
120
+ surname (str): Apellido del usuario.
121
+ gender (str): Género del usuario.
122
+ email (str): Correo electrónico del usuario.
123
+ password (str): Contraseña del usuario.
124
+
125
+ Returns:
126
+ dict: Mensaje de confirmación.
93
127
"""
94
- hashed_password = get_password_hash (password )
128
+ hashed_password = get_password_hash (
129
+ password ) # Generar hash de la contraseña
95
130
response = supabase .table ("users" ).insert ({
96
131
"nick" : nick ,
97
132
"name" : name ,
@@ -101,16 +136,26 @@ def register_user(
101
136
"password" : hashed_password ,
102
137
}).execute ()
103
138
104
- print (response ) # Depurar la estructura de la respuesta
139
+ print (response ) # Imprimir respuesta para depuración
105
140
return {"message" : "¡USUARIO CREADO EXITOSAMENTE!" }
106
141
107
142
108
143
@app .post ("/token" , response_model = None )
109
144
def login_for_access_token (form_data : OAuth2PasswordRequestForm = Depends ()):
110
145
"""
111
- Crea token para la autenticación
146
+ Crea un token de acceso para autenticación.
147
+
148
+ Args:
149
+ form_data (OAuth2PasswordRequestForm): Datos del formulario de inicio de sesión.
150
+
151
+ Raises:
152
+ HTTPException: Si las credenciales son inválidas.
153
+
154
+ Returns:
155
+ dict: Token de acceso y tipo de token.
112
156
"""
113
- response = supabase .table ("users" ).select ("*" ).eq ("nick" , form_data .username ).execute ()
157
+ response = supabase .table ("users" ).select (
158
+ "*" ).eq ("nick" , form_data .username ).execute ()
114
159
user = response .data [0 ] if response .data else None
115
160
if not user or not verify_password (form_data .password , user ["password" ]):
116
161
raise HTTPException (status_code = 400 , detail = "Credenciales inválidas" )
@@ -121,23 +166,40 @@ def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
121
166
122
167
@app .get ("/users/me" )
123
168
def read_users_me (current_user : str = Depends (get_current_user )):
169
+ """
170
+ Obtiene los datos del usuario actual autenticado.
171
+
172
+ Args:
173
+ current_user (str): Correo electrónico del usuario actual.
124
174
125
- response = supabase .table ("users" ).select ("*" ).eq ("email" , current_user ).execute ()
175
+ Raises:
176
+ HTTPException: Si el usuario no es encontrado.
126
177
178
+ Returns:
179
+ dict: Datos del usuario actual.
180
+ """
181
+ response = supabase .table ("users" ).select (
182
+ "*" ).eq ("email" , current_user ).execute ()
127
183
if not response .data :
128
184
raise HTTPException (status_code = 404 , detail = "Usuario no encontrado" )
129
185
return response .data [0 ]
130
186
187
+ # Operaciones relacionadas con usuarios desde Supabase
131
188
132
189
133
- ##################################################################################################
134
-
135
-
136
- # Operaciones relacionadas con usuarios desde Supabase
137
190
@app .get ("/users/supabase" , tags = ["Usuarios" ])
138
191
async def get_users_from_supabase (current_user : str = Depends (get_current_user )):
139
192
"""
140
- Devuelve todos los usuarios de la base de datos
193
+ Devuelve todos los usuarios almacenados en Supabase.
194
+
195
+ Args:
196
+ current_user (str): Correo electrónico del usuario actual.
197
+
198
+ Raises:
199
+ HTTPException: Si ocurre un error al obtener los datos.
200
+
201
+ Returns:
202
+ dict: Mensaje y lista de usuarios.
141
203
"""
142
204
try :
143
205
supabase_client = SupabaseAPI ("users" , "*" )
@@ -146,28 +208,57 @@ async def get_users_from_supabase(current_user: str = Depends(get_current_user))
146
208
return {"message" : "No se encontraron usuarios" , "data" : []}
147
209
return {"message" : "Usuarios obtenidos exitosamente" , "data" : users }
148
210
except Exception as e :
149
- raise HTTPException (status_code = 500 , detail = f"Error al obtener datos de Supabase: { str (e )} " )
211
+ raise HTTPException (
212
+ status_code = 500 , detail = f"Error al obtener datos de Supabase: { str (e )} " )
150
213
151
- # TODO cambiar filtro a por nick
152
214
153
215
@app .put ("/users/{email}" , tags = ["Usuarios" ])
154
216
async def update_user (email : str , user_update : UserUpdate , current_user : str = Depends (get_current_user )):
217
+ """
218
+ Actualiza un usuario existente.
219
+
220
+ Args:
221
+ email (str): Correo electrónico del usuario a actualizar.
222
+ user_update (UserUpdate): Datos a actualizar.
223
+ current_user (str): Correo electrónico del usuario actual.
224
+
225
+ Raises:
226
+ HTTPException: Si no se proporcionan datos o si ocurre un error.
227
+
228
+ Returns:
229
+ dict: Mensaje y datos actualizados.
230
+ """
155
231
try :
156
- update_data = {k : v for k , v in user_update .dict ().items () if v is not None }
232
+ update_data = {k : v for k , v in user_update .dict ().items ()
233
+ if v is not None }
157
234
if not update_data :
158
- raise HTTPException (status_code = 400 , detail = "No se proporcionaron datos para actualizar" )
159
- supabase_client = SupabaseAPI (tabla = "users" , select = "*" , data = update_data )
235
+ raise HTTPException (
236
+ status_code = 400 , detail = "No se proporcionaron datos para actualizar" )
237
+ supabase_client = SupabaseAPI (
238
+ tabla = "users" , select = "*" , data = update_data )
160
239
response = supabase_client .update_user (email , update_data )
161
240
return {"message" : "Usuario actualizado exitosamente" , "data" : response .data }
162
241
except ValueError as ve :
163
242
raise HTTPException (status_code = 404 , detail = str (ve ))
164
243
except Exception as e :
165
- raise HTTPException (status_code = 500 , detail = f"Error actualizando usuario: { str (e )} " )
244
+ raise HTTPException (
245
+ status_code = 500 , detail = f"Error actualizando usuario: { str (e )} " )
246
+
166
247
167
248
@app .delete ("/users/{nick}" , tags = ["Usuarios" ])
168
249
async def delete_user (nick : str , current_user : str = Depends (get_current_user )):
169
250
"""
170
- Borra usuario solo si está autenticado
251
+ Elimina un usuario especificado por su nick.
252
+
253
+ Args:
254
+ nick (str): Apodo del usuario a eliminar.
255
+ current_user (str): Correo electrónico del usuario actual.
256
+
257
+ Raises:
258
+ HTTPException: Si ocurre un error durante la eliminación.
259
+
260
+ Returns:
261
+ dict: Mensaje de confirmación y datos de la operación.
171
262
"""
172
263
try :
173
264
supabase_client = SupabaseAPI (tabla = "users" , select = "*" )
0 commit comments