JairoDanielMT commited on
Commit
58d0953
·
1 Parent(s): d0c5fd0

Corrección de tablas y mejora en la documentación e implementación de Singleton

Browse files
Files changed (4) hide show
  1. Dockerfile +0 -1
  2. __pycache__/main.cpython-310.pyc +0 -0
  3. main.py +545 -367
  4. optica.db +0 -0
Dockerfile CHANGED
@@ -9,7 +9,6 @@ RUN pip install --no-cache-dir -r /code/requirements.txt
9
 
10
  COPY . .
11
 
12
- # Cambia los permisos del directorio
13
  RUN chmod -R 777 /code
14
 
15
  # Comando para ejecutar la aplicación
 
9
 
10
  COPY . .
11
 
 
12
  RUN chmod -R 777 /code
13
 
14
  # Comando para ejecutar la aplicación
__pycache__/main.cpython-310.pyc ADDED
Binary file (18.7 kB). View file
 
main.py CHANGED
@@ -6,424 +6,364 @@ app = FastAPI()
6
  # uvicorn main:app --host localhost --port 7860 --reload
7
 
8
 
9
- def get_db_connection():
10
  """
11
- Establece una conexión a la base de datos optica.db y configura el objeto de conexión para devolver filas como objetos Row de SQLite.
12
-
13
- Devuelve las filas como objetos Row de SQLite (para poder acceder a los campos por nombre) sin eso el formato es lista de tuplas y no se puede acceder a los campos por nombre de columna (solo por indice)
14
-
15
- Returns:
16
- conn (sqlite3.Connection): Objeto de conexión a la base de datos.
17
  """
18
- conn = sqlite3.connect("optica.db")
19
- conn.row_factory = sqlite3.Row
20
- return conn
21
 
 
22
 
23
- ######################
24
- # CREATE TABLE usuario (
25
- # Id INTEGER PRIMARY KEY AUTOINCREMENT,
26
- # Nombre_usuario VARCHAR,
27
- # Clave VARCHAR,
28
- # Pregunta_recuperacion VARCHAR,
29
- # Respuesta VARCHAR,
30
- # Estado VARCHAR
31
- # )
32
- ######################
33
- # metodos get, post, put, delete para la tabla usuario deben retornar un json
 
 
 
 
34
 
35
 
36
- # pagina de inicio
37
  @app.get("/")
38
- def home():
39
- """
40
- Página de inicio de la API.
41
 
42
  Returns:
43
- dict: Un diccionario con un mensaje de bienvenida.
44
  """
45
- return {"message": "Bienvenido a la API de la óptica"}
46
 
47
 
48
- # GET /usuario
49
- # Obtener todos los usuarios
50
  @app.get("/usuarios")
51
  def get_usuarios():
52
  """
53
- Obtiene una lista de usuarios desde la base de datos.
54
 
55
  Returns:
56
- list[dict]: Una lista de diccionarios que representan los usuarios.
57
  """
58
- conn = get_db_connection()
59
  cursor = conn.cursor()
60
  cursor.execute("SELECT * FROM usuario")
61
  usuarios = cursor.fetchall()
62
- conn.close()
63
  return usuarios
64
 
65
 
66
- # Obtener un usuario por ID
67
- @app.get("/usuarios/{usuario_id}")
68
- def get_usuario(usuario_id: int):
69
  """
70
- Obtiene un usuario de la base de datos según su ID.
71
 
72
  Parámetros:
73
- - usuario_id (int): El ID del usuario a obtener.
74
 
75
  Retorna:
76
  - dict: Un diccionario con la información del usuario.
77
 
78
  Lanza:
79
- - HTTPException: Si el usuario no se encuentra en la base de datos.
80
  """
81
- conn = get_db_connection()
82
  cursor = conn.cursor()
83
- cursor.execute("SELECT * FROM usuario WHERE Id = ?", (usuario_id,))
84
  usuario = cursor.fetchone()
85
- conn.close()
86
  if usuario:
87
  return usuario
88
- else:
89
- raise HTTPException(status_code=404, detail="Usuario no encontrado")
90
 
91
 
92
- # POST /usuario
93
- # se necesita crear una clase que represente el modelo de usuario en la tabla usuario
94
- class UsuarioCreate(BaseModel):
95
- """
96
- Clase que representa el modelo de un usuario al momento de crearlo.
97
- """
98
-
99
  Nombre_usuario: str
100
  Clave: str
101
  Pregunta_recuperacion: str
102
  Respuesta: str
103
- Estado: str
104
-
105
-
106
- ## Crear un nuevo usuario
107
- # @app.post("/usuarios/", response_model=dict)
108
- # def create_usuario(usuario: UsuarioCreate = Body(...)):
109
- # """
110
- # Crea un nuevo usuario en la base de datos.
111
- #
112
- # Args:
113
- # usuario (UsuarioCreate): Los datos del usuario a crear.
114
- #
115
- # Returns:
116
- # dict: Un diccionario que contiene el ID del nuevo usuario y los datos del usuario creado.
117
- # """
118
- # conn = get_db_connection()
119
- # cursor = conn.cursor()
120
- #
121
- # # Insertar nuevo usuario en la base de datos
122
- # cursor.execute(
123
- # """
124
- # INSERT INTO usuario (Nombre_usuario, Clave, Pregunta_recuperacion, Respuesta, Estado)
125
- # VALUES (?, ?, ?, ?, ?)
126
- # """,
127
- # (
128
- # usuario.Nombre_usuario,
129
- # usuario.Clave,
130
- # usuario.Pregunta_recuperacion,
131
- # usuario.Respuesta,
132
- # usuario.Estado,
133
- # ),
134
- # )
135
- # # Obtener el ID del nuevo usuario
136
- # nuevo_usuario_id = cursor.lastrowid
137
- # # Confirmar los cambios y cerrar la conexión
138
- # conn.commit()
139
- # conn.close()
140
- # # Devolver el nuevo usuario creado
141
- # return {"Id": nuevo_usuario_id, **usuario.dict()}
142
- #
143
-
144
-
145
- # PUT /usuario
146
- @app.put("/usuarios/{usuario_id}")
147
- def update_usuario(usuario_id: int, usuario: UsuarioCreate = Body(...)):
148
  """
149
  Actualiza un usuario en la base de datos.
150
 
151
  Parámetros:
152
- - usuario_id (int): El ID del usuario a actualizar.
153
- - usuario (UsuarioCreate): Los datos del usuario a actualizar.
154
 
155
  Retorna:
156
- - dict: Un diccionario que contiene el ID del usuario actualizado y los datos del usuario actualizado.
157
 
158
  Lanza:
159
- - HTTPException: Si el usuario no se encuentra en la base de datos.
160
  """
161
- conn = get_db_connection()
162
  cursor = conn.cursor()
