+
    5)i&                         ^ RI Ht ^ RIHtHt ^ RIHt ^ RIHtH	t	H
t
Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ]! R4      t ! R R	4      tRR
 R lltRR R lltR R ltR# )    )Cache)current_appgwraps)AnyOptionalCallableUnionN)
get_loggercache_servicec                      a  ] tR t^t o RtRt]R 4       t]V 3R lR l4       t]RV 3R lR ll4       t	]RV 3R lR	 ll4       t
]V 3R
 lR l4       t]V 3R lR l4       t]V 3R lR l4       tRtV tR# )CacheServicez7Simple and robust caching service for Flask applicationNc                    \         P                  RVP                  P                  R4       24       RVP                  P                  RR4      RVP                  P                  RR4      RVP                  P                  RR4      /pVR,          R8X  d.   VP	                  R	VP                  P                  R	R
4      /4       VR,          R8X  d   VP	                  RVP                  P                  RR4      RVP                  P                  RR4      RVP                  P                  R^ 4      RVP                  P                  R4      /4       \        WR7      V n        \         P                  RVR,           24       R
#   \         dV   p\         P                  R\        T4       24       \        TRR/R7      T n        \         P                  R4        R
p?R
# R
p?ii ; i)z!Initialize caching with Flask appzCACHE_TYPE 
CACHE_TYPEsimpleCACHE_DEFAULT_TIMEOUTi,  CACHE_KEY_PREFIXqpgs_api
filesystem	CACHE_DIRNredisCACHE_REDIS_HOST	localhostCACHE_REDIS_PORTi  CACHE_REDIS_DBCACHE_REDIS_PASSWORD)configzCache initialized with type: zFailed to initialize cache: z&Falling back to simple in-memory cache)loggerdebugr   getupdater   cacheinfo	Exceptionerrorstrwarning)clsappcache_configes   &&  GD:\Projects\python\client-ideal-oms_pyapi\app\services\cache_service.pyinit_appCacheService.init_app   s   #	ELL;szz~~l'C&DEFcjjnn\8D'8OQT)U"CJJNN3Ez$RL L)\9###SZZ^^K%F L)W4##*CJJNN.- +CJJNN;Mt,T(#**..9I1*M.

