
    Bi@                        U d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ erddlmZmZ  ej        e          Zdaded	<   ddZddZddZddZ	 	 dd dZdS )!uk   원장 DB(DATABASE_URL) 커밋 후 credit_balances / credit_transactions 를 DATABASE_LOCAL_URL 로 복제.    )annotationsN)TYPE_CHECKINGOptional)create_enginetext)Engine)CreditBalanceCreditTransactionOptional[Engine]_enginereturnboolc                     t          j        dd                                          sdS t          j        dd                                                                          dv S )NDATABASE_LOCAL_URL FCREDIT_MIRROR_ENABLED0)1trueyes)osgetenvstriplower     P/var/www/html/web/mlink/mlink_AI_Server/mlink-backend/src/utils/credit_mirror.py_mirror_enabledr      sY    9)2..4466 u9,c2288::@@BBFZZZr   c                     t                      sd S t          9t          j        dd                                          } t          | dd          at          S )Nr   r   Ti  )pool_pre_pingpool_recycle)r   r   r   r   r   r   )urls    r   _get_enginer#      sQ     ti,b1177994dKKKNr   balance'CreditBalance'Nonec                x   t                      }|r| dS 	 |                                5 }|                    t          d          | j        t          | j        pd          t          | j        pd          t          | j        pd          t          | j	        pd          t          | j
        pd          t          | j        pd          | j        | j        d	           ddd           dS # 1 swxY w Y   dS # t          $ r6}t                              dt#          | dd          |           Y d}~dS d}~ww xY w)u3   credit_balances 단일 행 upsert (user_id 기준).Nad  
                    INSERT INTO credit_balances (
                        user_id, total_credit, free_credit, event_credit,
                        daily_renewal_credit, subscription_credit, add_on_credit,
                        last_daily_renewal, updated_at
                    ) VALUES (
                        :user_id, :total_credit, :free_credit, :event_credit,
                        :daily_renewal_credit, :subscription_credit, :add_on_credit,
                        :last_daily_renewal, :updated_at
                    )
                    ON DUPLICATE KEY UPDATE
                        total_credit = VALUES(total_credit),
                        free_credit = VALUES(free_credit),
                        event_credit = VALUES(event_credit),
                        daily_renewal_credit = VALUES(daily_renewal_credit),
                        subscription_credit = VALUES(subscription_credit),
                        add_on_credit = VALUES(add_on_credit),
                        last_daily_renewal = VALUES(last_daily_renewal),
                        updated_at = VALUES(updated_at)
                    r   )	user_idtotal_creditfree_creditevent_creditdaily_renewal_creditsubscription_creditadd_on_creditlast_daily_renewal
updated_atu+   credit_mirror balance 실패 user_id=%s: %sr(   )r#   beginexecuter   r(   intr)   r*   r+   r,   r-   r.   r/   r0   	Exceptionloggerwarninggetattr)r$   engconnes       r   mirror_credit_balance_rowr;   $   s   
--C '/&lYY[[ #	DLL .  '$'(<(A$B$B#&w':'?a#@#@$'(<(A$B$B,/0L0QPQ,R,R+.w/J/Oa+P+P%()>)C!%D%D*1*D")"4
 
/" " "#	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	H  l l lDggW`bfFgFgijkkkkkkkkkls;   C9 B5C,C9 ,C00C9 3C04C9 9
D9+D44D9txn'CreditTransaction'c                *   t                      }|r	| | j        dS 	 | j        r| j        j        nd}|                                5 }|                    t          d          | j        | j        |t          | j	                  t          | j
                  | j        | j        | j        | j        | j        | j        d           ddd           dS # 1 swxY w Y   dS # t"          $ r,}t$                              d| j        |           Y d}~dS d}~ww xY w)uS   credit_transactions 단일 행 upsert (id 기준으로 원장과 동일 PK 유지).Na  
                    INSERT INTO credit_transactions (
                        id, user_id, credit_type, amount, balance_after,
                        description, reference_id, reference_type, meta_data,
                        created_at, event_expiry_date
                    ) VALUES (
                        :id, :user_id, :credit_type, :amount, :balance_after,
                        :description, :reference_id, :reference_type, :meta_data,
                        :created_at, :event_expiry_date
                    )
                    ON DUPLICATE KEY UPDATE
                        user_id = VALUES(user_id),
                        credit_type = VALUES(credit_type),
                        amount = VALUES(amount),
                        balance_after = VALUES(balance_after),
                        description = VALUES(description),
                        reference_id = VALUES(reference_id),
                        reference_type = VALUES(reference_type),
                        meta_data = VALUES(meta_data),
                        created_at = VALUES(created_at),
                        event_expiry_date = VALUES(event_expiry_date)
                    )idr(   credit_typeamountbalance_afterdescriptionreference_idreference_type	meta_data
created_atevent_expiry_dateu*   credit_mirror transaction id=%s 실패: %s)r#   r?   r@   valuer1   r2   r   r(   r3   rA   rB   rC   rD   rE   rF   rG   rH   r4   r5   r6   )r<   r8   ctr9   r:   s        r   mirror_credit_transaction_rowrK   R   sy   
--C #++P&)o?S_""4YY[[ '	DLL 2 &"{#%!#*oo%():%;%;#&?$'$4&)&8!$"%.),)> 3& & &'	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	P  P P PCSVQOOOOOOOOOPs<   )C A<CC CC CC 
D&!DDr(   strOptional['CreditBalance']transactionsOptional[list]c                    t                      sdS ddlm} |}|-|j                            |                                           }|t          |           |r|D ]}|t          |           dS dS )uM   커밋 직후 호출: 잔액 + (선택) 거래 행들을 로컬 DB에 반영.Nr   )r	   )r(   )r   src.models.creditr	   query	filter_byfirstr;   rK   )r(   r$   rN   r	   bts         r   mirror_balance_and_transactionsrW      s      //////Ay))')::@@BB}!!$$$ 1 	1 	1A}-a0001 1	1 	1r   )r   r   )r   r   )r$   r%   r   r&   )r<   r=   r   r&   )NN)r(   rL   r$   rM   rN   rO   r   r&   )__doc__
__future__r   loggingr   typingr   r   
sqlalchemyr   r   sqlalchemy.enginer   rQ   r	   r
   	getLogger__name__r5   r   __annotations__r   r#   r;   rK   rW   r   r   r   <module>ra      sA   q q q " " " " " "  				 * * * * * * * * * * * * * * * * $ $ $ $ $ $ CBBBBBBBB		8	$	$         [ [ [ [   +l +l +l +l\0P 0P 0P 0Pj *.#'1 1 1 1 1 1 1r   