163
-
164
- # Actualizar usuario en la base de datos
165
  cursor.execute(
166
  """
167
  UPDATE usuario
168
- SET Nombre_usuario = ?, Clave = ?, Pregunta_recuperacion = ?, Respuesta = ?, Estado = ?
 
 
 
 
169
  WHERE Id = ?
170
- """,
171
  (
172
  usuario.Nombre_usuario,
173
  usuario.Clave,
174
  usuario.Pregunta_recuperacion,
175
  usuario.Respuesta,
176
- usuario.Estado,
177
- usuario_id,
178
  ),
179
  )
180
- # Confirmar los cambios y cerrar la conexión
181
  conn.commit()
182
- conn.close()
183
- # Devolver el usuario actualizado
184
- return {"Id": usuario_id, **usuario.dict()}
 
 
 
 
 
 
185
 
 
 
 
 
 
186
 
187
- # CREATE TABLE cliente (
188
- # Id INTEGER PRIMARY KEY AUTOINCREMENT,
189
- # Nombres_completos VARCHAR,
190
- # Telefono VARCHAR,
191
- # Edad INTEGER,
192
- # Direccion VARCHAR,
193
- # fecha_registro VARCHAR,
194
- # Nota_adicional VARCHAR
195
- # )
 
196
 
197
 
198
- # GET /cliente
199
- # Obtener todos los clientes
200
  @app.get("/clientes")
201
  def get_clientes():
202
  """
203
- Obtiene una lista de clientes desde la base de datos.
204
 
205
  Returns:
206
- list[dict]: Una lista de diccionarios que representan los clientes.
207
  """
208
- conn = get_db_connection()
209
  cursor = conn.cursor()
210
  cursor.execute("SELECT * FROM cliente")
211
  clientes = cursor.fetchall()
212
- conn.close()
213
  return clientes
214
 
215
 
216
- # Obtener un cliente por nombres completos (convertidos a minúsculas)
217
- @app.get("/clientes/{nombres_completos}")
218
- def buscar_cliente(nombres_completos: str):
219
  """
220
- Obtiene un cliente de la base de datos según su nombre completo.
221
 
222
  Parámetros:
223
- - nombres_completos (str): El nombre completo del cliente a obtener.
224
 
225
  Retorna:
226
- - dict: Un diccionario con la información del cliente.
227
 
228
  Lanza:
229
- - HTTPException: Si el cliente no se encuentra en la base de datos.
230
  """
231
- nombres_completos_lower = (
232
- nombres_completos.lower()
233
- ) # Convertir a minúsculas para la búsqueda
234
- conn = get_db_connection()
235
  cursor = conn.cursor()
236
- cursor.execute(
237
- "SELECT * FROM cliente WHERE LOWER(Nombres_completos) = ?",
238
- (nombres_completos_lower,),
239
- )
240
  cliente = cursor.fetchone()
241
- conn.close()
242
  if cliente:
243
  return cliente
244
- else:
245
- raise HTTPException(status_code=404, detail="Cliente no encontrado")
246
 
247
 
248
- # POST /cliente
249
- # se necesita crear una clase que represente el modelo de cliente en la tabla cliente
250
- class ClienteCreate(BaseModel):
251
- """
252
- Clase que representa el modelo de un cliente al momento de crearlo.
253
- """
254
-
255
  Nombres_completos: str
256
  Telefono: str
257
  Edad: int
258
  Direccion: str
259
  fecha_registro: str
260
- Nota_adicional: str
261
 
262
 
263
- # Crear un nuevo cliente
264
- @app.post("/clientes/")
265
- def create_cliente(cliente: ClienteCreate = Body(...)):
266
  """
267
  Crea un nuevo cliente en la base de datos.
268
 
269
  Args:
270
- cliente (ClienteCreate): Los datos del cliente a crear.
271
 
272
  Returns:
273
- dict: Un diccionario que contiene el ID del nuevo cliente y los datos del cliente creado.
274
  """
275
- conn = get_db_connection()
276
  cursor = conn.cursor()
277
-
278
- # Insertar nuevo cliente en la base de datos
279
  cursor.execute(
280
  """
281
- INSERT INTO cliente (Nombres_completos, Telefono, Edad, Direccion, fecha_registro, Nota_adicional)
282
- VALUES (?, ?, ?, ?, ?, ?)
283
- """,
284
  (
285
  cliente.Nombres_completos,
286
  cliente.Telefono,
287
  cliente.Edad,
288
  cliente.Direccion,
289
  cliente.fecha_registro,
290
- cliente.Nota_adicional,
291
  ),
292
  )
293
- # Obtener el ID del nuevo cliente
294
- nuevo_cliente_id = cursor.lastrowid
295
- # Confirmar los cambios y cerrar la conexión
296
  conn.commit()
297
- conn.close()
298
- # Devolver el nuevo cliente creado
299
- return {"Id": nuevo_cliente_id, **cliente.dict()}
300
 
301
 
302
- # PUT /cliente
303
- @app.put("/clientes/{cliente_id}")
304
- def update_cliente(cliente_id: int, cliente: ClienteCreate = Body(...)):
305
  """
306
- Actualiza un cliente en la base de datos.
307
 
308
  Parámetros:
309
- - cliente_id (int): El ID del cliente a actualizar.
310
- - cliente (ClienteCreate): Los datos del cliente a actualizar.
311
 
312
  Retorna:
313
- - dict: Un diccionario que contiene el ID del cliente actualizado y los datos del cliente actualizado.
314
 
315
- Lanza:
316
- - HTTPException: Si el cliente no se encuentra en la base de datos.
317
  """
318
- conn = get_db_connection()
319
  cursor = conn.cursor()
320
-
321
- # Actualizar cliente en la base de datos
322
  cursor.execute(
323
  """
324
  UPDATE cliente
325
- SET Nombres_completos = ?, Telefono = ?, Edad = ?, Direccion = ?, fecha_registro = ?, Nota_adicional = ?
 
 
 
 
326
  WHERE Id = ?
327
- """,
328
  (
329
  cliente.Nombres_completos,
330
  cliente.Telefono,
331
  cliente.Edad,
332
  cliente.Direccion,
333
  cliente.fecha_registro,
334
- cliente.Nota_adicional,
335
- cliente_id,
336
  ),
337
  )
338
- # Confirmar los cambios y cerrar la conexión
339
  conn.commit()
340
- conn.close()
341
- # Devolver el cliente actualizado
342
- return {"Id": cliente_id, **cliente.dict()}
343
 
344
 
345
- # DELETE /cliente
346
- @app.delete("/clientes/{cliente_id}")
347
- def delete_cliente(cliente_id: int):
348
  """
349
  Elimina un cliente de la base de datos.
350
 
351
  Parámetros:
352
- - cliente_id (int): El ID del cliente a eliminar.
353
 
354
  Retorna:
355
- - dict: Un diccionario que contiene el ID del cliente eliminado.
356
 
357
  Lanza:
358
- - HTTPException: Si el cliente no se encuentra en la base de datos.
359
  """
