o
    }i&                     @   s\  d dl mZmZmZmZ d dlmZmZmZ d dl	m
Z
 d dlZd dlZd dlZedddZedd	Zeed
dZeeddZeddZdZdZdZdZdZejeeeeddZdedeeef fddZdedeeef fddZdd Zdd Z dedeeef fd d!Z!dee fd"d#Z"e#d$d%d& Z$e#d'ed(d)d*d+ed d d,dded-fd.ed/ed0ee d1ee d2e%f
d3d4Z&e#d5defd6d7Z'e#d8defd9d:Z(e#d;ed<d=d>ed?d)d@d+fdAed.efdBdCZ)e#dDedEd)dFed?d)d@d+ed-fdGed.ed2e%fdHdIZ*e#dJedKd)d@d+fdLefdMdNZ+dS )O    )OptionalListDictAny)FastAPIHTTPExceptionQuery)JSONResponseNzTradingView US Market Redis APIz1.0.0)titleversion
REDIS_HOSTz	127.0.0.1
REDIS_PORT6379REDIS_DB0REDIS_PASSWORDztv:us:symbols:setztv:us:symbol:ztv:us:price:ztv:us:stream:rawztv:us:statusT)hostportdbpassworddecode_responses	tv_symbolreturnc                 C      t t |  S N)rhgetallKEY_SYMBOL_META_PREFIXr    r   (/var/www/api/tv-market-system/api/api.pyget_symbol_meta%      r!   c                 C   r   r   )r   r   KEY_PRICE_PREFIXr   r   r   r    get_symbol_price(   r"   r$   c                 C   s6   z| d u s	| dkrW d S t | W S  ty   Y d S w N )float	Exceptionvr   r   r    parse_float+   s   
r+   c                 C   s:   z| d u s	| dkrW d S t t| W S  ty   Y d S w r%   )intr'   r(   r)   r   r   r    	parse_int3   s   r-   c                 C   s>  t | }|si S t| }i d| d|dd|dd|dd|dd|dd|dd|dd	|d	d
|d
dt|ddt|dd|dd|dd|ddt|dt|dt|dt|dt|dt|d|d|dt|dd	S )Nr   tickerdescriptionexchangecountrycurrencysectorindustrytypesubtypemarket_cap_basicscanner_closecloselogoidlogo_url
logo_localprice
last_pricechangechange_percentregular_changeregular_change_percentvolumesessionstatusts)	r>   r?   r@   rA   rB   rC   rD   rE   rF   )r!   r$   getr+   )r   metar=   r   r   r    merge_symbol_and_price;   s^   







	




rI   c                   C   s   t tttS r   )sortedlistr   smembersKEY_SYMBOLS_SETr   r   r   r    list_all_symbols_   r"   rN   z/healthc               
   C   sP   zt  } t t}t| d|dW S  ty' } z	tdd| dd }~ww )N	connected)okredisrE     zRedis error: status_codedetail)r   pingr   
KEY_STATUSboolr(   r   )pongrE   er   r   r    healthf   s   
r[   z/symbolsd      i  )gele)r^   Flimitoffsetr0   r3   
with_pricec                 C   s   t  }g }|D ]V}t|}|sq|r |dpd | kr q|r0|dp(d | kr0q|r:|t| q|||d|d|d|d|d|d|dd	 qt|}	||||   }
|	|| t|
|
d
S )Nr0   r&   r3   r.   r/   r4   r;   r<   r   r.   r/   r0   r3   r4   r;   r<   )totalra   r`   countresults)rN   r!   rG   upperlowerappendrI   len)r`   ra   r0   r3   rb   all_symbolsrowsr   rH   rd   pagedr   r   r    symbolss   s<   
rn   z/symbol/{tv_symbol:path}c                 C   s   t | }|stddd|S )N  zSymbol not foundrS   )rI   r   )r   datar   r   r    symbol_detail   s   rq   z/price/{tv_symbol:path}c                 C   s   t | }|stddd| t|dt|dt|dt|dt|dt|d	|d
|d|d|d|dt|ddS )Nro   zPrice not found for symbolrS   r>   r?   r@   rA   rB   rC   r2   r0   r/   rD   rE   rF   )r   r>   r?   r@   rA   rB   rC   r2   r0   r/   rD   rE   rF   )r$   r   r+   rG   )r   r=   r   r   r    price_detail   s"   rr   z/top-moversgainersz^(gainers|losers)$)pattern2   rR   	directionc           	      C   s  t  }g }|D ]]}t|}t|}|r|sqt|d}t|d}|d u s,|d u r-q|||d|d|d|d|d|d|d	|t|d
|t|dt|dd q|jdd | dkd | dkr||jdd d | t|t||d | dS )Nr@   r>   r.   r/   r0   r3   r4   r;   r<   r?   rC   rF   )r   r.   r/   r0   r3   r4   r;   r<   r>   r?   r@   rC   rF   c                 S      | d d ur
| d S dS )Nr@   ir   xr   r   r    <lambda>       ztop_movers.<locals>.<lambda>rs   )keyreverselosersc                 S   rw   )Nr@   i?B r   rx   r   r   r    rz      r{   )r|   )rv   re   rf   )	rN   r!   r$   r+   rG   ri   sortminrj   )	rv   r`   rk   rl   r   rH   r=   chg_pctr>   r   r   r    
top_movers   sB   

r   z/search.)
min_lengthqc           	      C   s   |    }t }g }|D ]c}t|}|sqd||dd|dd|dd|dd|ddg  }||v rh|rE|t| n#|||d|d|d|d|d|d|d	d
 t||krp nq| t||dS )N r.   r&   r/   r0   r3   r4   r;   r<   rc   )queryre   rf   )	rh   striprN   r!   joinrG   ri   rI   rj   )	r   r`   rb   q_lowerrk   rf   r   rH   haystackr   r   r    search   sJ   




	r   z/stream/latest   re   c              
   C   s   zdt jt| d}g }|D ]P\}}t|}||d< t|d|d< t|d|d< t|d|d< t|d|d< t|d|d< t|d|d< t|d	|d	< || qt||d
W S  tyx } zt	dt
|dd }~ww )N)re   	stream_idr>   r?   r@   rA   rB   rC   rF   )re   rf   rR   rS   )r   	xrevrangeKEY_STREAM_RAWdictr+   rG   ri   rj   r(   r   str)re   itemsrf   r   fieldsitemrZ   r   r   r    stream_latest  s*   r   ),typingr   r   r   r   fastapir   r   r   fastapi.responsesr	   rQ   osjsonappgetenvr   r,   r   r   r   rM   r   r#   r   rW   Redisr   r   r!   r$   r+   r-   rI   rN   rG   r[   rX   rn   rq   rr   r   r   r   r   r   r   r    <module>   s    $

.
/
/"