+
    5)i1                         ^ RI t ^ RIt^ RIt^ RIHtHt ^ RIHtHtHtH	t	 ^ RI
HtHt ^ RIt^ RIHt ^ RIHt ^ RIHtHtHtHt R tRR	 ltR
 tR tRR ltR t]R R l4       tRR ltR tRR lt R t!R# )    N)RotatingFileHandlerTimedRotatingFileHandler)datetimedatetimezonetime)requestgwraps)contextmanager)DictOptionalAnyUnionc           	     x   V P                   P                  R4      p\        P                  P	                  V4      '       g   \        P
                  ! VRR7       \        P                  ! 4       pVP                  \        \        V P                   P                  RR4      4      4       VP                  R,           F  pVP                  V4       K  	  \        P                  P                  VR\        P                  ! 4       P                  R4       R	24      p\!        VR
^V P                   P                  R^4      RRR7      p\        P"                  ! RRR7      pVP%                  V4       VP'                  V4       \        P                  ! R4      pVP                  \        P(                  4       VP'                  V4       V P                   P                  RR4      '       d8   \        P*                  ! 4       pVP%                  V4       VP'                  V4       V P,                  P/                  RV 24       R# )z=Setup application logging with rotation and proper formattingLOG_DIRT)exist_ok	LOG_LEVELINFO:NNNz
flask-api-z%Y-%m-%dz.logmidnightLOG_BACKUP_COUNTzutf-8F)whenintervalbackupCountencodingutcz1[%(asctime)s] %(name)s.%(levelname)s: %(message)sz%Y-%m-%d %H:%M:%S)fmtdatefmtpypandocDEBUGz)Flask API logging initialized. Log file: N)configgetospathexistsmakedirslogging	getLoggersetLevelgetattrhandlersremoveHandlerjoinr   nowstrftimer   	FormattersetFormatter
addHandlerr!   StreamHandlerloggerinfo)	applog_dirroot_loggerhandlerlog_filefile_handler	formatterpypandoc_loggerconsole_handlers	   &        >D:\Projects\python\client-ideal-oms_pyapi\app\utils\helpers.pysetup_loggerrA      s    jjnnY'G77>>'""
Gd+ ##%K#**..f*MNO ''**!!'* + ww||Gz(,,.2I2I*2U1VVZ%[\H+JJNN#5r:L !!?#I i( <( ''
3OW]]+|, zz~~gu%%!//1$$Y//JJOO?zJK    c                B    \         P                  ! T ;'       g    R4      # )z(Get a logger instance with optional namez	flask-api)r(   r)   )names   &r@   
get_loggerrE   >   s    T00[11rB   c                    \        R4      p \        P                  P                  R\        P                  4      pR\        P
                  R\        P                  RVR\        P                  P                  RR4      R	\        P                  /p\        P                  '       dq   \        P                  ! R
R7      '       dT   \        P                  ! 4       pVP                  4        UUu/ uF  w  rEVP                  4       R9  g   K  WEbK   	  pppWbR&   V P                  R\        P                  ! V4       24       R# u uppi )z Log incoming request informationr	   HTTP_X_FORWARDED_FORmethodr%   	client_ip
user_agent
User-AgentUnknowncontent_typeT)silentrequest_bodyzIncoming request: N)passwordtokensecret)rE   r	   environr#   remote_addrrH   r%   headersrM   is_jsonget_jsonitemslowerr6   jsondumps)r5   rI   log_databodykv	safe_bodys          r@   log_request_infora   B   s    	"F##$:G<O<OPI 	'..Ygoo)),	B,,H 7++488!&*jjlgldaaggiGf6fTQTl	g#, 
KK$TZZ%9$:;< hs   )D>D>c                    \        R4      pRV P                  RV P                  RV P                  /pVP	                  R\
        P                  ! V4       24       V # )zLog response informationresponsestatus_codecontent_lengthrM   zResponse sent: )rE   rd   re   rM   r6   rZ   r[   )rc   r5   r\   s   &  r@   log_response_inforf   X   sZ    
#F 	x++(11--H KK/$**X"6!789OrB   c                    \        R4      pV f   Rp VP                  R\        P                  ! 4        2V R\	        \
        RR4      R\	        \
        R	R4      R