?U0V	 c7CIKK7\8R7STU 	ELL7Ax@Ac<*BCCINNCDD		Es   F F G$A
GG$c                &   < V ^8  d   QhRS[ RS[ /# )   prefixreturnr'   )format__classdict__s   "r-   __annotate__CacheService.__annotate__<   s     ? ?3 ?C ?    c           	         RTRV'       d   \        VP                  4       4      M/ /p\        P                  ! VR\        R7      p\
        P                  ! VP                  4       4      P                  4       R,          pV RV 2#   \         dU   p\        P                  R\	        T4       24       T R\        \	        T4      \	        T4      ,           4       2u Rp?# Rp?ii ; i)	z-Generate consistent cache key from parametersargskwargsT)	sort_keysdefault:N   N:zError generating cache key: N)sorteditemsjsondumpsr'   hashlibmd5encode	hexdigestr%   r   r(   hash)r)   r2   r;   r<   key_data
key_stringkey_hashr,   s   &&*,    r-   get_cache_keyCacheService.get_cache_key;   s    	? F&0H HcJJ{{:#4#4#67AACCHHXQxj)) 	?NN9#a&BCXQtCIF$;<=>>	?s$   
B A8B C%A	C C% C%c                ,   < V ^8  d   QhRS[ RS[RS[/# )r1   keyr>   r3   )r'   r   )r5   r6   s   "r-   r7   r8   Q   s"      c C 3 r9   c           	          V P                   f   V# V P                   P                  V4      ;'       g    T#   \         d1   p\        P	                  RT R\        T4       24       Tu Rp?# Rp?ii ; i)z(Get value from cache with error handlingNzCache get error for key : )r#   r!   r%   r   r(   r'   )r)   rP   r>   r,   s   &&& r-   r!   CacheService.getP   sd    	yy 99==%000 	NN5cU"SVHEFN	s#   7 !7 7 A2%A-'A2-A2c                B   < V ^8  d   QhRS[ RS[RS[S[,          RS[/# )r1   rP   valuetimeoutr3   )r'   r   r	   intbool)r5   r6   s   "r-   r7   r8   \   s-      c #   r9   c           	          V P                   f   R# V P                   P                  WVR7      #   \         d0   p\        P	                  RT R\        T4       24        Rp?R# Rp?ii ; i)z&Set value in cache with error handlingNF)rV   zCache set error for key rR   )r#   setr%   r   r(   r'   )r)   rP   rU   rV   r,   s   &&&& r-   rZ   CacheService.set[   s\    	yy 99==W=== 	NN5cU"SVHEF	s   / / A)$A$$A)c                &   < V ^8  d   QhRS[ RS[/# )r1   rP   r3   )r'   rX   )r5   r6   s   "r-   r7   r8   g   s        r9   c           	          V P                   f   R# V P                   P                  V4      #   \         d0   p\        P	                  RT R\        T4       24        Rp?R# Rp?ii ; i)zDelete value from cacheNFzCache delete error for key rR   )r#   deleter%   r   r(   r'   )r)   rP   r,   s   && r-   r^   CacheService.deletef   sZ    	yy 99##C(( 	NN8RAxHI	s   - - A'$A""A'c                    < V ^8  d   QhRS[ /# r1   r3   )rX   )r5   r6   s   "r-   r7   r8   r   s      d r9   c                     V P                   f   R# V P                   P                  4       #   \         d-   p\        P	                  R\        T4       24        Rp?R# Rp?ii ; i)zClear all cacheNFzCache clear error: )r#   clearr%   r   r(   r'   )r)   r,   s   & r-   rc   CacheService.clearq   sP    	yy 99??$$ 	NN0Q9:	s   , , A#!AA#c                    < V ^8  d   QhRS[ /# ra   )dict)r5   r6   s   "r-   r7   r8   }   s     8 8$ 8r9   c           
     X    V P                   f   RRRR/# \        P                  P                  RR4      pRRRVR	\	        \        V P                   P                   4      4      /#   \         d;   p\        P                  R
\	        T4       24       RRR\	        T4      /u Rp?# Rp?ii ; i)zGet cache statisticsNstatusdisabledtypenoner   unknownactivebackendzError getting cache stats: r&   )	r#   r   r   r!   r'   rj   r%   r   r(   )r)   
cache_typer,   s   &  r-   	get_statsCacheService.get_stats|   s    	8yy  *ff==$++//iHJ(
3tCIIOO45 
  	8NN8QABgwA77	8s#   A$ AA$ $B)//B$B)$B) N)__name__
__module____qualname____firstlineno____doc__r#   classmethodr.   rM   r!   rZ   r^   rc   rp   __static_attributes____classdictcell__)r6   s   @r-   r   r      s     AE%E %EN ? ?(           8 8r9   r   c                R    V ^8  d   QhR\         R\        \        ,          R\        /# )r1   cache_key_prefixrV   	condition)r'   r	   rW   r
   )r5   s   "r-   r7   r7      s(     2 22$,SM2EM2r9   c                   a aa V VV3R lpV# )z
Decorator to cache function results

Args:
    cache_key_prefix: Prefix for cache key
    timeout: Cache timeout in seconds (None = use default)
    condition: Function to determine if result should be cached
c                 8   <a  \        S 4      VVV V3R  l4       pV# )c            	        < \         P                  f	   S! V / VB # S'       d   S! V / VB '       g	   S! V / VB # \         P                  ! S.V O5/ VB p\         P                  V4      pVe   \        P                  RV 24       V#  S! V / VB pVe/   \         P                  W$S	4       \        P                  RV 24       V#   \         d5   p\        P                  RSP                   R\        T4       24       h R p?ii ; i)NzCache hit for key: zCache set for key: z Error executing cached function rR   )r   r#   rM   r!   r   r    rZ   r%   r&   rt   r'   )
r;   r<   	cache_keycached_resultresultr,   r}   r~   funcrV   s
   *,    r-   wrapper0cached_query.<locals>.decorator.<locals>.wrapper   s    !!)T,V,,D!;F!;!;T,V,, %223CUdUfUI ),,Y7M(29+>?$$t.v. % $$Y@LL#6yk!BC 6t}}oRAxP 	s   ;C D/C>>Dr   )r   r   r}   r~   rV   s   f r-   	decoratorcached_query.<locals>.decorator   s!    	t 	 
 	D r9   rr   )r}   rV   r~   r   s   fff r-   cached_queryr      s    $L r9   c                F    V ^8  d   QhR\         R\        \        ,          /# )r1   r}   rV   )r'   r	   rW   )r5   s   "r-   r7   r7      s     ? ?S ?8C= ?r9   c                   a a V V3R lpV# )z2
Decorator specifically for caching API responses
c                 6   <a  \        S 4      VV V3R  l4       pV# )c            	      ^  < \         P                  f	   S
! V / VB # ^ RIHp R\	        VP
                  4      RVP                  '       d   VP                  4       MR /p\         P                  S	S
P                  V4      p\        P                  RV 24       \         P                  V4      p\        P                  RV 24       Ve   \        P                  RV 24       V#  S
! V / VB pRp\        VR4      '       d3   VP                  ^8H  p\        P                  R	VP                   24       M\        V\        \         34      '       d   R
p\        P                  R4       MQ\        V\"        4      '       d<   \%        V4      ^8  d,   V^,          ^8H  p\        P                  RV^,           24       V'       d/   \         P'                  WFS4       \        P                  RV 24       V#   \(         d5   p\        P+                  RS
P                   R\-        T4       24       h R p?ii ; i)N)requestr;   rC   zGenerated cache key: zCache response: zAPI cache hit for: Fstatus_codezFlask Response status: TzDirect data response receivedzTuple response status: zAPI response cached: zError in cached API function rR   )r   r#   flaskr   rf   r;   is_jsonget_jsonrM   rt   r   r    r!   hasattrr   
isinstancelisttuplelenrZ   r%   r&   r'   )r;   r<   r   request_paramsr   cached_responseresponseshould_cacher,   r}   r   rV   s   *,       r-   r   2cache_response.<locals>.decorator.<locals>.wrapper   s   !!)T,V,, & W\\*gooo((*4N
 %22 $--I LL0<= +..y9OLL+O+<=>*29+>?&&00  %8]33#+#7#73#>LLL#:8;O;O:P!QR4,77#'LLL#@B%00S]a5G#+A;##5LLL#:8A;-!HI   $$Y'BLL#8!DE <T]]O2cRSfXVWs   "CG- =/G- -H,8/H''H,r   )r   r   r}   rV   s   f r-   r   !cache_response.<locals>.decorator   s!    	t4	 
4	l r9   rr   )r}   rV   r   s   ff r-   cache_responser      s    
8t r9   c                $    V ^8  d   QhR\         /# )r1   patternr4   )r5   s   "r-   r7   r7     s      c r9   c           	          \         P                  f   R# \        P                  RV  24       \         P	                  4       #   \
         d0   p\        P                  RT  R\        T4       24        Rp?R# Rp?ii ; i)z(Invalidate cache keys matching a patternNFzInvalidating cache pattern: z!Error invalidating cache pattern rR   )r   r#   r   r$   rc   r%   r&   r'   )r   r,   s   & r-   invalidate_cache_patternr     sl    % 	27)<=!!## 8	CF8LMs   A +A A<$A77A<)NNrs   )flask_cachingr   r   r   r   	functoolsr   typingr   r	   r
   r   rE   rC   syspickleapp.utils.helpersr   r   r   r   r   r   rr   r9   r-   <module>r      sK        1 1   
  (	O	$}8 }8@2j?Dr9   