
    +j2,                        d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ  G d de          Z G d d	e          Ze G d
 d                      Z G d de	          Z G d de	          Z G d de	          Z G d de	          Z G d de	          Z G d de	          Z G d de          Z G d de	          ZdS )    N)	dataclass)AnyLiteralvalidate_blake3_hash)	BaseModel
ConfigDictFieldconintfield_validatormodel_validatorc                   0     e Zd ZdZdededef fdZ xZS )UploadErrorz6Error during upload parsing with HTTP status and code.statuscodemessagec                 t    t                                          |           || _        || _        || _        d S N)super__init__r   r   r   )selfr   r   r   	__class__s       9/home/wildlama/comfy/ComfyUI/app/assets/api/schemas_in.pyr   zUploadError.__init__   s4    !!!	    )__name__
__module____qualname____doc__intstrr   __classcell__r   s   @r   r   r      sX        @@s #           r   r   c                   ,     e Zd ZdZdedef fdZ xZS )AssetValidationErrorzDValidation error in asset processing (invalid tags, metadata, etc.).r   r   c                 f    t                                          |           || _        || _        d S r   )r   r   r   r   )r   r   r   r   s      r   r   zAssetValidationError.__init__   s-    !!!	r   )r   r   r   r   r    r   r!   r"   s   @r   r$   r$      sQ        NNS 3          r   r$   c                       e Zd ZU dZeed<   eed<   edz  ed<   edz  ed<   ee         ed<   edz  ed<   edz  ed	<   edz  ed
<   edz  ed<   dZ	edz  ed<   dZ
edz  ed<   dS )ParsedUploadz-Result of parsing a multipart upload request.file_presentfile_writtenNfile_client_nametmp_pathtags_rawprovided_nameuser_metadata_rawprovided_hashprovided_hash_existsprovided_mime_typeprovided_preview_id)r   r   r   r   bool__annotations__r   r    listr1   r2    r   r   r'   r'   #   s         77Dj   Dj3i:Tz!!!:+%%%%)d
)))&*t*****r   r'   c                      e Zd ZU  ee          Zee         ed<    ee          Zee         ed<   dZ	edz  ed<   dZ
eeef         dz  ed<   dZ edd	
          ed<   dZ ed          ed<   dZedz  ed<   dZed         ed<   dZed         ed<    eddd          ed                         Z edd          ed                         ZdS )ListAssetsQuerydefault_factoryinclude_tagsexclude_tagsNname_containsmetadata_filter      i  gelelimitr   )rB   offsetafter
created_at)namerG   
updated_atsizelast_access_timesortdesc)ascrM   orderbeforemodec                 @   |g S t          |t                    rd |                    d          D             S t          |t                    rPg }|D ]I}t          |t                    r2|                    d |                    d          D                        J|S |S )Nc                 ^    g | ]*}|                                 |                                 +S r6   strip.0ts     r   
<listcomp>z3ListAssetsQuery._split_csv_tags.<locals>.<listcomp>P   -    AAA!qwwyyAAGGIIAAAr   ,c                 ^    g | ]*}|                                 |                                 +S r6   rU   rW   s     r   rZ   z3ListAssetsQuery._split_csv_tags.<locals>.<listcomp>U   -    PPPaaggiiP		PPPr   
isinstancer    splitr5   extendclsvoutitems       r   _split_csv_tagszListAssetsQuery._split_csv_tagsI   s     9Ia 	BAAqwws||AAAAa 	C R RdC(( RJJPP4::c??PPPQQQJr   c                 L   |t          |t                    r|S t          |t                    ru|                                ra	 t	          j        |          }n%# t          $ r}t          d|           |d }~ww xY wt          |t                    st          d          |S d S Nzmetadata_filter must be JSON: z%metadata_filter must be a JSON objectr`   dictr    rV   jsonloads	Exception
ValueErrorrd   re   parsedes       r   _parse_metadata_jsonz$ListAssetsQuery._parse_metadata_jsonY        9
1d++9Ha 	!'')) 	NA N N N !E!!E!EFFAMNfd++ J !HIIIMt   A 
A;#A66A;)r   r   r   r
   r5   r;   r    r4   r<   r=   r>   rl   r   rD   r   rE   rF   rL   r   rO   r   classmethodrh   rt   r6   r   r   r8   r8   4   s~        #eD999L$s)999#eD999L$s)999 $M3:$$$ .2OT#s(^d*111"$E66Q3$$$FFFaLLL
 E3: 	 	'P
