o
    Ej                     @  sZ   d dl mZ d dlmZ d dlmZ d dlmZmZ G dd dZ	dd
dZ
dddZdS )    )annotations)Path)Any)quoteunquotec                   @  s`   e Zd ZdZd#ddZd$ddZd%ddZd&ddZd'ddZd(ddZ	d)ddZ
d*d d!Zd"S )+LocalPrivateStoragezprivate-mediaroot
str | PathreturnNonec                 C  s   t || _| jjddd d S )NTparentsexist_ok)r   r   mkdir)selfr    r   F/opt/sixxie/releases/current/services/storage/local_private_storage.py__init__   s   
zLocalPrivateStorage.__init__user_idstrpet_idmedia_idfilenamecontent_typecontentbytesc          
   
   C  sz   t ||}| jt| t| t| }|jddd || }	|	| | j dt| dt| dt| dt| 	S )NTr   :///)_safe_filenamer   _safe_segmentr   write_bytesschemer   )
r   r   r   r   r   r   r   	safe_name	media_dirpathr   r   r   	put_media   s   


2zLocalPrivateStorage.put_mediastorage_refc                 C  s   |  | S N)_path_from_ref
read_bytesr   r&   r   r   r   read    s   zLocalPrivateStorage.readc                 C  s"   |  |}| r|  d S d S r'   )r(   existsunlink)r   r&   r$   r   r   r   delete#   s   
zLocalPrivateStorage.deleteboolc                 C  s&   z|  | W S  ty   Y dS w )NF)r(   r,   
ValueErrorr*   r   r   r   r,   (   s
   zLocalPrivateStorage.existsc                 C  s.   t | jdt| d}tdd |D S )Nz*/*/z/*c                 s  s    | ]}|  V  qd S r'   )is_file).0r$   r   r   r   	<genexpr>0   s    z7LocalPrivateStorage.exists_for_media.<locals>.<genexpr>)listr   globr   any)r   r   matchesr   r   r   exists_for_media.   s   z$LocalPrivateStorage.exists_for_mediadict[str, Any]c                 C  s   | j  o	| j  ddS )NT)okroot_configured)r   r,   is_dir)r   r   r   r   health2   s   zLocalPrivateStorage.healthr   c           	   
   C  s   | j  d}||stddd |t|d  dD }t|dkr)tddd |d d	 D }t|d	 d
}| jjg ||R   }| j }z|	| W |S  tyf } ztd|d }~ww )Nr   zunsupported storage refc                 S  s   g | ]}|rt |qS r   )r   r2   partr   r   r   
<listcomp><   s    z6LocalPrivateStorage._path_from_ref.<locals>.<listcomp>r      zinvalid storage refc                 S  s   g | ]}t |qS r   )r   r>   r   r   r   r@   ?   s        z storage ref escapes storage root)
r!   
startswithr0   lensplitr   r   joinpathresolverelative_to)	r   r&   prefixparts
safe_partsr"   r$   r   excr   r   r   r(   8   s"   
 

z"LocalPrivateStorage._path_from_refN)r   r	   r
   r   )r   r   r   r   r   r   r   r   r   r   r   r   r
   r   )r&   r   r
   r   )r&   r   r
   r   )r&   r   r
   r/   )r   r   r
   r/   )r
   r9   )r&   r   r
   r   )__name__
__module____qualname__r!   r   r%   r+   r.   r,   r8   r=   r(   r   r   r   r   r      s    






r   valuer   r
   c                 C  s&   d dd t| D d}|pdS )NrC   c                 s  s$    | ]}|  s|d v r|V  qdS )>   _-N)isalnum)r2   chr   r   r   r3   K   s   " z _safe_segment.<locals>.<genexpr>z._-item)joinr   strip)rQ   cleanedr   r   r   r   J   s   r   r   r   c                 C  sJ   t | j }|dvrddddd|d}tt | jpd}| | S )	N>   .jpeg.gif.jpg.png.webpr]   r\   r^   r[   )z	image/pngz
image/jpegz
image/webpz	image/gifz.binupload)r   suffixlowergetr   stem)r   r   r`   rc   r   r   r   r   O   s   r   N)rQ   r   r
   r   )r   r   r   r   r
   r   )
__future__r   pathlibr   typingr   urllib.parser   r   r   r   r   r   r   r   r   <module>   s    
B