
    [h                        S r SSKrSSKrSSKrSSKrSSKJrJr  SSKJ	r	J
r
JrJrJrJr  SSKJr  SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKrSSKr\R8                  R;                  \R8                  R=                  \R8                  R?                  \ 5      S	5      5      r!\R8                  R=                  \!S
S5      r"\R8                  R=                  \!S
S5      r#\	" \$\"\#S9r%\" \%5        \%RM                  \5        \RN                  RQ                  SS5      \%l)        \RN                  RQ                  SS5      \RN                  RQ                  SS5      \RN                  RQ                  SS5      \RN                  RQ                  SS5      SSS.r*\RN                  RQ                  SS5      r+\," \RN                  RQ                  SS5      5      r-S r.S  r/\%Ra                  S!5      S" 5       r1\%Ra                  S#S$/S%9S& 5       r2\%Ra                  S'S$/S%9S( 5       r3S) r4S* r5\%Ra                  S+S$/S%9\5S, 5       5       r6\%Ra                  S+S-/S%9\5S. 5       5       r7\%Ra                  S/S-/S%9\5S0 5       5       r8\%Ra                  S1S-/S%9\5S2 5       5       r9\%Ra                  S/S3/S%9\5S4 5       5       r:\%Ra                  S/S5/S%9\5S6 5       5       r;\%Ra                  S7S-/S%9\5S8 5       5       r<\%Ra                  S7S3/S%9\5S9 5       5       r=\%Ra                  S:5      S; 5       r>\%Ra                  S<5      S= 5       r?\%Ra                  S>5      S? 5       r@\%Ra                  S@5      SA 5       rA\%Ra                  SB5      SC 5       rB\%Ra                  SD5      SE 5       rC\%Ra                  SFS$/S%9SG 5       rD\%Ra                  SH5      SI 5       rE\$SJ:X  a  \F" SK5        \/" 5       (       a	  \F" SL5        O\F" SM5        \," \RN                  RQ                  SNSO5      5      rG\F" SP\G 35        \RN                  RQ                  SQ5      SR:H  rH\%R                  SS\G\HST9  gg)Uus   
app.py - Backend principal de Auris con Flask y MySQL
Sistema de autenticación con encriptación de contraseñas
    N)datetime	timedelta)Flaskrequestjsonifyrender_templatesend_from_directoryredirect)CORS)	PdfReader)secure_filename)tts_bpz..frontend	templatesstatic)template_folderstatic_folder