Q    %+E7=!***_^^(CCC  [ DC _&X666  [ 76  r   r8   c                       e Zd ZU dZedz  ed<   dZeeef         dz  ed<   dZ	edz  ed<    e
d          d             ZdS )UpdateAssetBodyNrH   user_metadata
preview_idrF   rQ   c                 z    t          d | j        | j        | j        fD                       rt	          d          | S )Nc              3      K   | ]}|d u V  	d S r   r6   )rX   re   s     r   	<genexpr>z?UpdateAssetBody._validate_at_least_one_field.<locals>.<genexpr>p   s:       
 
 I
 
 
 
 
 
r   z9Provide at least one of: name, user_metadata, preview_id.)allrH   rz   r{   rp   )r   s    r   _validate_at_least_one_fieldz,UpdateAssetBody._validate_at_least_one_fieldn   s\     
 
i!3T_E
 
 
 
 
 	 K   r   )r   r   r   rH   r    r4   rz   rl   r   r{   r   r   r6   r   r   ry   ry   i   s         D#*+/M4S>D(///!Jd
!!!_'"""  #"  r   ry   c                   D   e Zd ZU  edd          Zeed<   dZedz  ed<    ee	          Z
e	e         ed<    ee          Zeeef         ed	<   dZedz  ed
<   dZedz  ed<    ed          ed                         Z edd          ed                         ZdS )CreateFromHashBodyignoreTextrastr_strip_whitespacehashNrH   r9   tagsrz   	mime_typer{   c                 $    t          |pd          S )N r   rd   re   s     r   _require_blake3z"CreateFromHashBody._require_blake3   s     $AG,,,r   rP   rQ   c                 B   |g S t          |t                    rQd |D             }t                      }g }|D ]0}||vr*|                    |           |                    |           1|S t          |t
                    rd |                    d          D             S g S )Nc                     g | ]V}t          |                                          #t          |                                                                          WS r6   )r    rV   lowerrW   s     r   rZ   z<CreateFromHashBody._normalize_tags_field.<locals>.<listcomp>   sE    GGGaAG3q66<<>>''))GGGr   c                     g | ]<}|                                 |                                                                 =S r6   rV   r   rW   s     r   rZ   z<CreateFromHashBody._normalize_tags_field.<locals>.<listcomp>   s7    III!qwwyyIAGGIIOO%%IIIr   r\   )r`   r5   setaddappendr    ra   )rd   re   rf   seendeduprY   s         r   _normalize_tags_fieldz(CreateFromHashBody._normalize_tags_field   s     9Ia 	GG1GGGC55DE $ $D==HHQKKKLLOOOLa 	JIIqwws||IIII	r   )r   r   r   r	   model_configr    r4   rH   r
   r5   r   rl   rz   r   r   r{   r   rw   r   r   r6   r   r   r   r   z   s        :H4HHHL
IIID#*eD111D$s)111$)E$$?$?$?M4S>??? IsTz   !Jd
!!!_V- - [ - _V(+++  [ ,+  r   r   c                   B   e Zd ZU  ee          Zee         ed<    ee          Zee         ed<   dZ	edz  ed<   dZ
eeef         dz  ed<   dZ edd	
          ed<    eddd          ed                         Z edd          ed                         ZdS )TagsRefineQueryr9   r;   r<   Nr=   r>   d   r@     rA   rD   rP   rQ   c                 @   |g S t          |t                    rd |                    d          D             S t          |t                    rPg }|D ]I}t          |t                    r2|                    d |                    d          D                        J|S |S )Nc                 ^    g | ]*}|                                 |                                 +S r6   rU   rW   s     r   rZ   z3TagsRefineQuery._split_csv_tags.<locals>.<listcomp>   r[   r   r\   c                 ^    g | ]*}|                                 |                                 +S r6   rU   rW   s     r   rZ   z3TagsRefineQuery._split_csv_tags.<locals>.<listcomp>   r^   r   r_   rc   s       r   rh   zTagsRefineQuery._split_csv_tags   s     9Ia 	BAAqwws||AAAAa 	C R RdC(( RJJPP4::c??PPPQQQJr   c                 L   |t          |t                    r|S t          |t                    ru|                                ra	 t	          j        |          }n%# t          $ r}t          d|           |d }~ww xY wt          |t                    st          d          |S d S rj   rk   rq   s       r   rt   z$TagsRefineQuery._parse_metadata_json   ru   rv   )r   r   r   r
   r5   r;   r    r4   r<   r=   r>   rl   r   rD   r   r   rw   rh   rt   r6   r   r   r   r      s        #eD999L$s)999#eD999L$s)999 $M3:$$$-1OT#s(^d*111#&E66Q4   &&&_^^(CCC  [ DC _&X666  [ 76  r   r   c                      e Zd ZU  edd          Z eddd          Zedz  ed<    ed	dd
          Z	e
ed<    eddd          Ze
ed<   dZed         ed<   dZeed<    ed          ededz  dedz  fd                        ZdS )TagsListQueryr   Tr   Nr@      )
min_length
max_lengthprefixr   r   rA   rD   r   i rE   
count_desc)r   name_ascrO   include_zerore   returnc                 ^    ||S |                                 }|                                pd S r   r   r   s     r   normalize_prefixzTagsListQuery.normalize_prefix   s.     9HGGIIwwyy D r   )r   r   r   r	   r   r
   r   r    r4   rD   r   rE   rO   r   r   r3   r   rw   r   r6   r   r   r   r      s         :H4HHHLtcBBBFC$JBBBsqT***E3***%aJ///FC////;E7+,;;;L$_X!t !d
 ! ! ! [ ! ! !r   r   c                       e Zd ZU  ed          Z edd          Zee         e	d<    e
d          edee         dee         fd	                        Zd
S )TagsAddr   )r   .r@   )r   r   re   r   c                 \   g }|D ]c}t          |t                    st          d          |                                                                }|r|                    |           dt                      }g }|D ]0}||vr*|                    |           |                    |           1|S )Nztags must be strings)r`   r    	TypeErrorrV   r   r   r   r   )rd   re   rf   rY   tnormr   deduplicatedxs           r   normalize_tagszTagsAdd.normalize_tags   s      	" 	"Aa%% 8 6777GGIIOO%%E "

5!!!uu 	' 	'A}}##A&&&r   N)r   r   r   r	   r   r
   r   r5   r    r4   r   rw   r   r6   r   r   r   r      s         :H---LeCA...D$s)..._VtCy T#Y    [   r   r   c                       e Zd ZdS )
TagsRemoveN)r   r   r   r6   r   r   r   r      s        Dr   r   c                      e Zd ZU dZ edd          Z ee          Zee	         e
d<    eddd	
          Ze	dz  e
d<    ee          Zee	ef         e
d<    ed          Ze	dz  e
d<    ed          Ze	dz  e
d<    ed          Ze	dz  e
d<    edd          ed                         Z edd          ed                         Z edd          ed                         Z ed          d             ZdS )UploadAssetSpeca  Upload Asset operation.

    - tags: optional list; if provided, first is root ('models'|'input'|'output');
            if root == 'models', second must be a valid category
    - name: display name
    - user_metadata: arbitrary JSON object (optional)
    - hash: optional canonical 'blake3:<hex>' for validation / fast-path
    - mime_type: optional MIME type override
    - preview_id: optional asset_reference ID for preview

    Files are stored using the content hash as filename stem.
    r   Tr   r9   r   Ni   zDisplay Name)defaultr   descriptionrH   rz   )r   r   r   r{   rP   rQ   c                 r    |d S t          |                                          }|sd S t          |          S r   )r    rV   r   )rd   re   ss      r   _parse_hashzUploadAssetSpec._parse_hash  s<     94FFLLNN 	4#A&&&r   c                    g }|g S t          |t                    r|g}t          |t                    r|D ]}|t          |                                          }|s)|                    d          r[	 t          j        |          }t          |t                    r |                    d |D                        n# t          $ r Y nw xY w|                    d |	                    d          D                        ng S g }t                      }|D ]e}t          |                                                                          }	|	r.|	|vr*|                    |	           |                    |	           f|S )a9  
        Accepts a list of strings (possibly multiple form fields),
        where each string can be:
          - JSON array (e.g., '["models","loras","foo"]')
          - comma-separated ('models, loras, foo')
          - single token ('models')
        Returns a normalized, deduplicated, ordered list.
        N[c              3   4   K   | ]}t          |          V  d S r   )r    )rX   r   s     r   r~   z.UploadAssetSpec._parse_tags.<locals>.<genexpr>,  s(      (=(=AQ(=(=(=(=(=(=r   c                 :    g | ]}|                                 |S r6   rU   )rX   ps     r   rZ   z/UploadAssetSpec._parse_tags.<locals>.<listcomp>0  s%    CCCACaCCCr   r\   )r`   r    r5   rV   