\	        \
        RR4      /R7       R# )z!Log exception with full tracebackerrorNTzException occurred: request_pathr%   N/Arequest_methodrH   rI   rT   )exc_infoextra)rE   rh   	traceback
format_excr+   r	   )rl   r5   s   & r@   log_exceptionrp   e   sn     F
LL
y33567GGVU;ggx?-?
  rB   c                0   a  \        S 4      V 3R l4       pV# )z%Decorator to log function performancec                    < \        R 4      p\        P                  ! 4       p S! V / VB p\        P                  ! 4       pWS,
          P                  4       pVP	                  RSP
                   RVR R24       V#   \         d`   p\        P                  ! 4       pYS,
          P                  4       pTP                  RSP
                   RTR R\        T4       24       h Rp?ii ; i)performancez	Function z executed in .4f secondsz failed after z
 seconds: N)	rE   r   r/   total_secondsr6   __name__	Exceptionrh   str)	argskwargsr5   
start_timeresultend_timedurationefuncs	   *,      r@   wrapper performance_log.<locals>.wrapperx   s    M*\\^
	4*6*F||~H -<<>HKK)DMM?-~XVWM 	||~H -<<>HLL9T]]O>(3zZ]^_Z`Yabc		s   AA; ;C%AC  C%r   )r   r   s   f r@   performance_logr   v   s     
4[ $ NrB   c                $    V ^8  d   QhR\         /# )   rD   )ry   )formats   "r@   __annotate__r      s     	J 	Jc 	JrB   c           	   #  r  "   \        R4      p\        P                  ! 4       p Rx  \        P                  ! 4       pW2,
          P                  4       pVP	                  RV  RVR R24       R#   \        P                  ! 4       pY2,
          P                  4       pTP	                  RT  RTR R24       i ; i5i)z2Context manager to log performance of a code blockrs   NzBlock 'z' executed in rt   ru   )rE   r   r/   rv   r6   )rD   r5   r|   r~   r   s   &    r@   measure_performancer      s      &FJJ<<>)88:gdV>(3xHI <<>)88:gdV>(3xHIs   !B7A. AB7.AB44B7c                   \        R4      pR\        P                  ! 4       P                  4       RT RT;'       g    \	        \
        RR4      R\	        \        RR4      R	\        '       d!   \        P                  P                  R
R4      MRRT;'       g    / /pVP                  R\        P                  ! V4       24       R# )zLog audit events for complianceaudit	timestampactionuser_id	anonymousrI   rT   rj   rJ   rK   rL   detailszAUDIT: N)rE   r   utcnow	isoformatr+   r
   r	   rU   r#   r6   rZ   r[   )r   r   r   r5   
audit_datas   &&&  r@   	audit_logr      s     F 	X__&002&7@@gaK@WWmU;gggoo)),	BSX7==bJ KK'$**Z0123rB   c                 p    ^ RI p  VP                  V ,          #   \         d    \        RT  R24      hi ; i)r   NzSet the z environment variable)r$   rS   KeyErrorrx   )var_namer$   s   & r@   get_env_variabler      sC    ;Dzz(## D(8*,ABCCDs    5c                $    RVR8  d   RMRRV RV/# )z.Format the response to be returned by the API.statusi  successrh   datard    )r   rd   s   &&r@   format_responser      s&     	{S0)g{ rB   c                    V Uu. uF  q"V 9  g   K  VNK  	  ppV'       d   \        RRP                  V4       24      hR# u upi )z7Validate incoming request data against required fields.zMissing fields: z, N)
ValueErrorr.   )request_datarequired_fieldsfieldmissing_fieldss   &&  r@   validate_request_datar      sH    )8V<UeeNV+DIIn,E+FGHH  Ws
   AA)N)NN)   )"r$   r(   rZ   logging.handlersr   r   r   r   r   r   flaskr	   r
   rn   	functoolsr   
contextlibr   typingr   r   r   r   rA   rE   ra   rf   rp   r   r   r   r   r   r   r   rB   r@   <module>r      su    	   J 3 3    % - -0Ld2=,". 	J 	J4DIrB   