
    kUOi.                         d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZ eddd      dedefd       Zy)    )shared_task)Session)SessionLocal)DeliveryNotificationCustomer)TelegramAdapter)	VKAdapter)EmailAdapter)TemplateRenderer)RateLimiter)get_settingsNTz&app.workers.deliveries.deliver_message   )bindnamemax_retriesdelivery_idreturnc           	      	   t               }	 |j                  t              j                  t        j                  |k(        j                         }|sd| d|j                          S |j                  t              j                  t        j                  |j                  k(        j                         }|s4d|_	        d|_
        |j                          d| d|j                          S t               }|j                  |j                  j                  |j                         }t#               t%               t'               d}|j)                  |j*                        }|sAd|_	        d|j*                   |_
        |j                          d| d|j                          S t-               }	t/               }
d	|j0                   d
|j*                   }|
j3                  |d      }|s4t5        dt7        d|	j8                  z              }| j;                  |      t=        j>                  |jA                  |jB                  ||j0                              }|xjD                  dz  c_"        |jF                  rad|_	        |jH                  jK                         |_&        |jN                  xs i |_'        |j                          d| d|j                          S |jP                  xs djS                         }d|v sd|v r>tU        dd|jD                  dz   z        }|j                          | j;                  |      d|_	        |jP                  |_
        |j                          |jD                  dk  r| j;                  d|jD                  z        ddl+m,}  ||j0                  |j                  |j*                  d|jP                   ||jB                  d      }|j[                  |       |j                          d| d|j                          S # t\        $ r}|j                  t              j                  t        j                  |k(        j                         }|r<|xjD                  dz  c_"        d|_	        t_        |      |_
        |j                          | j;                  |d|r|jD                  z        dz        d}~ww xY w# |j                          w xY w) a  
    Deliver a single message via appropriate channel adapter
    
    Args:
        delivery_id: Delivery record ID
    
    Retry policy: exponential backoff, max 3 attempts
    On failure: updates delivery.status and last_error, moves to DLQ if exhausted
    z	delivery:z
:not_foundfailedzNotification not foundz:no_notification)telegramvkemailzUnknown channel: z:unknown_channelztenant::   )tokens)	countdown)	tenant_idsentz:success z
rate limitztoo many requests<      r      r   )DLQzMax retries exceeded: )r   target)r   notification_idchannelreasonpayloadz
:exhausted)excr   N)0r   queryr   filteridfirstcloser   r&   status
last_errorcommitr   rendertemplatecontentr)   r	   r
   r   getr'   r   r   r   check_and_consumemaxintRATE_LIMIT_REFILL_RATE_PER_SECretryasynciorunsendr%   attemptssuccessfuncnowsent_atresponse_metaerrorlowerminapp.db.modelsr$   add	Exceptionstr)selfr   dbdeliverynotificationrendererr5   adaptersadaptersettingslimiterrate_keyallowedbackoff_secondsresult
error_textbackoffr$   	dlq_entryes                       0/var/www/notifications/app/workers/deliveries.pydeliver_messager^      s$    .B_88H%,,X[[K-GHNNP{m:6x 	
s xx-44\__H`H`5`aggi&HO":HIIK{m+;<h 	
c $%//,"7"7"?"?AUAUV ()+!^
 ,,x//0&HO$5h6F6F5G"HHIIK{m+;<B 	
}  >-\334Ah6F6F5GH++HQ+? "!SX-T-T)T%UVO***77 W\\(//7lNdNd\efQ>>$HO!ww{{}H%+%9%9%?RH"IIK{m84T 	
O !,,,"335Jz)-@J-Nb!x'8'81'<"=>		jj7j33&HO"(,,HIIK   1$jj10A0A+AjBB .*44$0OO$,,3FLL>B,78??S	 y!		";-z: 	
  W88H%,,X[[K-GHNNP"&HO"%a&HIIKjjQ!X0A0A*UjVVST*UjVVW 	
sA   A
P 'A2P *B%P  D%P D+P 	SB,SSS S!)celeryr   sqlalchemy.ormr   app.db.sessionr   rH   r   r   r   app.channels.telegramr	   app.channels.vkr
   app.channels.emailr   app.services.template_rendererr   app.services.rate_limiterr   app.core.configr   r<   r9   rK   r^        r]   <module>rj      s[     " ' : : 1 % + ; 1 (  $ESTUks ks k Vkri   