
    Xj(                         d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ  ee          Z G d d          Zd	ad
efdZd	S )    )	timedelta)BinaryIO)Minio)S3Error)StorageError)
get_loggerc                   B   e Zd Z	 	 	 	 d#dedededefdZd	ed
dfdZ	 d$d	ededededed
efdZ		 d$d	edededed
ef
dZ
d	ededed
efdZd	eded
edz  fdZd	eded
efdZd	eded
efdZ ed          fd	ededed
edz  fdZd%d	eded ed
efd!Zd	eded
efd"ZdS )&MinioServicelocalhost:9000
minioadminFendpoint
access_key
secret_keysecurec                 
   || _         || _        || _        || _        	 t	          ||||          | _        t                              d|            d S # t          $ r#}t          	                    d|             d }~ww xY w)Nr   r   r   r   z!Successfully connected to MinIO: zFailed to connect to MinIO: )
r   r   r   r   r   clientloggerinfo	Exceptionerror)selfr   r   r   r   es         B/lsinfo/ai/hellotax_ai/base_platform/app/services/storage/minio.py__init__zMinioService.__init__   s     !$$	!jZX^  DK KKFHFFGGGGG 	 	 	LL;;;<<<	s   5A 
BA==Bbucket_namereturnNc                    	 | j                             |          s9| j                             |           t                              d|            d S t                              d|            d S # t
          $ rG}t                              d| d|            t          dt          |           |          d d }~ww xY w)NzCreated bucket: zBucket already exists: zFailed to create bucket : zFailed to create bucket: bucket)	r   bucket_existsmake_bucketr   r   r   r   r   str)r   r   r   s      r   ensure_bucketzMinioService.ensure_bucket&   s    	c;,,[99 E''444<{<<=====CkCCDDDDD 	c 	c 	cLLFKFF1FFGGGC3q66CCKXXX^bb	cs   AA4 A4 4
C>AC  Capplication/octet-streamobject_name	file_data	file_sizecontent_typec                    	 |                      |           | j                            |||||           t                              d| d|            dS # t
          $ r(}t                              d|            Y d }~dS d }~ww xY w)N)r   r'   datalengthr*   File uploaded successfully: /TFile upload failed: F)r%   r   
put_objectr   r   r   r   )r   r   r'   r(   r)   r*   r   s          r   upload_filezMinioService.upload_file1   s    	{+++K""'' ) #    KKR{RR[RRSSS4 	 	 	LL33344455555	s   AA 
B
"BB
	file_pathc                    	 |                      |           | j                            ||||           t                              d| d|            dS # t
          $ r(}t                              d|            Y d }~dS d }~ww xY w)N)r   r'   r3   r*   r.   r/   Tr0   F)r%   r   fput_objectr   r   r   r   )r   r   r'   r3   r*   r   s         r   upload_file_from_pathz"MinioService.upload_file_from_pathH   s    	{+++K##''#)	 $    KKR{RR[RRSSS4 	 	 	LL33344455555	s   AA 
B	!BB	c                     	 | j                             |||           t                              d| d| d|            dS # t          $ r(}t                              d|            Y d }~dS d }~ww xY w)N)r   r'   r3   zFile downloaded successfully: r/   z -> TzFile download failed: F)r   fget_objectr   r   r   r   )r   r   r'   r3   r   s        r   download_filezMinioService.download_file]   s    	K##'[I $    KKccc{ccXaccddd4 	 	 	LL5!5566655555	s   A A 
A6A11A6c                 b   	 | j                             ||          }|                                }|                                 |                                 t
                              d| d|            |S # t          $ r(}t
                              d|            Y d }~d S d }~ww xY w)Nr   r'   z"File data retrieved successfully: r/   zFailed to get file data: )	r   