360
- conn = get_db_connection()
361
  cursor = conn.cursor()
362
-
363
- # Eliminar cliente de la base de datos
364
- cursor.execute("DELETE FROM cliente WHERE Id = ?", (cliente_id,))
365
- # Confirmar los cambios y cerrar la conexión
366
  conn.commit()
367
- conn.close()
368
- # Devolver el cliente eliminado
369
- return {"Id": cliente_id}
370
-
371
- # CREATE TABLE detalles_opticos (
372
- # Id INTEGER PRIMARY KEY AUTOINCREMENT,
373
- # Esfera_OD_lejos VARCHAR,
374
- # Cilindro_OD_lejos VARCHAR,
375
- # Eje_OD_lejos VARCHAR,
376
- # Agudeza_visual_OD_lejos VARCHAR,
377
- # Esfera_OI_lejos VARCHAR,
378
- # Cilindro_OI_lejos VARCHAR,
379
- # Eje_OI_lejos VARCHAR,
380
- # Agudeza_visual_OI_lejos VARCHAR,
381
- # Esfera_OD_cerca VARCHAR,
382
- # Cilindro_OD_cerca VARCHAR,
383
- # Eje_OD_cerca VARCHAR,
384
- # Agudeza_visual_OD_cerca VARCHAR,
385
- # Esfera_OI_cerca VARCHAR,
386
- # Cilindro_OI_cerca VARCHAR,
387
- # Eje_OI_cerca VARCHAR,
388
- # Agudeza_visual_OI_cerca VARCHAR,
389
- # Id_cliente INTEGER REFERENCES cliente(Id)
390
- # )
391
-
392
-
393
- # GET /detalles_opticos
394
- # Obtener detalles opticos de un cliente por ID
395
- @app.get("/detalles_opticos/{cliente_id}")
396
- def get_detalles_opticos(cliente_id: int):
397
- """
398
- Obtiene los detalles ópticos de un cliente de la base de datos según su ID.
399
 
400
- Parámetros:
401
- - cliente_id (int): El ID del cliente del cual se obtendrán los detalles ópticos.
402
 
403
- Retorna:
404
- - dict: Un diccionario con la información de los detalles ópticos del cliente.
 
 
405
 
406
- Lanza:
407
- - HTTPException: Si el cliente no se encuentra en la base de datos.
408
  """
409
- conn = get_db_connection()
410
  cursor = conn.cursor()
411
- cursor.execute("SELECT * FROM detalles_opticos WHERE Id_cliente = ?", (cliente_id,))
412
- detalles_opticos = cursor.fetchone()
413
- conn.close()
414
- if detalles_opticos:
415
- return detalles_opticos
416
- else:
417
- raise HTTPException(status_code=404, detail="Detalles ópticos no encontrados")
418
 
419
 
420
- # POST /detalles_opticos
421
- # se necesita crear una clase que represente el modelo de detalles_opticos en la tabla detalles_opticos
422
- class DetallesOpticosCreate(BaseModel):
423
  """
424
- Clase que representa el modelo de detalles ópticos al momento de crearlos.
 
 
 
 
 
 
 
 
 
425
  """
 
 
 
 
 
 
 
426
 
 
 
427
  Esfera_OD_lejos: str
428
  Cilindro_OD_lejos: str
429
  Eje_OD_lejos: str
@@ -440,160 +380,398 @@ class DetallesOpticosCreate(BaseModel):
440
  Cilindro_OI_cerca: str
441
  Eje_OI_cerca: str
442
  Agudeza_visual_OI_cerca: str
443
- Id_cliente: int
444
 
445
 
446
- # Ruta para crear detalles ópticos para un cliente
447
- @app.post("/clientes/{cliente_id}/detalles_opticos")
448
- def create_detalles_opticos(
449
- cliente_id: int, detalles_opticos: DetallesOpticosCreate = Body(...)
450
- ):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
451
  """
452
- Crea y guarda los detalles ópticos asociados a un cliente.
453
 
454
  Parámetros:
455
- - cliente_id (int): ID del cliente al que se asociarán los detalles ópticos.
456
- - detalles_opticos (DetallesOpticosCreate): Detalles ópticos a guardar.
457
 
458
  Retorna:
459
- - dict: Información del nuevo registro creado.
 
 
 
460
  """
461
- conn = get_db_connection()
462
  cursor = conn.cursor()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
 
464
- # Verificar si el cliente existe
465
- cursor.execute("SELECT * FROM cliente WHERE Id = ?", (cliente_id,))
466
- cliente = cursor.fetchone()
467
- if not cliente:
468
- conn.close()
469
- raise HTTPException(status_code=404, detail="Cliente no encontrado")
470
 
471
- # Insertar detalles ópticos asociados al cliente
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
472
  cursor.execute(
473
  """
474
- INSERT INTO detalles_opticos (
475
- Esfera_OD_lejos, Cilindro_OD_lejos, Eje_OD_lejos, Agudeza_visual_OD_lejos,
476
- Esfera_OI_lejos, Cilindro_OI_lejos, Eje_OI_lejos, Agudeza_visual_OI_lejos,
477
- Esfera_OD_cerca, Cilindro_OD_cerca, Eje_OD_cerca, Agudeza_visual_OD_cerca,
478
- Esfera_OI_cerca, Cilindro_OI_cerca, Eje_OI_cerca, Agudeza_visual_OI_cerca,
479
- Id_cliente
480
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
481
- """,
482
  (
483
- detalles_opticos.Esfera_OD_lejos,
484
- detalles_opticos.Cilindro_OD_lejos,
485
- detalles_opticos.Eje_OD_lejos,
486
- detalles_opticos.Agudeza_visual_OD_lejos,
487
- detalles_opticos.Esfera_OI_lejos,
488
- detalles_opticos.Cilindro_OI_lejos,
489
- detalles_opticos.Eje_OI_lejos,
490
- detalles_opticos.Agudeza_visual_OI_lejos,
491
- detalles_opticos.Esfera_OD_cerca,
492
- detalles_opticos.Cilindro_OD_cerca,
493
- detalles_opticos.Eje_OD_cerca,
494
- detalles_opticos.Agudeza_visual_OD_cerca,
495
- detalles_opticos.Esfera_OI_cerca,
496
- detalles_opticos.Cilindro_OI_cerca,
497
- detalles_opticos.Eje_OI_cerca,
498
- detalles_opticos.Agudeza_visual_OI_cerca,
499
- cliente_id,
500
  ),
501
  )
 
 
 
 
 
 
 
 
 
 
 
 
502
 