startswithrm   rn   rb   ro   ra   r   r   r   r   )
rd   re   itemsrg   r   arrnormr   rY   r   s
             r   _parse_tagszUploadAssetSpec._parse_tags  s    9Ia 	Aa 	 E E<IIOO%% <<$$ "jmm%c400 %!LL(=(=(=(=(====$% %   CCCCCDDDDE  I uu 	# 	#AFFLLNN((**E #d**E"""s   5AB??
CCc                 X   |t          |t                    r|pi S t          |t                    ry|                                }|si S 	 t	          j        |          }n%# t          $ r}t          d|           |d }~ww xY wt          |t                    st          d          |S i S )Nzuser_metadata must be JSON: z#user_metadata must be a JSON objectrk   )rd   re   r   rr   rs   s        r   rt   z$UploadAssetSpec._parse_metadata_json>  s     9
1d++97Na 
			A 	LA L L L !C!C!CDD!KLfd++ H !FGGGM	s   
A 
B)A<<BrF   c                     | j         st          d          | j         d         }|dvrt          d          |dk    r't          | j                   dk     rt          d          | S )Nz(at least one tag is required for uploadsr   >   inputmodelsoutputz/first tag must be one of: models, input, outputr      z7models uploads require a category tag as the second tag)r   rp   len)r   roots     r   _validate_orderzUploadAssetSpec._validate_orderP  s|    y 	IGHHHy|444NOOO849~~!! M   r   )r   r   r   r   r	   r   r
   r5   r   r    r4   rH   rl   rz   r   r   r   r{   r   rw   r   r   rt   r   r   r6   r   r   r   r      s          :H4HHHLeD111D$s)111uTc~VVVD#*VVV$)E$$?$?$?M4S>???uT***D#****!E$///IsTz///"U4000Jd
000_V(+++' ' [ ,+' _V(+++* * [ ,+*X __8444  [ 54  _'"""  #"  r   r   )rm   dataclassesr   typingr   r   app.assets.helpersr   pydanticr   r	   r
   r   r   r   ro   r   r$   r'   r8   ry   r   r   r   r   r   r   r6   r   r   <module>r      s    ! ! ! ! ! !         3 3 3 3 3 3                   )       9    + + + + + + + + 2 2 2 2 2i 2 2 2j    i   "       D# # # # #i # # #L! ! ! ! !I ! ! !$    i   .	 	 	 	 	 	 	 	m m m m mi m m m m mr   