
    hD                     b    d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 ddl
mZ  G d de      Zy)	    N)ClientError)ListDictAny)
UploadFile   )StorageInterfacec            	           e Zd ZdedededefdZdedee   deeef   fd	Z	d
edefdZ
d
edefdZdedee   fdZddededeeef   fdZddededeeef   fdZy)	S3Storagebucket_nameregion
access_key
secret_keyc                 N    || _         t        j                  d|||      | _        y )Ns3)region_nameaws_access_key_idaws_secret_access_key)r   boto3client	s3_client)selfr   r   r   r   s        O/var/www/dev.api.imparables.com.co/api_imparables/landing/storage/s3_storage.py__init__zS3Storage.__init__	   s&    &(",	
    folder_pathfilesreturnc           	        K   g }|D ]  }| d|j                    }	 |j                  j                  d       |j                          d {   }| j                  j                  | j                  |||j                         d| j                   d| }|j                  |j                   ||t        |      d        dd|dS 7 z# t        $ r*}dd|j                    d	t        |       d
cY d }~c S d }~ww xY ww)N/r   )BucketKeyBodyContentTypehttps://.s3.us-east-2.amazonaws.com/)filenames3_keyurlsizeFzError al subir z: )successmessageTzArchivos subidos exitosamenter+   r,   r   )r'   fileseekreadr   
put_objectr   content_typeappendlenr   str)	r   r   r   uploaded_filesr.   file_keycontentfile_urles	            r   
save_fileszS3Storage.save_files   s     	D%a7H		q! $		+ ))++   $ 1 1	 *  &d&6&6%77ST\S]^%% $&#L	' %	@ 6#
 	
3 ,&  $!0r#a&J sG   C=.C
CA2C=C=C	C:C5-C:.C=5C::C=	file_pathc                 .   K   d| j                    d| S w)Nr%   r&   )r   r   r<   s     r   get_file_urlzS3Storage.get_file_url:   s!     $**++G	{SSs   c                 z   K   	 | j                   j                  | j                  |       y# t        $ r Y yw xY ww)Nr!   r"   TF)r   delete_objectr   r   r>   s     r   delete_filezS3Storage.delete_file=   s<     	NN((0@0@i(P 		s   ;', ;	8;8;c                    K   	 | j                   j                  | j                  |      }|j                  dg       D cg c]  }|d   	 c}S c c}w # t        $ r g cY S w xY ww)Nr!   PrefixContentsr"   )r   list_objects_v2r   getr   )r   r   responseobjs       r   
list_fileszS3Storage.list_filesD   sh     	~~55''" 6 H +3,,z2*FG3CJGGG 	I	s9   A$;A AA A$A A!A$ A!!A$	max_filesc           	        K   	 | j                   j                  | j                  |      }d|vrddg dS g }|d   D ]R  }|d   |j                  d      k7  s|j	                  |d   |d   j                  d      d   |d	   |d
   |d   d       T |j                  d d       |d| }g }|D ]2  }|j	                  |d   |d   |d   |d   j                         d       4 ddt        |       d||t        |      t        |      dS # t        $ r}	ddt        |	       g dcY d}	~	S d}	~	wt        $ r}	ddt        |	       g dcY d}	~	S d}	~	ww xY ww)u0  
        Lista archivos con metadatos sin generar URLs firmadas.
        
        Args:
            folder_path: Ruta de la carpeta en S3
            max_files: Número máximo de archivos a retornar
        
        Returns:
            Dict con información de los archivos (sin URLs firmadas)
        rE   rG   Tz(No se encontraron archivos en la carpetar-   r"   r    SizeLastModifiedETag)keyr'   r*   last_modifiedetagc                     | d   S )NrT    )xs    r   <lambda>z4S3Storage.list_files_with_metadata.<locals>.<lambda>q   s    !O*< r   )rS   reverseNr'   rS   r*   rT   )r'   r(   r*   rT   zArchivos listados: z	 archivos)r+   r,   r   r   total_files_in_folderfiles_returnedFz Error al listar archivos de S3: Error inesperado: )r   rH   r   rstripr3   splitsort	isoformatr4   r   r5   	Exception)
r   r   rM   rJ   
files_inforK   latest_filesfiles_with_metadata	file_infor:   s
             r   list_files_with_metadataz"S3Storage.list_files_with_metadataN   s    8	~~55''" 6 H
 )#I  J
+ u:!3!3C!88%%"5z$'J$4$4S$9"$= #F),^)< #F'  OO <dOK%jy1L"$) 	#** )* 5'.%f-%.%?%I%I%K	,   05H1I0J)T*,),Z"%&9":   	 =c!fXF 
  	 /Ax8 	s]   E0D E!D B3D 
E	ED+%E&E+E7EE	EEEr(   
expirationc                   K   	 	 | j                   j                  | j                  |       | j                   j                  d	| j                  |d|
      }ddlm}m} |j                          ||      z   }dd||j                         |dS # t        $ r'}|j                  d   d   dk(  rddi dcY d}~S |d}~ww xY w# t        $ r}ddt        |       i dcY d}~S d}~wt        $ r}ddt        |       i dcY d}~S d}~ww xY ww)u  
        Genera una URL firmada para un archivo específico.
        
        Args:
            s3_key: Clave del archivo en S3
            expiration: Tiempo de expiración en segundos
        
        Returns:
            Dict con la URL firmada y metadatos
        rA   ErrorCode404FzArchivo no encontrado en S3)r+   r,   dataN
get_object)Params	ExpiresInr   )datetime	timedelta)secondsTz!URL firmada generada exitosamente)r+   r,   
signed_url
expires_at
expires_inzError al generar URL firmada: r]   )r   head_objectr   r   rJ   generate_presigned_urlrq   rr   nowra   r5   rb   )r   r(   rh   r:   rt   rq   rr   ru   s           r   get_signed_urlzS3Storage.get_signed_url   s9    /	
**$2B2B*O >>"..! % ? J 5!)J*GGJ  >((224( 1  ::g&v.%7#(#@ "  G@  	 ;CF8D 
  	 /Ax8 	s   D'B A"C D	B?B:2B?3C 7D8B::B??C 	D
C"D
D"D
.D?D
 DD

DN)   )i,  )__name__
__module____qualname__r5   r   r   r   r   r   r;   r?   boolrC   rL   intrg   rz   rW   r   r   r   r      s    
C 
 
# 
SV 
&
C &
Z8H &
TRUWZRZ^ &
PTC TC T3 4 C DI C# C# CVZ[^`c[cVd CJ:3 :C :$sTWx. :r   r   )r   osbotocore.exceptionsr   typingr   r   r   fastapir   base_storager	   r   rW   r   r   <module>r      s)     	 + " "  *E  Er   