503
- # Obtener el ID del nuevo registro
504
- nuevo_registro_id = cursor.lastrowid
505
 
506
- # Confirmar los cambios y cerrar la conexión
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  conn.commit()
508
- conn.close()
 
 
509
 
510
- # Devolver la información del nuevo registro
511
- return {"Id": nuevo_registro_id, **detalles_opticos.dict()}
512
 
 
 
 
 
513
 
514
- # PUT /detalles_opticos
515
- # Modelo Pydantic para los detalles ópticos
516
- class DetallesOpticosUpdate(BaseModel):
517
- Esfera_OD_lejos: str
518
- Cilindro_OD_lejos: str
519
- Eje_OD_lejos: str
520
- Agudeza_visual_OD_lejos: str
521
- Esfera_OI_lejos: str
522
- Cilindro_OI_lejos: str
523
- Eje_OI_lejos: str
524
- Agudeza_visual_OI_lejos: str
525
- Esfera_OD_cerca: str
526
- Cilindro_OD_cerca: str
527
- Eje_OD_cerca: str
528
- Agudeza_visual_OD_cerca: str
529
- Esfera_OI_cerca: str
530
- Cilindro_OI_cerca: str
531
- Eje_OI_cerca: str
532
- Agudeza_visual_OI_cerca: str
 
 
 
 
 
 
 
 
 
 
 
 
533
 
534
 
535
- # Ruta para actualizar detalles ópticos
536
- @app.put("/detalles_opticos/{detalles_id}", response_model=dict)
537
- def update_detalles_opticos(
538
- detalles_id: int, detalles_opticos: DetallesOpticosUpdate = Body(...)
539
- ):
540
  """
541
- Actualiza los detalles ópticos en la base de datos.
542
 
543
  Parámetros:
544
- - detalles_id: int - El ID de los detalles ópticos a actualizar.
545
- - detalles_opticos: DetallesOpticosUpdate - Los detalles ópticos actualizados.
546
 
547
  Retorna:
548
- - dict: Un diccionario con el mensaje de éxito y los detalles ópticos actualizados.
 
 
 
549
  """
550
- conn = get_db_connection()
551
  cursor = conn.cursor()
 
 
 
 
 
 
 
 
 
 
 
 
 
552
 
553
- # Verificar si los detalles ópticos existen
554
- cursor.execute("SELECT * FROM detalles_opticos WHERE Id = ?", (detalles_id,))
555
- detalles_existen = cursor.fetchone()
556
- if not detalles_existen:
557
- conn.close()
558
- raise HTTPException(status_code=404, detail="Detalles ópticos no encontrados")
 
559
 
