
    Bi                        d Z ddlZddlmZmZ ddlmZ dee         defdZdded	ee         defd
Z	dededee         defdZ
dedee         fdZdedee         fdZdedee         fdZdee         dee         fdZdS )uU   세션 및 연관 테이블은 User.user_id(문자, 최대 20자)를 사용합니다.    N)AnyOptional)Userrawreturnc                     | sdS t          |                                           }d|v r.|                    dd          d                                         }t          |          dk    r
|dd         n|S )uS   user_id@domain 형태면 @ 앞 로컬 파트만, 길이는 DB 제한(20)에 맞춤. @   r      N)strstripsplitlen)r   ss     K/var/www/html/web/mlink/mlink_AI_Server/mlink-backend/src/utils/user_ref.pynormalize_business_user_idr   	   so     rCA
axxGGCOOA$$&&VVb[[1SbS66a'    emailusernamec                    t          |           }|st          |pd          pd}|}d}t          j                            |                                          rw|dz  }t          |          }dt          |          z
  }|dk    r
|d|         nd|z   }|dd         }t          j                            |                                          w|S )uK   이메일 로컬 파트 기준 user_id 할당. 중복 시 숫자 접미사.userr   user_idr   r   Nr	   )r   r   query	filter_byfirstr   r   )r   r   baseuidnsuffixmax_bases          r   "allocate_unique_user_id_from_emailr#      s    %e,,D H)(*<f==G
C	A
*

s

+
+
1
1
3
3 	QQF#"*Q,,tIXIB&@#2#h *

s

+
+
1
1
3
3  Jr   providerprovider_user_idc                 ^   ddl }|rt          |d          S |                    |  d|                                                                           dd         }| pddd         }| | }t          |          dk    r
|dd         }d}|}t          j                            |          	                                rk|dz  }t          |          }	|ddt          |	          z
           |	z   dd         }t          j                            |          	                                k|S )	uK   OAuth: 이메일 있으면 로컬 파트 우선, 없으면 provider+해시.r   N:   or   r   r   )hashlibr#   sha256encode	hexdigestr   r   r   r   r   r   )
r$   r%   r   r*   hprefixr   r    origr!   s
             r   allocate_unique_user_id_oauthr1   #   s=   NNN ?1%>>>(77%577>>@@AAKKMMcrcRAo#rr"F.Q..C
3xx"}}#2#h	AD
*

s

+
+
1
1
3
3 7	QQ&b3v;;&&'&0#2#6 *

s

+
+
1
1
3
3 7 Jr   session_valc                    | dS t          | t                    rt          j                            |           S t          |                                           }|sdS |                                r0t          j                            t          |                    }|r|S t          j                            |          	                                S )u`   Flask 세션의 user_id: 신규는 User.user_id 문자열, 구버전은 정수 PK일 수 있음.Nr   

isinstanceintr   r   getr   r   isdigitr   r   )r2   r   us      r   get_user_by_session_valuer:   7   s    t+s## +z~~k***K  A tyy{{ JNN3q66"" 	H:**00222r   refc                    | dS t          | t                    rt          j                            |           S t          |                                           }|sdS |                                r0t          j                            t          |                    }|r|S t          j                            |          	                                S )u@   API의 author_id 등: 정수 PK 또는 업무 user_id 문자열.Nr   r4   )r;   r   r9   s      r   resolve_user_refr=   G   s    
{t#s #z~~c"""CA tyy{{ JNN3q66"" 	H:**00222r   business_idc                     | d S t          |                                           }|sd S t          j                            |                                          S )Nr   )r   r   r   r   r   r   )r>   r   s     r   get_user_by_business_idr@   W   sX    tK  A t:**00222r   order_idc                    | r|                      d          sdS |                      d          r| t          d          d         }n.|                      d          rdS | t          d          d         }t          j        d|          }|r|                    d          S |                    d          }|dk    rdS |d|         S )	u   
    order_id 예:
    - mlink_<userId>_<8hex>_<amount>_<cycle>_<ts>
    - mlink_usage_<userId>_<8hex>_...
    userId에 '_'가 포함되면 파싱 실패할 수 있음(가정: 업무 user_id는 '_' 미포함).
    mlink_Nmlink_usage_mlink_renew_z^(.+?)_([0-9a-fA-F]{8})_r   _r   )
startswithr   rematchgroupfind)rA   restmidxs       r   parse_mlink_order_user_idrO   `   s      8..x88 t>** )N++--.			^	,	, )tH(
,d33A wwqzz
))C..C
axxt:r   )N)__doc__rH   typingr   r   src.models.userr   r   r   r#   r1   r:   r=   r@   rO    r   r   <module>rT      ss   [ [ 				                            (HSM (c ( ( ( ( c Xc] VY     C 3 xX[} ad    (33 38D> 3 3 3 3 3# 3(4. 3 3 3 3 3 3$ 3 3 3 3 (3-      r   