SECRET_KEYzauris-secret-key-2025DB_HOST	localhostDB_USERrootDB_PASSWORDz
Auris2025.DB_NAMEAurisutf8mb4T)hostuserpassworddatabasecharset
autocommitJWT_SECRET_KEYzauris-jwt-secret-2025JWT_ACCESS_TOKEN_EXPIRES86400c                       [         R                  R                  " S0 [        D6n U $ ! [         R                  R                   a  n[        SU 35         SnAgSnAff = f)u'   Función para obtener conexión a MySQLzError conectando a MySQL: N )mysql	connectorconnect	DB_CONFIGErrorprint)
connectiones     .D:\NESTOR\Documents\Tesis\auris\backend\app.pyget_db_connectionr1   6   sQ    __,,9y9
??   *1#./s   %( AAAc                     Sn Sn [        5       n U (       d1   U(       a  UR                  5         U (       a  U R                  5         ggU R                  5       nUR                  S5        UR                  S5        UR                  S5        U R	                  5         [        S5         U(       a  UR                  5         U (       a  U R                  5         gg! [        R                  R                   aG  n[        SU 35         SnAU(       a  UR                  5         U (       a  U R                  5         ggSnAff = f! U(       a  UR                  5         U (       a  U R                  5         f f = f)	z6Inicializar base de datos y crear tablas si no existenNFu  
            CREATE TABLE IF NOT EXISTS Usuarios (
                id INT PRIMARY KEY AUTO_INCREMENT,
                nombre_usuario VARCHAR(50) NOT NULL UNIQUE,
                correo_electronico VARCHAR(50) NOT NULL UNIQUE,
                contraseña VARCHAR(255) NOT NULL,
                foto_perfil BLOB,
                creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
        a  
            CREATE TABLE IF NOT EXISTS Configuraciones_Usuario (
                id INT PRIMARY KEY AUTO_INCREMENT,
                usuario_id INT,
                nombre_configuracion VARCHAR(50) NOT NULL,
                valor_configuracion TEXT,
                actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                FOREIGN KEY (usuario_id) REFERENCES Usuarios(id) ON DELETE CASCADE
            )
        a  
            CREATE TABLE IF NOT EXISTS Documentos (
                id INT PRIMARY KEY AUTO_INCREMENT,
                usuario_id INT,
                titulo VARCHAR(50) NOT NULL,
                contenido TEXT,
                archivo_audio BLOB,
                creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                FOREIGN KEY (usuario_id) REFERENCES Usuarios(id) ON DELETE CASCADE
            )
        u2   ✅ Base de datos MySQL inicializada correctamenteTz#Error inicializando base de datos: )	r1   closecursorexecutecommitr-   r(   r)   r,   )r.   r4   r/   s      r0   init_databaser7   ?   s:   JF9&(
f LLN g ""$ 	 
 
	 	 	 		 	  	 	BC LLN  ??   3A378LLN  LLN s0   C AC D<5D7D? 7D<<D? ?1E0z/api/test-dbc                      [        5       n U (       a(  U R                  5         [        SS[        S   S.5      S4$ [        SSS.5      S	4$ )
u#   Probar conexión a la base de datossuccessu   Conexión a MySQL exitosar    )statusmessager       erroru   Error de conexión a MySQLr:   r;     )r1   r3   r   r+   )r.   s    r0   test_dbr@      si     #$J2!*-
  	 	 3
   	    z/api/registerPOST)methodsc                    ^ [         R                  m[        U4S jS 5       5      (       d  [        SS05      S4$ TS   R	                  5       n TS   R	                  5       R                  5       nTS   n[        U 5      S	:  a  [        SS
05      S4$ [        U5      S:  a  [        SS05      S4$ SU;  a  [        SS05      S4$ SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  5       nUR                  SX45        UR                  5       (       a>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ [        R                  " UR                  S5      [        R                  " 5       5      nUR                  SXUR!                  S5      45        UR"                  n/ SQnU H  u  pUR                  SXhU	45        M     UR%                  5         [        SSUS.5      S4U(       a  UR                  5         U(       a  UR                  5         $ $ ! [&        R(                  R*                   ab  n
[-        SU
 35        [        SS[/        U
5       305      S4s Sn
A
U(       a  UR                  5         U(       a  UR                  5         $ $ Sn
A
f[0         ab  n
[-        SU
 35        [        SS [/        U
5       305      S4s Sn
A
U(       a  UR                  5         U(       a  UR                  5         $ $ Sn
A
ff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)!zRegistro de nuevos usuariosc              3   ,   >#    U  H	  oT;   v   M     g 7fNr'   .0kdatas     r0   	<genexpr>register.<locals>.<genexpr>   s     Z"YQDy"Y   )nombre_usuariocorreo_electronico   contraseñar=   Faltan datos requeridos  rN   rO   rP      z5El nombre de usuario debe tener al menos 3 caracteres   u/   La contraseña debe tener al menos 6 caracteres@u   Correo electrónico inválidoN%   Error de conexión a la base de datosr?   zLSELECT id FROM Usuarios WHERE correo_electronico = %s OR nombre_usuario = %szEl usuario o correo ya existei  utf-8u}   
            INSERT INTO Usuarios (nombre_usuario, correo_electronico, contraseña) 
            VALUES (%s, %s, %s)
        ))tipo_vozmujer)velocidad_lecturaz1.0)u   tamaño_fuentemedium)contraste_altofalse)retroalimentacion_audiotruez
                INSERT INTO Configuraciones_Usuario (usuario_id, nombre_configuracion, valor_configuracion) 
                VALUES (%s, %s, %s)
            r9   zUsuario registrado exitosamente)r:   r;   user_id   zError en registro: Error de base de datos: zError general en registro: Error interno: )r   jsonallr   striplowerlenr1   r3   r4   r5   fetchonebcrypthashpwencodegensaltdecode	lastrowidr6   r(   r)   r,   r-   str	Exception)rN   rO      contraseñar.   r4   hashed_passwordr`   default_configsconfig_nameconfig_valuer/   rJ   s              @r0   registerrw      se    <<D Z"YZZZ!:;<cAA*+113N2399;AAC}%K >Q!XYZ\___
;!!RSTVYYY
$$!@ABCGGJF9&(
G%LMNPSSf LLN g ""$ 	e+<	>??G%DEFKV LLN U !--(:(:7(CV^^EUV 	  /2H2H2QR	T
 ""
 *9%KNN  57 *9 	8
  	 LLN  ??   L#A3'(#;CF8!DEFKK
 LLN   C+A3/0?3q6(!;<=sBBLLN C LLN sV   
I* AI* B+I* *M(K%0M1M %M2(MMM MM 1Nz
/api/loginc            
        ^ [         R                  m[        U4S jS 5       5      (       d  [        SS05      S4$ TS   R	                  5       R                  5       n TS   nSnSn [        5       nU(       d>  [        SS	05      S
4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  SS9nUR                  SU 45        UR                  5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ [        R                  " UR                  S5      US   R                  S5      5      (       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ US   [        R                  " 5       [!        ["        S9-   S.n[$        R                  " U[&        SS9nUR                  SUS   45        UR)                  5       n0 nU HC  n	U	S   n
U	S   nU
S;   a  UR                  5       S:H  X'   M*  U
S:X  a  [+        U5      X'   M?  XU
'   ME     [        SSUUS   US   US   US   S .US!.5      S"4U(       a  UR                  5         U(       a  UR                  5         $ $ ! [,        R.                  R0                   ab  n[3        S#U 35        [        SS$[5        U5       305      S
4s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAf[6         ab  n[3        S%U 35        [        SS&[5        U5       305      S
4s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)'u   Autenticación de usuariosc              3   ,   >#    U  H	  oT;   v   M     g 7frF   r'   rG   s     r0   rK   login.<locals>.<genexpr>   s     H"GQDy"GrM   )rO   rP   r=   rQ   rR   rO   rP   NrV   r?   T
dictionaryz4SELECT * FROM Usuarios WHERE correo_electronico = %su   Credenciales inválidas  rW   id)seconds)r`   expHS256)	algorithmcSELECT nombre_configuracion, valor_configuracion FROM Configuraciones_Usuario WHERE usuario_id = %snombre_configuracionvalor_configuracionr\   r^   r_   rZ   r9   zLogin exitosorN   foto_perfil)r~   rN   rO   r   )r:   r;   tokenusuarioconfiguracionesr<   zError en login: rb   zError general en login: rc   )r   rd   re   r   rf   rg   r1   r3   r4   r5   ri   rj   checkpwrl   r   utcnowr   r$   jwtr#   fetchallfloatr(   r)   r,   r-   rp   rq   )rO   rr   r.   r4   r   payloadr   configsr   configkeyvaluer/   rJ   s                @r0   loginr      s    <<DH"GHHH!:;<cAA2399;AAC}%KJFB&(
G%LMNPSSx LLN y ""d"3 	MPbOde//#G%>?@#Ef LLN e ~~k0097=;Q;X;XY`;abbG%>?@#E^ LLN [ t}??$y9Q'RR
 

7NgF 	|  @G  HL  @M  O  	P//# F/0C01E CC',{{}'>$++',U|$',$  &dm")*:";&-.B&C&}5	  /
  ( LLN  ??   L $%#;CF8!DEFKK
 LLN   C(,-?3q6(!;<=sBBLLN C LLN s]   &J. 5AJ. ,AJ. 'CJ. .N(L)4N5N )N6(NNN NN 1Oc                      [         R                  " U [        S/S9nUS   $ ! [         R                   a     g[         R                   a     gf = f)zVerificar JWT tokenr   )
algorithmsr`   N)r   rn   r#   ExpiredSignatureErrorInvalidTokenError)r   r   s     r0   verify_tokenr   :  sO    **UNyIy!!$$    s   " AAAc                 6   ^  U 4S jnT R                   Ul         U$ )u1   Decorador para rutas que requieren autenticaciónc                  n  > [        S[        R                   35        [        R                  R	                  S5      n[        SU(       a  US S S-   OS 35        U(       dD  [        S5        [        R                  S;   a  [        S	5        [        S
5      $ [        SS05      S4$ UR                  S5      (       a  USS  n[        U5      nU(       dD  [        S5        [        R                  S;   a  [        S5        [        S
5      $ [        SS05      S4$ [        SU 35        U[        l	        T" U 0 UD6$ )Nu+   🔐 Verificando autenticación para ruta: Authorizationu   📝 Token en headers:    z...Noneu5   ❌ No se encontró token de autorización en headers)iniciomodo_visualmodo_auditivo
bibliotecaconfiguracionu.   🔄 Redirigiendo a login desde ruta protegida/r=   zToken requeridor}   zBearer    u   ❌ Token inválido o expiradou-   🔄 Redirigiendo a login por token inválidou   Token inválidou   ✅ Usuario autenticado: )
r-   r   endpointheadersgetr
   r   
startswithr   r`   )argskwargsr   r`   fs       r0   decorated_function)auth_required.<locals>.decorated_functionF  s#   ;G<L<L;MNO##O4'ecr
U(:'PQRIJ#llFG}$):;<cAAI&&!"IEu%23#llEF}$):;<cAA)'34!$!&!!rA   )__name__)r   r   s   ` r0   auth_requiredr   D  s    "@ #$**rA   z/api/documentsc            	      8
  ^ [         R                  m[        U4S jS 5       5      (       d  [        SS05      S4$ TS   R	                  5       n TS   R	                  5       n[        U 5      S:  a  [        SS	05      S4$ [        U 5      S
:  a  [        SS05      S4$ SnSnSn WR                  SS9nUR                  S[         R                  45        UR                  5       nUR                  5         0 nU HC  n	U	S   n
U	S   nU
S;   a  UR                  5       S:H  X'   M*  U
S:X  a  [        U5      X'   M?  XU
'   ME     UR                  SS5      nUR                  SS5      n[        R                  " SUUUS.S9nUR                   S:X  Ga  UR                  5       nUR                  S5      (       Ga[  US   nUR#                  S5      (       a  [$        R&                  R)                  [*        S UR-                  S!5      5      n[$        R&                  R/                  U5      (       af  [1        US"5       nUR3                  5       nSSS5        S#[4        R6                  " 5       R9                  S$5       S%3n[;        S&[        U5       S'35        O[;        S(U 35        O[        R                  " U5      nUR                   S:X  aL  UR<                  nS#[4        R6                  " 5       R9                  S$5       S%3n[;        S)[        U5       S'35        O7[;        S*UR                  S5       35        O[;        S+UR                    35         SnSn [A        5       nU(       d>  [        SS-05      S.4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  5       nUR                  S/[         R                  XX#U45        URB                  nURE                  5         U(       a  S0OS1n[        SS2U 3UUSLS3.5      S44U(       a  UR                  5         U(       a  UR                  5         $ $ ! , (       d  f       GN= f! [>         a  n[;        S,U 35         SnAGN%SnAff = f! [F        RH                  RJ                   aT  n[        SS5[M        U5       305      S.4s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)6zGuardar documento del usuarioc              3   ,   >#    U  H	  oT;   v   M     g 7frF   r'   rG   s     r0   rK    save_document.<locals>.<genexpr>q  s     :"9QDy"9rM   )titulo	contenidor=   rQ   rR   r   r          El título no puede estar vacío2   )   El título no puede exceder 50 caracteresN
audio/mpegTr{   r   r   r   r   r_   rZ   rX   rY   g      ?z+http://localhost:5000/api/synthesize-speech)text
voice_typespeed)rd   r<   r9   	audio_urlz/static/r   r   rbdocumento_audio_z%Y%m%d_%H%M%Sz.mp3u   ✅ Audio generado y leído: z bytesu'   ⚠️ Archivo de audio no encontrado: u   ✅ Audio descargado: u   ⚠️ Error en síntesis TTS: u   ⚠️ Error llamando a TTS: u   ⚠️ Error generando audio: rV   r?   z
            INSERT INTO Documentos (usuario_id, titulo, contenido, archivo_audio, nombre_archivo, tipo_mime) 
            VALUES (%s, %s, %s, %s, %s, %s)
        z	con audioz	sin audioz Documento guardado exitosamente )r:   r;   document_id	has_audiora   rb   )'r   rd   re   r   rf   rh   r4   r5   r`   r   r3   rg   r   r   requestspoststatus_coder   ospathjoinproject_rootlstripexistsopenreadr   nowstrftimer-   contentrq   r1   ro   r6   r(   r)   r,   rp   )r   r   archivo_audio_blobnombre_archivo	tipo_mimer.   cursor_configr   r   r   r   r   r   r   tts_responsetts_datar   audio_file_path
audio_fileaudio_responser/   r4   r   audio_statusrJ   s                           @r0   save_documentr   k  s    <<D:"9:::!:;<cAA(^!!#F[!'')I
6{Q!CDEsJJ
6{R!LMNPSSS NI:4"))T):  D  GN  GV  GV  FX  	Y((* F/0C01ECC',{{}'>$++',U|$',$  %((W=
##$7=  }}%R/85?05)%& ##s*#((*H||I&&$[1	''
33&(ggll<YM]M]^aMb&cOww~~o66!/48J1;1B. 9+;HLLN<S<STc<d;eei)j =cBT>U=VV\]^ GGXYZ &.\\)%<N%11S8-;-C-C*+;HLLN<S<STc<d;eei)j 6s;M7N6OvVW7W8M7NOP1,2J2J1KLM JF&(
G%LMNPSS2 LLN 3 ""$ 	  oov2DV_`	b
 &&&8{k9,H&+47	
 
  LLN m 98$  4.qc2334> ??   L#;CF8!DEFKKLLN L LLN s   $FQ 3P;AQ Q A2Q Q -Q Q3 A1Q3 ;
Q
Q 
Q0Q++Q03S%S +S%,S(  S%%S( (1TGETc                     Sn Sn [        5       n U (       d>  [        SS05      S4U(       a  UR                  5         U (       a  U R                  5         $ $ U R                  SS9nUR	                  S[
        R                  45        UR                  5       nU HE  nUS   (       a  US   R                  5       US'   US	   (       d  M/  US	   R                  5       US	'   MG     [        S
US.5      S4U(       a  UR                  5         U (       a  U R                  5         $ $ ! [        R                  R                   aT  n[        SS[        U5       305      S4s SnAU(       a  UR                  5         U (       a  U R                  5         $ $ SnAff = f! U(       a  UR                  5         U (       a  U R                  5         f f = f)zObtener documentos del usuarioNr=   rV   r?   Tr{   aD  
            SELECT id, titulo, contenido, 
                   CASE WHEN archivo_audio IS NOT NULL THEN TRUE ELSE FALSE END as has_audio,
                   nombre_archivo, tipo_mime, creado_en, actualizado_en 
            FROM Documentos 
            WHERE usuario_id = %s 
            ORDER BY actualizado_en DESC
        	creado_enactualizado_enr9   )r:   	documentsr<   rb   )r1   r   r3   r4   r5   r   r`   r   	isoformatr(   r)   r,   rp   )r.   r4   r   docr/   s        r0   get_user_documentsr     s    JF%&(
G%LMNPSS> LLN ? ""d"3 	  oo	! OO%	 C;#&{#3#=#=#?K #$$(+,<(=(G(G(I$%	  "
   LLN  ??   L#;CF8!DEFKKLLN L LLN s<   D A-D )D F=FFF FF 1Gz /api/documents/<int:document_id>c                    SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  SS9nUR	                  SU [
        R                  45        UR                  5       nU(       d>  [        SS05      S	4U(       a  UR                  5         U(       a  UR                  5         $ $ US
   (       a  US
   R                  5       US
'   US   (       a  US   R                  5       US'   [        SUS.5      S4U(       a  UR                  5         U(       a  UR                  5         $ $ ! [        R                  R                   aT  n[        SS[        U5       305      S4s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)u    Obtener un documento específicoNr=   rV   r?   Tr{   a&  
            SELECT id, titulo, contenido, 
                   CASE WHEN archivo_audio IS NOT NULL THEN TRUE ELSE FALSE END as has_audio,
                   nombre_archivo, tipo_mime, creado_en, actualizado_en 
            FROM Documentos 
            WHERE id = %s AND usuario_id = %s
        Documento no encontrado  r   r   r9   )r:   documentr<   rb   )r1   r   r3   r4   r5   r   r`   ri   r   r(   r)   r,   rp   )r   r.   r4   r   r/   s        r0   get_documentr     s    JF&&(
G%LMNPSS@ LLN A ""d"3 	  7??+	- ??$G%>?@#E  LLN  K $,[$9$C$C$EH[!$%)12B)C)M)M)OH%& 
   LLN  ??   L#;CF8!DEFKKLLN L LLN s=   E AE AE G8GGG GG 1H z&/api/documents/<int:document_id>/audioc                    SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  5       nUR	                  SU [
        R                  45        UR                  5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ Uu  pEnSS	KJ	n  U" UU=(       d    S
SU=(       d    S S3SS.S9nUU(       a  UR                  5         U(       a  UR                  5         $ $ ! [        R                  R                   aT  n	[        SS[        U	5       305      S4s Sn	A	U(       a  UR                  5         U(       a  UR                  5         $ $ Sn	A	ff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)u,   Obtener el audio de un documento específicoNr=   rV   r?   z
            SELECT archivo_audio, nombre_archivo, tipo_mime 
            FROM Documentos 
            WHERE id = %s AND usuario_id = %s AND archivo_audio IS NOT NULL
        zAudio no encontrador   r   )Responser   zinline; filename="z	audio.mp3"zpublic, max-age=3600)zContent-DispositionzCache-Control)mimetyper   rb   )r1   r   r3   r4   r5   r   r`   ri   flaskr   r(   r)   r,   rp   )
r   r.   r4   resultarchivo_audior   r   r   responser/   s
             r0   get_document_audior   =  s    JF(&(
G%LMNPSSD LLN E ""$ 	  7??+		- "G%:;<cA( LLN ) 4:0y 	#.,);N<Yk;ZZ['\!7
 
 LLN  ??   L#;CF8!DEFKKLLN L LLN s<   D9 AD9 -D9 9F+F&1F+2F. &F++F. .1GPUTc                    [         R                  nU(       d  [        SS05      S4$ SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ UR                  5       nUR                  SU [         R                  45        UR                  5       (       d>  [        SS05      S	4U(       a  UR	                  5         U(       a  UR	                  5         $ $ / n/ nS
U;   a  US
   R                  5       n[        U5      S:  a>  [        SS05      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ [        U5      S:  a>  [        SS05      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ UR                  S5        UR                  U5        SU;   a%  UR                  S5        UR                  US   5        SU;   a%  UR                  S5        UR                  US   5        U(       d>  [        SS05      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ UR                  U 5        UR                  [         R                  5        SSR                  U5       S3nUR                  Xu5        UR                  5         [        SSS.5      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ ! [        R                  R                    aT  n[        SS[#        U5       305      S4s SnAU(       a  UR	                  5         U(       a  UR	                  5         $ $ SnAff = f! U(       a  UR	                  5         U(       a  UR	                  5         f f = f)z Actualizar documento del usuarior=   zNo se proporcionaron datosrR   NrV   r?   z;SELECT id FROM Documentos WHERE id = %s AND usuario_id = %sr   r   r   r   r   r   r   ztitulo = %sr   zcontenido = %sr   zarchivo_audio = %szNo hay campos para actualizarzUPDATE Documentos SET z, z" WHERE id = %s AND usuario_id = %sr9   z"Documento actualizado exitosamenter>   r<   rb   )r   rd   r   r1   r3   r4   r5   r`   ri   rf   rh   appendr   r6   r(   r)   r,   rp   )	r   rJ   r.   r4   update_fieldsvaluesr   queryr/   s	            r0   update_documentr   m  sI    <<D!=>?DDJF7&(
G%LMNPSSb LLN c ""$ 	T$goo6	8  G%>?@#ER LLN Q t(^))+F6{Q)KLMsR@ LLN C 6{R)TUVX[[< LLN ?   /MM&!$  !12MM${+,d"  !56MM$/0G%DEFK" LLN # 	k"goo&(=)A(BBdeu%;
   LLN  ??   L#;CF8!DEFKKLLN L LLN sP   L ;AL  :L *L 7BL 4A5L N7NNN NN 1N?DELETEc                    SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  5       nUR	                  SU [
        R                  45        UR                  S:X  a>  [        SS05      S4U(       a  UR                  5         U(       a  UR                  5         $ $ UR                  5         [        S	S
S.5      S4U(       a  UR                  5         U(       a  UR                  5         $ $ ! [        R                  R                   aT  n[        SS[        U5       305      S4s SnAU(       a  UR                  5         U(       a  UR                  5         $ $ SnAff = f! U(       a  UR                  5         U(       a  UR                  5         f f = f)zEliminar documento del usuarioNr=   rV   r?   z8DELETE FROM Documentos WHERE id = %s AND usuario_id = %sr   r   r   r9   z Documento eliminado exitosamenter>   r<   rb   )r1   r   r3   r4   r5   r   r`   rowcountr6   r(   r)   r,   rp   )r   r.   r4   r/   s       r0   delete_documentr     s    JF&(
G%LMNPSS* LLN + ""$ 	Q"GOO4	6 ??aG%>?@#E LLN  	9
   LLN  ??   L#;CF8!DEFKKLLN L LLN s<   D$ AD$ D$ $FFFF FF 1G
z/api/user/configc                     Sn Sn [        5       n U (       d>  [        SS05      S4U(       a  UR                  5         U (       a  U R                  5         $ $ U R                  SS9nUR	                  S[
        R                  45        UR                  5       nUR	                  S[
        R                  45        UR                  5       n0 nU HC  nUS	   nUS
   nUS;   a  UR                  5       S:H  XF'   M*  US:X  a  [        U5      XF'   M?  XtU'   ME     [        SUUS.5      S4U(       a  UR                  5         U (       a  U R                  5         $ $ ! [        R                  R                   aT  n[        SS[        U5       305      S4s SnAU(       a  UR                  5         U (       a  U R                  5         $ $ SnAff = f! U(       a  UR                  5         U (       a  U R                  5         f f = f)u"   Obtener configuración del usuarioNr=   rV   r?   Tr{   zVSELECT id, nombre_usuario, correo_electronico, foto_perfil FROM Usuarios WHERE id = %sr   r   r   r   r_   rZ   r9   )r:   r   r   r<   rb   )r1   r   r3   r4   r5   r   r`   ri   r   rg   r   r(   r)   r,   rp   )	r.   r4   r   r   r   r   r   r   r/   s	            r0   get_user_configr     s    JF)&(
G%LMNPSSF LLN G ""d"3 	ory  sB  sB  rD  	E//# 	|  @G  @O  @O  Q  	R//# F/0C01E CC',{{}'>$++',U|$',$  .
  	 LLN  ??   L#;CF8!DEFKKLLN L LLN s6   E CE G/F>	G
G >GG 1G7c                  `   [         R                  n SnSn [        5       nU(       d>  [        SS05      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ UR                  5       nU R                  5        H  u  p4[        U[        5      (       a  U(       a  SOSnO[        U5      nUR                  S[         R                  U45        UR                  5       (       a%  UR                  SU[         R                  U45        M  UR                  S	[         R                  X545        M     UR                  5         [        S
SS.5      S4U(       a  UR	                  5         U(       a  UR	                  5         $ $ ! [        R                  R                    aT  n[        SS[        U5       305      S4s SnAU(       a  UR	                  5         U(       a  UR	                  5         $ $ SnAff = f! U(       a  UR	                  5         U(       a  UR	                  5         f f = f)u%   Actualizar configuración del usuarioNr=   rV   r?   r_   r]   zZSELECT id FROM Configuraciones_Usuario WHERE usuario_id = %s AND nombre_configuracion = %sz
                    UPDATE Configuraciones_Usuario 
                    SET valor_configuracion = %s 
                    WHERE usuario_id = %s AND nombre_configuracion = %s
                z
                    INSERT INTO Configuraciones_Usuario (usuario_id, nombre_configuracion, valor_configuracion) 
                    VALUES (%s, %s, %s)
                r9   u'   Configuración actualizada exitosamenter>   r<   rb   )r   rd   r1   r   r3   r4   items
isinstanceboolrp   r5   r`   ri   r6   r(   r)   r,   )rJ   r.   r4   r   r   	str_valuer/   s          r0   update_user_configr    s    <<DJF.&(
G%LMNPSSP LLN Q ""$ **,JC%&&&+F	J	 NNw"??C02       #6	8    oos68) '2 	@
   LLN  ??   L#;CF8!DEFKKLLN L LLN s6   F %C2F G9%G4?G9 G< 4G99G< <1H-r   c                      [        S5      $ )u   Página de loginz
login.htmlr   r'   rA   r0   indexr  A       <((rA   z/modo_visualc                      [        S5      $ )u$   Página del asistente en modo visualzModo_Visual.htmlr  r'   rA   r0   r   r   F  s     -..rA   z/modo_auditivoc                      [        S5      $ )u&   Página del asistente en modo auditivozModo_Auditivo.htmlr  r'   rA   r0   r   r   K  s     /00rA   z/bibliotecac                      [        S5      $ )u$   Página de la biblioteca de recursoszlibrary.htmlr  r'   rA   r0   r   r   P  s     >**rA   z/configuracionc                      [        S5      $ )u   Página de configuraciónzconfig.htmlr  r'   rA   r0   r   r   U  s     =))rA   z/inicioc                      [        S5      $ )u$   Página principal después del loginz
index.htmlr  r'   rA   r0   r   r   Z  r	  rA   z/leer-archivoc                  |   S[         R                  ;  a  [        SS05      S4$ [         R                  S   n U R                  S:X  a  [        SS05      S4$ U R                  R	                  5       n UR                  S5      (       a   U R                  5       R                  S5      nOUR                  S	5      (       aZ  U R                  S
5        [        S
5      nSnUR                   H  nX$R                  5       -  nM     [        R                  " S
5        OcUR                  S5      (       a>  U R                  S5        [        R                  " S5      n[        R                  " S5        O[        SS05      S4$ [        SU R                  US.5      S4$ ! [          a  n[        SSU 305      S4s SnA$ SnAff = f)z"Leer contenido de archivos subidosfiler=   u%   No se ha seleccionado ningún archivorR    u   Archivo vacíoz.txtrW   z.pdfztemp.pdfz.docxz	temp.docxz,Formato no soportado. Usa .txt, .pdf o .docxr9   )r:   nombretextor<   zError al leer el archivo: r?   N)r   filesr   filenamerg   endswithr   rn   saver   pagesextract_textr   removedocx2txtprocessrq   )archivor  r   readerpager/   s         r0   leer_archivor   a  s    W]]"!HIJCOOmmF#G2!123S88%%'HIV$$--g6Iv&&LL$z*FI..00	 %IIj!w''LL% ((5IIIk" G%STUWZZZ&&
  	 	  I#=aS!ABCSHHIs%   1DF :F 
F;F60F;6F;z/healthc                      [        5       n U (       a  SOSnU (       a  U R                  5         [        S[        R                  " 5       R                  5       US.5      S4$ )zHealth check endpoint	connecteddisconnectedhealthy)r:   	timestampr    r<   )r1   r3   r   r   r   r   )r.   	db_statuss     r0   health_checkr'    sX     #$J)~I\\^--/  		 rA   __main__u#   🚀 Iniciando aplicación Auris...u,   ✅ Base de datos inicializada correctamenteu)   ⚠️ Error al inicializar base de datosPORTi  u&   🌐 Servidor ejecutándose en puerto 	FLASK_ENVdevelopmentz0.0.0.0)r   portdebug)J__doc__r   sysrd   mysql.connectorr(   r   r   r   r   r   r   r   r	   r
   
flask_corsr   rj   r   r  PyPDF2r   werkzeug.utilsr   backend.routes.tts_routesr   base64r   r   abspathr   dirname__file__r   template_dir
static_dirr   appregister_blueprintenvironr   
secret_keyr+   r#   intr$   r1   r7   router@   rw   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r   r   r'  r-   r,  
debug_moderunr'   rA   r0   <module>rC     s  
 
 
   ( Y Y   
   * ,   wwrww||BGGOOH,EtLMww||L*kBWW\\,
H=
 H($& S	   v  .EF JJNN9k2JJNN9f-

}l;

y'2	  02IJrzz~~.H'RS =B > $ ?VH-Q .Qf <&*N +Nd#N fX.s  /sj eW-)  .)V -w?*  @*X 3eWE,  F,\ -w?@  @@D -zB  CF w/-  0-^ w/4  04p 3) ) >/ / 1 1 =+ + * * 9) ) ?VH-&I .&IT 9  z	
/0 <=9:rzz~~fd+,D	24&
9:,=JGGZG8 rA   