
h}                 @   s  d  d l  m Z d  d l m Z m Z m Z d  d l Z d  d l Z d  d l Z e j	 d d  Z
 e j	 d d  Z e j	 d d	  Z e j	 d
 d  Z e j j e j j e  d  Z e e  Z d d   Z d d   Z e   d d   Z d d   Z d d   Z d d   Z e j d d d g d d    Z e j d d d g e j d d d g e j d  d d g e j d! d d g d" d#       Z e j d$ d d g e j d% d d g d& d'     Z e d( k re j d) d* d+ e  e j	 d, d-    d S).    )print_function)FlaskrequestjsonifyNAQARA_DOMAINz'https://open-kr.aqara.com/v3.0/open/apiAQARA_APP_IDZ13947123405048053765eeb5AQARA_KEY_IDzK.1394712340626440194AQARA_APP_KEYZ fk8o1bjhq60s1kgy9kicqmkgivuus4yiz	tokens.dbc               C   s   t  t j    S)N)inttime r   r   /mod/web/acousticsspace/app.pynow_ts   s    r   c           
      s   t  j t       j d    f d d   }  |  d d  |  d d  |  d d  |  d d  |  d	 d  |  d
 d  |  d d  Wd QRXd S)uR   
    기본 테이블 생성 + '마지막 변경 기기' 메타 컬럼 보강
    z
            CREATE TABLE IF NOT EXISTS user_tokens (
                user TEXT PRIMARY KEY,
                authtoken TEXT,
                refreshtoken TEXT,
                updated_at INTEGER
            )
        c                sW     j  d  } d d   | j   D } |  | k rS d j |  |  }   j  |  d  S)NzPRAGMA table_info(user_tokens)c             S   s   g  |  ] } | d   q S)   r   ).0rr   r   r   
<listcomp>'   s   	 z/init_db.<locals>.ensure_col.<locals>.<listcomp>z(ALTER TABLE user_tokens ADD COLUMN {} {})executeZfetchallformat)colZtype_curZcolsZsql)connr   r   
ensure_col%   s
    zinit_db.<locals>.ensure_colZlast_updater_device_idZTEXTZlast_updater_modelZlast_updater_platformZlast_updater_os_versionZlast_updater_app_versionZlast_updater_server_hostZlast_updater_ipN)sqlite3connectDB_PATHr   )r   r   )r   r   init_db   s    r   c             C   sl   t  j t  V } | j d | | t   |  f  } | j d k ra | j d |  | | t   f  Wd QRXd S)u   단일 슬롯 upsertzMUPDATE user_tokens SET authtoken=?, refreshtoken=?, updated_at=? WHERE user=?r   zSINSERT INTO user_tokens(user, authtoken, refreshtoken, updated_at) VALUES (?,?,?,?)N)r   r   r   r   r   Zrowcount)user	authtokenrefreshtokenr   r   r   r   r   upsert_tokens6   s    r    c             C   sv   t  j t  ` } | j d |  f  } | j   } | s= d  Sd | d d | d d t | d pd d  i SWd  QRXd  S)NzHSELECT authtoken, refreshtoken, updated_at FROM user_tokens WHERE user=?r   r   r   r   Z
updated_at   )r   r   r   r   fetchoner
   )r   r   r   rowr   r   r   get_tokens_rowC   s    r$   c       	      C   sK   t  j t  5 } | j d | p$ d  | | | | | | |  f  Wd  QRXd  S)NaU  
            UPDATE user_tokens SET
              last_updater_device_id=?,
              last_updater_model=?,
              last_updater_platform=?,
              last_updater_os_version=?,
              last_updater_app_version=?,
              last_updater_server_host=?,
              last_updater_ip=?
            WHERE user=?
        )r   r   r   r   )	r   	device_iddevice_modeldevice_platform
os_versionapp_versionserver_hostZip_addrr   r   r   r   update_last_updater_metaN   s    
r+   c             C   s   t  j t  J } y% | j d |  f  } | j   } Wn t  j k
 rT d  } Yn XWd  QRX| s d d  d d  d d  d d  d d  d d  d d  i Sd | d	 d | d
 d | d d | d d | d d | d d | d i S)Na   
                SELECT last_updater_device_id, last_updater_model, last_updater_platform,
                       last_updater_os_version, last_updater_app_version,
                       last_updater_server_host, last_updater_ip
                FROM user_tokens WHERE user=?
            r%   modelplatformr(   r)   r*   ipr   r   r!               )r   r   r   r   r"   ZOperationalError)r   r   r   r#   r   r   r   read_last_updater_meta^   s    r3   /methodsZGETc               C   s   d S)Nztokens service aliver   r   r   r   r   indexy   s    r6   z	/setToeknz	/setTokenz/tokens/setToeknz/tokens/setTokenc        
      C   s  t  j j d  p d j   }  t  j j d  } t  j j d  } t  j j d  pW d j   } t  j j d  } t  j j d  } t  j j d  } t  j j d	  } t  j j d
  } t  j j d t  j  }	 |  s t d d d d i  d f S| d k s| d k r(t d d d d i  d f St |  | |  t |  | | | | | | |	  t d d d |  d | d | d d | pd d | d | d | d	 | d
 | d |	 i i  S)u   
    필수: user, authtoken, refreshtoken
    선택(권장): device_id, device_model, device_platform, os_version, app_version, server_host
    동작: 토큰 upsert + '마지막 변경 기기' 메타 갱신
    r    r   r   r%   r&   r'   r(   r)   r*   zX-Forwarded-ForokFerrorzuser requiredi  Nz#authtoken and refreshtoken requiredTlast_updaterr,   r-   r.   )	r   argsgetstripZheadersZremote_addrr   r    r+   )
r   r   r   r%   r&   r'   r(   r)   r*   Zlast_ipr   r   r   
set_tokens~   s<    
r>   z	/getTokenz/tokens/getTokenc              C   s   t  j j d  p d j   }  |  s@ t d d d d i  d f St |   } | sn t d d d d i  d	 f S| d
 | d } } t |   } t d d d |  d
 | d | d | i  S)u   
    입력: user (필수)
    출력: ok, authtoken, refreshtoken, last_updater{...}
    주의: 자동 갱신 없음 — DB에 저장된 값 그대로 반환
    r   r7   r8   Fr9   zuser requiredi  z	not foundi  r   r   Tr:   )r   r;   r<   r=   r   r$   r3   )r   r#   ZatZrtr:   r   r   r   	get_token   s    r?   __main__hostz0.0.0.0ZportZPORTZ9022)!Z
__future__r   Zflaskr   r   r   r   osr   getenvr   r   r   r	   pathjoindirname__file__r   __name__appr   r   r    r$   r+   r3   Zrouter6   r>   r?   runr
   r   r   r   r   <module>   s0   $!$-0'