get_objectreadcloserelease_connr   r   r   r   )r   r   r'   responser,   r   s         r   get_file_datazMinioService.get_file_datah   s    		{--+S^-__H==??DNN!!###KKX[XX;XXYYYK 	 	 	LL8Q8899944444	s   A9A< <
B.B))B.c                     	 | j                             ||           t                              d| d|            dS # t          $ r(}t                              d|            Y d }~dS d }~ww xY w)Nr;   zFile deleted successfully: r/   TzFile deletion failed: F)r   remove_objectr   r   r   r   )r   r   r'   r   s       r   delete_filezMinioService.delete_filet   s    	K%%+;%WWWKKQkQQKQQRRR4 	 	 	LL5!5566655555	s   <A   
A2
A--A2c                 b    	 | j                             ||           dS # t          $ r Y dS w xY w)Nr;   TF)r   stat_objectr   )r   r   r'   s      r   file_existszMinioService.file_exists}   sI    	K###UUU4 	 	 	55	s     
..   )hoursexpiresc                     	 | j                             |||          }t                              d| d|            |S # t          $ r(}t                              d|            Y d }~d S d }~ww xY w)N)r   r'   rJ   zGenerated presigned URL: r/   z"Failed to generate presigned URL: )r   presigned_get_objectr   r   r   r   )r   r   r'   rJ   urlr   s         r   get_presigned_urlzMinioService.get_presigned_url   s    	+22'[' 3  C KKOKOO+OOPPPJ 	 	 	LLAaAABBB44444	s   >A 
A3A..A3 Tprefix	recursivec                    	 | j                             |||          }g }|D ]0}|                    |j        |j        |j        |j        d           1|S # t          $ r)}t          	                    d|            g cY d }~S d }~ww xY w)Nr   rP   rQ   )r'   sizelast_modifiedetagzFailed to list objects: )
r   list_objectsappendr'   rT   rU   rV   r   r   r   )r   r   rP   rQ   objectsresultobjr   s           r   rW   zMinioService.list_objects   s    	k..') /  G F  '* #),): #	     M 	 	 	LL7A77888IIIIII	s   AA 
B	 B>B	B	c                 X  	 ddl m	 	 | j                            ||d          }	fd|D             }|s"t                              d| d|            dS t          | j                            ||                    }|r]d |D             }t                              d	t          |           d
|            t          d	t          |           d| |          t          |          }t                              d| d| d|            |S # t          $ r  t          $ r}t          |dd          dk    r&t                              d| d|            Y d }~dS t                              d| d|            t          dt          |           |          d d }~ww xY w)Nr   )DeleteObjectTrS   c                 0    g | ]} |j                   S  r'   ).0r[   r]   s     r   
<listcomp>z1MinioService.delete_by_prefix.<locals>.<listcomp>   s%    LLLS<<88LLL    zNo objects found with prefix: r/   c                     g | ]	}|j         
S r_   r`   )ra   r   s     r   rb   z1MinioService.delete_by_prefix.<locals>.<listcomp>   s    ===q}===rc   zFailed to delete z
 objects: z objects under prefix r    zDeleted z objects with prefix: coderO   NoSuchBucketz-Bucket does not exist, skip prefix deletion: z#Failed to delete objects by prefix r   z$Failed to delete objects by prefix: )minio.deleteobjectsr]   r   rW   r   r   listremove_objectsr   lenr   r   getattrr$   )
r   r   rP   rY   delete_listerrorserror_namesdeleted_countr   r]   s
            @r   delete_by_prefixzMinioService.delete_by_prefix   s*   444444	nk..'$ /  G MLLLGLLLK S[SS6SSTTTq$+44[+NNOOF ==f===UVUUUUVVV"SFSS6SS&     ,,MKK^=^^^^V\^^___   	 	 	 	n 	n 	nq&"%%77bKbbZ`bbcccqqqqqLLLvLLLLMMMNc!ffNNWbcccimm	ns&   AD B:D F)'5F$"AF$$F))r   r   r   F)r&   )rO   T)__name__
__module____qualname__r$   boolr   r%   r   intr2   r6   r9   bytesrA   rD   rG   r   rN   rh   rW   rp   r_   rc   r   r
   r
      s        )&&   	
    (	c 	c 	c 	c 	c 	c" 7   	
   
   8 7   	
  
   *	 	3 	3 	SW 	 	 	 	
 
3 
54< 
 
 
 
s      s       HQyWXGYGYGY -0;D	t     S $ Z^    (nC n n n n n n n nrc   r
   Nr   c                      t           Cddlm}  t          | j        | j        | j        | j                                        dk              a t           S )Nr   settingstruer   )	_minio_service
app.configry   r
   MINIO_ENDPOINTMINIO_ACCESS_KEYMINIO_SECRET_KEYMINIO_SECURElowerrx   s    r   get_minio_servicer      sa    '''''' &,00(..00F:	
 
 
 rc   )datetimer   typingr   minior   minio.errorr   app.core.exceptionsr   common_loggingr   rq   r   r
   r{   r   r_   rc   r   <module>r      s                            , , , , , , % % % % % %	H		
rn rn rn rn rn rn rn rnj <      rc   