560
- # Actualizar los detalles ópticos
 
 
 
 
561
  cursor.execute(
562
  """
563
- UPDATE detalles_opticos SET
564
- Esfera_OD_lejos = ?, Cilindro_OD_lejos = ?, Eje_OD_lejos = ?, Agudeza_visual_OD_lejos = ?,
565
- Esfera_OI_lejos = ?, Cilindro_OI_lejos = ?, Eje_OI_lejos = ?, Agudeza_visual_OI_lejos = ?,
566
- Esfera_OD_cerca = ?, Cilindro_OD_cerca = ?, Eje_OD_cerca = ?, Agudeza_visual_OD_cerca = ?,
567
- Esfera_OI_cerca = ?, Cilindro_OI_cerca = ?, Eje_OI_cerca = ?, Agudeza_visual_OI_cerca = ?
568
- WHERE Id = ?
569
- """,
570
  (
571
- detalles_opticos.Esfera_OD_lejos,
572
- detalles_opticos.Cilindro_OD_lejos,
573
- detalles_opticos.Eje_OD_lejos,
574
- detalles_opticos.Agudeza_visual_OD_lejos,
575
- detalles_opticos.Esfera_OI_lejos,
576
- detalles_opticos.Cilindro_OI_lejos,
577
- detalles_opticos.Eje_OI_lejos,
578
- detalles_opticos.Agudeza_visual_OI_lejos,
579
- detalles_opticos.Esfera_OD_cerca,
580
- detalles_opticos.Cilindro_OD_cerca,
581
- detalles_opticos.Eje_OD_cerca,
582
- detalles_opticos.Agudeza_visual_OD_cerca,
583
- detalles_opticos.Esfera_OI_cerca,
584
- detalles_opticos.Cilindro_OI_cerca,
585
- detalles_opticos.Eje_OI_cerca,
586
- detalles_opticos.Agudeza_visual_OI_cerca,
587
- detalles_id,
588
  ),
589
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590
 
591
- # Confirmar los cambios y cerrar la conexión
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
592
  conn.commit()
593
- conn.close()
 
 
 
 
 
 
 
 
 
 
 
594
 
595
- # Devolver la información actualizada
596
- return {
597
- "message": "Detalles ópticos actualizados correctamente",
598
- **detalles_opticos.dict(),
599
- }
 
 
 
 
 
 
 
 
 
6
  # uvicorn main:app --host localhost --port 7860 --reload
7
 
8
 
9
+ class DatabaseConnection:
10
  """
11
+ Clase Singleton para gestionar las conexiones a la base de datos.
 
 
 
 
 
12
  """
 
 
 
13
 
14
+ _instance = None
15
 
16
+ def __new__(cls):
17
+ """
18
+ Crea una nueva instancia de la clase si no existe.
19
+ """
20
+ if cls._instance is None:
21
+ cls._instance = super().__new__(cls)
22
+ cls._instance.conn = sqlite3.connect("optica.db")
23
+ cls._instance.conn.row_factory = sqlite3.Row
24
+ return cls._instance
25
+
26
+ def get_connection(self):
27
+ """
28
+ Obtener el objeto de conexión de la base de datos.
29
+ """
30
+ return self.conn
31
 
32
 
33
+ # saludo
34
  @app.get("/")
35
+ def read_root():
36
+ """Saludo de la API
 
37
 
38
  Returns:
39
+ string: Un mensaje de saludo.
40
  """
41
+ return {"message": "Saludos desde la API de Optica 2023"}
42
 
43
 
44
+ # GET /usuarios
 
45
  @app.get("/usuarios")
46
  def get_usuarios():
47
  """
48
+ Obtiene todos los usuarios de la base de datos.
49
 
50
  Returns:
51
+ list: Una lista con todos los usuarios.
52
  """
53
+ conn = DatabaseConnection().get_connection()
54
  cursor = conn.cursor()
55
  cursor.execute("SELECT * FROM usuario")
56
  usuarios = cursor.fetchall()
 
57
  return usuarios
58
 
59
 
60
+ @app.get("/usuarios/{id}")
61
+ def get_usuario(id: int):
 
62
  """
63
+ Obtiene un usuario por su ID.
64
 
65
  Parámetros:
66
+ - id (int): El ID del usuario a obtener.
67
 
68
  Retorna:
69
  - dict: Un diccionario con la información del usuario.
70
 
71
  Lanza:
72
+ - HTTPException: Si no se encuentra el usuario con el ID especificado.
73
  """
74
+ conn = DatabaseConnection().get_connection()
75
  cursor = conn.cursor()
76
+ cursor.execute("SELECT * FROM usuario WHERE Id = ?", (id,))
77
  usuario = cursor.fetchone()
 
78
  if usuario:
79
  return usuario
80
+ raise HTTPException(status_code=404, detail="Usuario no encontrado")
 
81
 
82
 
83
+ # crear clase usuario
84
+ class Usuario(BaseModel):
 
 
 
 
 
85
  Nombre_usuario: str
86
  Clave: str
87
  Pregunta_recuperacion: str
88
  Respuesta: str
89
+ estado: str
90
+
91
+
92
+ @app.post("/usuarios")
93
+ def create_usuario(usuario: Usuario):
94
+ """
95
+ Crea un nuevo usuario en la base de datos.
96
+
97
+ Args:
98
+ usuario (Usuario): El objeto Usuario que contiene los datos del usuario a crear.
99
+
100
+ Returns:
101
+ dict: Un diccionario con el ID del usuario recién creado y los datos del usuario.
102
+ """
103
+ conn = DatabaseConnection().get_connection()
104
+ cursor = conn.cursor()
105
+ cursor.execute(
106
+ """
107
+ INSERT INTO usuario (Nombre_usuario, Clave, Pregunta_recuperacion, Respuesta, estado)
108
+ VALUES (?, ?, ?, ?, ?)
109
+ """,
110
+ (
111
+ usuario.Nombre_usuario,
112
+ usuario.Clave,
113
+ usuario.Pregunta_recuperacion,
114
+ usuario.Respuesta,
115
+ usuario.estado,
116
+ ),
117
+ )
118
+ conn.commit()
119
+ return {"id": cursor.lastrowid, **usuario.dict()}
120
+
121
+
122
+ @app.put("/usuarios/{id}")
123
+ def update_usuario(id: int, usuario: Usuario):
 
 
 
 
 
 
 
 
 
 
124
  """
125
  Actualiza un usuario en la base de datos.
126
 
127
  Parámetros:
128
+ - id (int): El ID del usuario a actualizar.
129
+ - usuario (Usuario): Objeto Usuario con los datos actualizados.
130
 
131
  Retorna:
132
+ - dict: Un diccionario con el mensaje de éxito de la actualización.
133
 
134
  Lanza:
135
+ - HTTPException: Si no se encuentra el usuario en la base de datos.
136
  """
137
+ conn = DatabaseConnection().get_connection()
138
  cursor = conn.cursor()
 
 
139
  cursor.execute(
140
  """
141
  UPDATE usuario
142
+ SET Nombre_usuario = ?,
143
+ Clave = ?,
144
+ Pregunta_recuperacion = ?,
145
+ Respuesta = ?,
146
+ estado = ?
147
  WHERE Id = ?
148
+ """,
149
  (
150
  usuario.Nombre_usuario,
151
  usuario.Clave,
152
  usuario.Pregunta_recuperacion,
153
  usuario.Respuesta,
154
+ usuario.estado,
155
+ id,
156
  ),
157
  )
 
158
  conn.commit()
159
+ if cursor.rowcount < 1:
160
+ raise HTTPException(status_code=404, detail="Usuario no encontrado")
161
+ return {"message": "Usuario actualizado"}
162
+
163
+
164
+ @app.delete("/usuarios/{id}")
165
+ def delete_usuario(id: int):
166
+ """
167
+ Elimina un usuario de la base de datos.
168
 
169
+ Args:
170
+ id (int): El ID del usuario a eliminar.
171
+
172
+ Returns:
173
+ dict: Un diccionario con el mensaje de éxito de eliminación.
174
 
175
+ Raises:
176
+ HTTPException: Si no se encuentra el usuario con el ID especificado.
177
+ """
178
+ conn = DatabaseConnection().get_connection()
179
+ cursor = conn.cursor()
180
+ cursor.execute("DELETE FROM usuario WHERE Id = ?", (id,))
181
+ conn.commit()
182
+ if cursor.rowcount < 1:
183
+ raise HTTPException(status_code=404, detail="Usuario no encontrado")
184
+ return {"message": "Usuario eliminado"}
185
 
186
 
 
 
187
  @app.get("/clientes")
188
  def get_clientes():
189
  """
190
+ Obtiene todos los clientes de la base de datos.
191
 
192
  Returns:
193
+ list: Lista de todos los clientes.
194
  """
195
+ conn = DatabaseConnection().get_connection()
196
  cursor = conn.cursor()
197
  cursor.execute("SELECT * FROM cliente")
198
  clientes = cursor.fetchall()
 
199
  return clientes
200
 
201
 
202
+ @app.get("/clientes/{id}")
203
+ def get_cliente(id: int):
 
204
  """
205
+ Obtiene un cliente por su ID.
206
 
207
  Parámetros:
208
+ - id: int, el ID del cliente a buscar.
209
 
210
  Retorna:
211
+ - dict: Los datos del cliente encontrado.
212
 
213
  Lanza:
214
+ - HTTPException: Si no se encuentra ningún cliente con el ID especificado.
215
  """
216
+ conn = DatabaseConnection().get_connection()
 
 
 
217
  cursor = conn.cursor()
218
+ cursor.execute("SELECT * FROM cliente WHERE Id = ?", (id,))
 
 
 
219
  cliente = cursor.fetchone()
 
220
  if cliente:
221
  return cliente
222
+ raise HTTPException(status_code=404, detail="Cliente no encontrado")
 
223
 
224
 
225
+ class Cliente(BaseModel):
 
 
 
 
 
 
226
  Nombres_completos: str
227
  Telefono: str
228
  Edad: int
229
  Direccion: str
230
  fecha_registro: str
 
231
 
232
 
233
+ @app.post("/clientes")
234
+ def create_cliente(cliente: Cliente):
 
235
  """
236
  Crea un nuevo cliente en la base de datos.
237
 
238
  Args:
239
+ cliente (Cliente): Objeto Cliente con los datos del cliente a crear.
240
 
241
  Returns:
242
+ dict: Un diccionario con el ID del cliente recién creado y los datos del cliente.
243
  """
244
+ conn = DatabaseConnection().get_connection()
245
  cursor = conn.cursor()
 
 
246
  cursor.execute(
247
  """
248
+ INSERT INTO cliente (Nombres_completos, Telefono, Edad, Direccion, fecha_registro)
249
+ VALUES (?, ?, ?, ?, ?)
250
+ """,
251
  (
252
  cliente.Nombres_completos,
253
  cliente.Telefono,
254
  cliente.Edad,
255
  cliente.Direccion,
256
  cliente.fecha_registro,
 
257
  ),
258
  )
 
 
 
259
  conn.commit()
260
+ return {"id": cursor.lastrowid, **cliente.dict()}
 
 
261
 
262
 
263
+ @app.put("/clientes/{id}")
264
+ def update_cliente(id: int, cliente: Cliente):
 
265
  """
266
+ Actualiza los datos de un cliente en la base de datos.
267
 
268
  Parámetros:
269
+ - id (int): El ID del cliente a actualizar.
270
+ - cliente (Cliente): Objeto Cliente con los nuevos datos del cliente.
271
 
272
  Retorna:
273
+ - dict: Un diccionario con el mensaje de éxito de la actualización.
274
 
275
+ Excepciones:
276
+ - HTTPException: Si no se encuentra el cliente con el ID especificado.
277
  """
278
+ conn = DatabaseConnection().get_connection()
279
  cursor = conn.cursor()
 
 
280
  cursor.execute(
281
  """
282
  UPDATE cliente
283
+ SET Nombres_completos = ?,
284
+ Telefono = ?,
285
+ Edad = ?,
286
+ Direccion = ?,
287
+ fecha_registro = ?
288
  WHERE Id = ?
289
+ """,
290
  (
291
  cliente.Nombres_completos,
292
  cliente.Telefono,
293
  cliente.Edad,
294
  cliente.Direccion,
295
  cliente.fecha_registro,
296
+ id,
 
297
  ),
298
  )
 
299
  conn.commit()
300
+ if cursor.rowcount < 1:
301
+ raise HTTPException(status_code=404, detail="Cliente no encontrado")
302
+ return {"message": "Cliente actualizado"}
303
 
304
 
305
+ @app.delete("/clientes/{id}")
306
+ def delete_cliente(id: int):
 
307
  """
308
  Elimina un cliente de la base de datos.
309
 
310
  Parámetros:
311
+ - id: int, el ID del cliente a eliminar.
312
 
313
  Retorna:
314
+ - dict: Un diccionario con el mensaje de éxito de eliminación.
315
 
316
  Lanza:
317
+ - HTTPException: Si no se encuentra el cliente con el ID especificado.
318
  """
319
+ conn = DatabaseConnection().get_connection()
320
  cursor = conn.cursor()
321
+ cursor.execute("DELETE FROM cliente WHERE Id = ?", (id,))
 
 
 
322
  conn.commit()
323
+ if cursor.rowcount < 1:
324
+ raise HTTPException(status_code=404, detail="Cliente no encontrado")
325
+ return {"message": "Cliente eliminado"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
 
 
 
327
 
328
+ @app.get("/medidas")
329
+ def get_medidas():
330
+ """
331
+ Obtiene todas las medidas de la base de datos.
332
 
333
+ Returns:
334
+ list: Lista de todas las medidas.
335
  """
336
+ conn = DatabaseConnection().get_connection()
337
  cursor = conn.cursor()
338
+ cursor.execute("SELECT * FROM medidas")
339
+ medidas = cursor.fetchall()
340
+ return medidas
 
 
 
 
341
 
342
 
343
+ @app.get("/medidas/{id}")
344
+ def get_medida(id: int):
 
345
  """
346
+ Obtiene una medida por su ID.
347
+
348
+ Parámetros:
349
+ - id: int, el ID de la medida a obtener.
350
+
351
+ Retorna:
352
+ - dict: La medida encontrada.
353
+
354
+ Lanza:
355
+ - HTTPException: Si la medida no es encontrada.
356
  """
357
+ conn = DatabaseConnection().get_connection()
358
+ cursor = conn.cursor()
359
+ cursor.execute("SELECT * FROM medidas WHERE Id = ?", (id,))
360
+ medida = cursor.fetchone()
361
+ if medida:
362
+ return medida
363
+ raise HTTPException(status_code=404, detail="Medida no encontrada")
364
 
365
+
366
+ class Medida(BaseModel):
367
  Esfera_OD_lejos: str
368
  Cilindro_OD_lejos: str
369
  Eje_OD_lejos: str
 
380
  Cilindro_OI_cerca: str
381
  Eje_OI_cerca: str
382
  Agudeza_visual_OI_cerca: str
 
383
 
384
 
385
+ @app.post("/medidas")
386
+ def create_medida(medida: Medida):
387
+ """
388
+ Crea una nueva medida en la base de datos.
389
+
390
+ Args:
391
+ medida (Medida): Objeto que contiene los datos de la medida a crear.
392
+
393
+ Returns:
394
+ dict: Un diccionario que contiene el ID de la medida creada y los datos de la medida.
395
+ """
396
+ conn = DatabaseConnection().get_connection()
397
+ cursor = conn.cursor()
398
+ cursor.execute(
399
+ """
400
+ INSERT INTO medidas (Esfera_OD_lejos, Cilindro_OD_lejos, Eje_OD_lejos, Agudeza_visual_OD_lejos, Esfera_OI_lejos, Cilindro_OI_lejos, Eje_OI_lejos, Agudeza_visual_OI_lejos, Esfera_OD_cerca, Cilindro_OD_cerca, Eje_OD_cerca, Agudeza_visual_OD_cerca, Esfera_OI_cerca, Cilindro_OI_cerca, Eje_OI_cerca, Agudeza_visual_OI_cerca)
401
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
402
+ """,
403
+ (
404
+ medida.Esfera_OD_lejos,
405
+ medida.Cilindro_OD_lejos,
406
+ medida.Eje_OD_lejos,
407
+ medida.Agudeza_visual_OD_lejos,
408
+ medida.Esfera_OI_lejos,
409
+ medida.Cilindro_OI_lejos,
410
+ medida.Eje_OI_lejos,
411
+ medida.Agudeza_visual_OI_lejos,
412
+ medida.Esfera_OD_cerca,
413
+ medida.Cilindro_OD_cerca,
414
+ medida.Eje_OD_cerca,
415
+ medida.Agudeza_visual_OD_cerca,
416
+ medida.Esfera_OI_cerca,
417
+ medida.Cilindro_OI_cerca,
418
+ medida.Eje_OI_cerca,
419
+ medida.Agudeza_visual_OI_cerca,
420
+ ),
421
+ )
422
+ conn.commit()
423
+ return {"id": cursor.lastrowid, **medida.dict()}
424
+
425
+
426
+ @app.put("/medidas/{id}")
427
+ def update_medida(id: int, medida: Medida):
428
  """
429
+ Actualiza una medida en la base de datos.
430
 
431
  Parámetros:
432
+ - id (int): El ID de la medida a actualizar.
433
+ - medida (Medida): Objeto Medida con los datos actualizados.
434
 
435
  Retorna:
436
+ - dict: Un diccionario con el mensaje de éxito de la actualización.
437
+
438
+ Lanza:
439
+ - HTTPException: Si no se encuentra la medida con el ID especificado.
440
  """
441
+ conn = DatabaseConnection().get_connection()
442
  cursor = conn.cursor()
443
+ cursor.execute(
444
+ """
445
+ UPDATE medidas
446
+ SET Esfera_OD_lejos = ?,
447
+ Cilindro_OD_lejos = ?,
448
+ Eje_OD_lejos = ?,
449
+ Agudeza_visual_OD_lejos = ?,
450
+ Esfera_OI_lejos = ?,
451
+ Cilindro_OI_lejos = ?,
452
+ Eje_OI_lejos = ?,
453
+ Agudeza_visual_OI_lejos = ?,
454
+ Esfera_OD_cerca = ?,
455
+ Cilindro_OD_cerca = ?,
456
+ Eje_OD_cerca = ?,
457
+ Agudeza_visual_OD_cerca = ?,
458
+ Esfera_OI_cerca = ?,
459
+ Cilindro_OI_cerca = ?,
460
+ Eje_OI_cerca = ?,
461
+ Agudeza_visual_OI_cerca = ?
462
+ WHERE Id = ?
463
+ """,
464
+ (
465
+ medida.Esfera_OD_lejos,
466
+ medida.Cilindro_OD_lejos,
467
+ medida.Eje_OD_lejos,
468
+ medida.Agudeza_visual_OD_lejos,
469
+ medida.Esfera_OI_lejos,
470
+ medida.Cilindro_OI_lejos,
471
+ medida.Eje_OI_lejos,
472
+ medida.Agudeza_visual_OI_lejos,
473
+ medida.Esfera_OD_cerca,
474
+ medida.Cilindro_OD_cerca,
475
+ medida.Eje_OD_cerca,
476
+ medida.Agudeza_visual_OD_cerca,
477
+ medida.Esfera_OI_cerca,
478
+ medida.Cilindro_OI_cerca,
479
+ medida.Eje_OI_cerca,
480
+ medida.Agudeza_visual_OI_cerca,
481
+ id,
482
+ ),
483
+ )
484
+ conn.commit()
485
+ if cursor.rowcount < 1:
486
+ raise HTTPException(status_code=404, detail="Medida no encontrada")
487
+ return {"message": "Medida actualizada"}
488
+
489
+
490
+ @app.delete("/medidas/{id}")
491
+ def delete_medida(id: int):
492
+ """
493
+ Elimina una medida de la base de datos.
494
+
495
+ Parámetros:
496
+ - id: int, el ID de la medida a eliminar.
497
+
498
+ Retorna:
499
+ - dict: Un diccionario con el mensaje de éxito de la eliminación.
500
+
501
+ Lanza:
502
+ - HTTPException: Si no se encuentra la medida con el ID especificado.
503
+ """
504
+ conn = DatabaseConnection().get_connection()
505
+ cursor = conn.cursor()
506
+ cursor.execute("DELETE FROM medidas WHERE Id = ?", (id,))
507
+ conn.commit()
508
+ if cursor.rowcount < 1:
509
+ raise HTTPException(status_code=404, detail="Medida no encontrada")
510
+ return {"message": "Medida eliminada"}
511
 
 
 
 
 
 
 
512
 
513
+ @app.get("/cliente_medidas")
514
+ def get_cliente_medidas():
515
+ """
516
+ Obtiene todas las medidas de los clientes.
517
+
518
+ Returns:
519
+ list: Lista de todas las medidas de los clientes.
520
+ """
521
+ conn = DatabaseConnection().get_connection()
522
+ cursor = conn.cursor()
523
+ cursor.execute("SELECT * FROM cliente_medidas")
524
+ cliente_medidas = cursor.fetchall()
525
+ return cliente_medidas
526
+
527
+
528
+ @app.get("/cliente_medidas/{id}")
529
+ def get_cliente_medida(id: int):
530
+ """
531
+ Obtiene los datos de una medida de cliente específica.
532
+
533
+ Parámetros:
534
+ - id: int: El ID de la medida de cliente a obtener.
535
+
536
+ Retorna:
537
+ - dict: Un diccionario con los datos de la medida de cliente.
538
+
539
+ Lanza:
540
+ - HTTPException: Si la medida de cliente no se encuentra.
541
+
542
+ """
543
+ conn = DatabaseConnection().get_connection()
544
+ cursor = conn.cursor()
545
+ cursor.execute("SELECT * FROM cliente_medidas WHERE id_cliente_medidas = ?", (id,))
546
+ cliente_medida = cursor.fetchone()
547
+ if cliente_medida:
548
+ return cliente_medida
549
+ raise HTTPException(status_code=404, detail="Cliente_medida no encontrada")
550
+
551
+
552
+ class Cliente_Medida(BaseModel):
553
+ id_cliente: int
554
+ id_medidas: int
555
+
556
+
557
+ @app.post("/cliente_medidas")
558
+ def create_cliente_medida(cliente_medida: Cliente_Medida):
559
+ """
560
+ Crea un nuevo registro de cliente_medida en la base de datos.
561
+
562
+ Args:
563
+ cliente_medida (Cliente_Medida): Objeto que contiene los datos del cliente_medida.
564
+
565
+ Returns:
566
+ dict: Diccionario con el ID del registro creado y los datos del cliente_medida.
567
+ """
568
+ conn = DatabaseConnection().get_connection()
569
+ cursor = conn.cursor()
570
  cursor.execute(
571
  """
572
+ INSERT INTO cliente_medidas (id_cliente, id_medidas)
573
+ VALUES (?, ?)
574
+ """,
 
 
 
 
 
575
  (
576
+ cliente_medida.id_cliente,
577
+ cliente_medida.id_medidas,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
578
  ),
579
  )
580
+ conn.commit()
581
+ return {"id": cursor.lastrowid, **cliente_medida.dict()}
582
+
583
+
584
+ @app.put("/cliente_medidas/{id}")
585
+ def update_cliente_medida(id: int, cliente_medida: Cliente_Medida):
586
+ """
587
+ Actualiza una medida de cliente en la base de datos.
588
+
589
+ Parámetros:
590
+ - id: int: El ID de la medida de cliente a actualizar.
591
+ - cliente_medida: Cliente_Medida: Objeto que contiene los datos de la medida de cliente actualizada.
592
 
593
+ Retorna:
594
+ - dict: Un diccionario con el mensaje de éxito si la medida de cliente se actualizó correctamente.
595
 
596
+ Lanza:
597
+ - HTTPException: Si la medida de cliente no se encuentra en la base de datos.
598
+ """
599
+ conn = DatabaseConnection().get_connection()
600
+ cursor = conn.cursor()
601
+ cursor.execute(
602
+ """
603
+ UPDATE cliente_medidas
604
+ SET id_cliente = ?,
605
+ id_medidas = ?
606
+ WHERE id_cliente_medidas = ?
607
+ """,
608
+ (
609
+ cliente_medida.id_cliente,
610
+ cliente_medida.id_medidas,
611
+ id,
612
+ ),
613
+ )
614
  conn.commit()
615
+ if cursor.rowcount < 1:
616
+ raise HTTPException(status_code=404, detail="Cliente_medida no encontrada")
617
+ return {"message": "Cliente_medida actualizada"}
618
 
 
 
619
 
620
+ @app.delete("/cliente_medidas/{id}")
621
+ def delete_cliente_medida(id: int):
622
+ """
623
+ Elimina una medida de cliente en la base de datos.
624
 
625
+ Parámetros:
626
+ - id: int, el ID de la medida de cliente a eliminar.
627
+
628
+ Retorna:
629
+ - dict: Un diccionario con el mensaje de éxito de eliminación.
630
+
631
+ Lanza:
632
+ - HTTPException: Si no se encuentra la medida de cliente con el ID especificado.
633
+ """
634
+ conn = DatabaseConnection().get_connection()
635
+ cursor = conn.cursor()
636
+ cursor.execute("DELETE FROM cliente_medidas WHERE id_cliente_medidas = ?", (id,))
637
+ conn.commit()
638
+ if cursor.rowcount < 1:
639
+ raise HTTPException(status_code=404, detail="Cliente_medida no encontrada")
640
+ return {"message": "Cliente_medida eliminada"}
641
+
642
+
643
+ @app.get("/prescripciones")
644
+ def get_prescripciones():
645
+ """
646
+ Obtiene todas las prescripciones de la base de datos.
647
+
648
+ Returns:
649
+ list: Lista de todas las prescripciones.
650
+ """
651
+ conn = DatabaseConnection().get_connection()
652
+ cursor = conn.cursor()
653
+ cursor.execute("SELECT * FROM prescripcion")
654
+ prescripciones = cursor.fetchall()
655
+ return prescripciones
656
 
657
 
658
+ @app.get("/prescripciones/{id}")
659
+ def get_prescripcion(id: int):
 
 
 
660
  """
661
+ Obtiene una prescripción por su ID.
662
 
663
  Parámetros:
664
+ - id (int): El ID de la prescripción a obtener.
 
665
 
666
  Retorna:
667
+ - dict: Un diccionario con la información de la prescripción.
668
+
669
+ Lanza:
670
+ - HTTPException: Si no se encuentra la prescripción con el ID especificado.
671
  """
672
+ conn = DatabaseConnection().get_connection()
673
  cursor = conn.cursor()
674
+ cursor.execute("SELECT * FROM prescripcion WHERE id_prescripcion = ?", (id,))
675
+ prescripcion = cursor.fetchone()
676
+ if prescripcion:
677
+ return prescripcion
678
+ raise HTTPException(status_code=404, detail="Prescripcion no encontrada")
679
+
680
+
681
+ class Prescripcion(BaseModel):
682
+ lunas: str
683
+ montura: str
684
+ fecha: str
685
+ id_cliente_medidas: int
686
+
687
 
688
+ @app.post("/prescripciones")
689
+ def create_prescripcion(prescripcion: Prescripcion):
690
+ """
691
+ Crea una nueva prescripción en la base de datos.
692
+
693
+ Args:
694
+ prescripcion (Prescripcion): Objeto Prescripcion que contiene los datos de la prescripción.
695
 
696
+ Returns:
697
+ dict: Un diccionario que contiene el ID de la prescripción creada y los datos de la prescripción.
698
+ """
699
+ conn = DatabaseConnection().get_connection()
700
+ cursor = conn.cursor()
701
  cursor.execute(
702
  """
703
+ INSERT INTO prescripcion (lunas, montura, fecha, id_cliente_medidas)
704
+ VALUES (?, ?, ?, ?)
705
+ """,
 
 
 
 
706
  (
707
+ prescripcion.lunas,
708
+ prescripcion.montura,
709
+ prescripcion.fecha,
710
+ prescripcion.id_cliente_medidas,
 
 
 
 
 
 
 
 
 
 
 
 
 
711
  ),
712
  )
713
+ conn.commit()
714
+ return {"id": cursor.lastrowid, **prescripcion.dict()}
715
+
716
+
717
+ @app.put("/prescripciones/{id}")
718
+ def update_prescripcion(id: int, prescripcion: Prescripcion):
719
+ """
720
+ Actualiza una prescripción existente en la base de datos.
721
+
722
+ Parámetros:
723
+ - id (int): El ID de la prescripción a actualizar.
724
+ - prescripcion (Prescripcion): Objeto Prescripcion con los datos actualizados.
725
+
726
+ Retorna:
727
+ - dict: Un diccionario con el mensaje de éxito de la actualización.
728
 
729
+ Lanza:
730
+ - HTTPException: Si no se encuentra la prescripción con el ID especificado.
731
+ """
732
+ conn = DatabaseConnection().get_connection()
733
+ cursor = conn.cursor()
734
+ cursor.execute(
735
+ """
736
+ UPDATE prescripcion
737
+ SET lunas = ?,
738
+ montura = ?,
739
+ fecha = ?,
740
+ id_cliente_medidas = ?
741
+ WHERE id_prescripcion = ?
742
+ """,
743
+ (
744
+ prescripcion.lunas,
745
+ prescripcion.montura,
746
+ prescripcion.fecha,
747
+ prescripcion.id_cliente_medidas,
748
+ id,
749
+ ),
750
+ )
751
  conn.commit()
752
+ if cursor.rowcount < 1:
753
+ raise HTTPException(status_code=404, detail="Prescripcion no encontrada")
754
+ return {"message": "Prescripcion actualizada"}
755
+
756
+
757
+ @app.delete("/prescripciones/{id}")
758
+ def delete_prescripcion(id: int):
759
+ """
760
+ Elimina una prescripción de la base de datos.
761
+
762
+ Parámetros:
763
+ - id (int): El ID de la prescripción a eliminar.
764
 
765
+ Retorna:
766
+ - dict: Un diccionario con el mensaje de éxito.
767
+
768
+ Lanza:
769
+ - HTTPException: Si no se encuentra la prescripción con el ID especificado.
770
+ """
771
+ conn = DatabaseConnection().get_connection()
772
+ cursor = conn.cursor()
773
+ cursor.execute("DELETE FROM prescripcion WHERE id_prescripcion = ?", (id,))
774
+ conn.commit()
775
+ if cursor.rowcount < 1:
776
+ raise HTTPException(status_code=404, detail="Prescripcion no encontrada")
777
+ return {"message": "Prescripcion eliminada"}
optica.db CHANGED
Binary files a/optica.db and b/optica.db differ