o
    oj!                     @  s   d Z ddlmZ ddlmZ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mZmZmZmZ dd	lmZmZ G d
d dZdS )zADatabase boundary for messaging state and concurrency guarantees.    )annotations)datetime	timedelta)funcor_select)IntegrityError)get_control_plane_session   )MessagingDeliveryMessagingDeliveryAttemptMessagingPermissionMessagingProviderMessagingTemplate)BUILTIN_TEMPLATESTemplateDefinitionc                   @  s   e Zd Zefd9ddZd:d	d
Zd;ddZd<ddZd=ddZd>ddZ	d?ddZ
d@dd ZdAd$d%Zd&d&d&d'dBd-d.ZdCd/d0ZdDd4d5ZdEd7d8Zd&S )FMessagingRepositoryreturnNonec                 C  s
   || _ d S N)session_factory)selfr    r   ?/var/www/html/flask_server/apps/messaging_service/repository.py__init__   s   
zMessagingRepository.__init__	tenant_idstrrequesting_appMessagingPermission | Nonec              
   C  s\   |    }|tttj|ktj|ktjd	 W  d    S 1 s'w   Y  d S )NT)
r   executer   r   wherer   r   enabledis_scalar_one_or_none)r   r   r   sessionr   r   r   
permission   s   

$zMessagingRepository.permissionkeychannelTemplateDefinition | Nonec                 C  s   |   U}|ttttj|ktjd tj|ktj	|ktj
dtj tj   }|rRt|j|j	|jt|jpBd|j|j|jW  d    S W d    n1 s\w   Y  t||fS )NTr   )r   r   r   r   r    r   r   r"   template_keyr'   r!   order_bydescversionscalarsfirstr   tupleallowed_variables_json	text_bodysubject	html_bodyr   get)r   r   r&   r'   r$   recordr   r   r   template   s&   


zMessagingRepository.templatelist[MessagingProvider]c                 C  sv   |   -}t|tttj|ktj|ktj	dtj
dtjtj W  d    S 1 s4w   Y  d S )NT)activedegraded)r   listr   r   r   r    r   r'   r!   r"   health_statusin_r*   priority
created_atr-   )r   r   r'   r$   r   r   r   	providers(   s   


$zMessagingRepository.providersprovider_idMessagingProvider | Nonec                 C  R   |   }|tttj|ktj|k W  d    S 1 s"w   Y  d S r   )r   r   r   r   r    r   r@   r#   )r   r   r@   r$   r   r   r   provider0   s   
$zMessagingRepository.providerdelivery_idMessagingDelivery | Nonec                 C  rB   r   )r   r   r   r   r    r   rD   r#   )r   r   rD   r$   r   r   r   delivery7   s   
$zMessagingRepository.delivery	operationc              
   C  sb   |   #}|tttj|ktj|ktj|ktj|k	 W  d    S 1 s*w   Y  d S r   )
r   r   r   r   r    r   r   rG   idempotency_keyr#   )r   r   r   rG   r&   r$   r   r   r   existing=   s   
$zMessagingRepository.existingtuple[MessagingDelivery, bool]c                 K  s   |   ^}tdi |}|| z|  || |dfW W  d    S  tya   |  |tt	tj
|d ktj|d ktj|d ktj|d k }|df Y W  d    S w 1 sew   Y  d S )NTr   r   rG   rH   Fr   )r   r   addcommitrefreshr   rollbackr   r   r    r   r   rG   rH   
scalar_one)r   valuesr$   rF   rI   r   r   r   create_deliveryD   s,   



z#MessagingRepository.create_deliveryattempt_numberintr   c           	      C  s   t  }|  _}|t|}|t||||j|j|j	|j
|j|d	 ||_|j|_|j|_|j	|_	|t|}|jrH|d d|_|_|_n|jpLd|_| jd7  _|  || |W  d    S 1 sjw   Y  d S )N)	rD   r@   rR   statuserror_categoryprovider_code	retryable
latency_mscompleted_atr   provider_errorr
   )r   utcnowr   r4   r   rK   r   rT   rU   rV   rW   rX   r@   r   acceptedlast_success_at
last_errorconsecutive_failuresrL   rM   )	r   rD   r@   rR   resultnowr$   rF   rC   r   r   r   complete_attemptV   s*   


$z$MessagingRepository.complete_attemptN)r@   	recipientpurposesincer   
str | Nonerc   rd   c                C  s   |   C}tj|ktj|kg}|r|tj|k |r#|tj|k |r-|tj|k t|	t
t tj|  W  d    S 1 sJw   Y  d S r   )r   r   r   r>   appendr@   recipient_normalizedrd   rS   r   r   r   countselect_fromr    rO   )r   r   re   r@   rc   rd   r$   filtersr   r   r   count_sincem   s   
$$zMessagingRepository.count_sincec                 C  sr   |   +}|t|}t |_|j|_|j|_	|j
rdn|jd |_|  W d    d S 1 s2w   Y  d S )Nr   r
   )r   r4   r   r   r[   last_health_check_atrT   r;   rU   r^   r\   r_   rL   )r   r@   r`   r$   rC   r   r   r   update_healthv   s   


"z!MessagingRepository.update_healthrP   dictr   c                 C  s   |   L}|d}|r|t|nd }|r|j|krtd|d u r-t|d}|| dD ]}||v r=t||||  q/|  || |W  d    S 1 sSw   Y  d S )Nr@   z"Provider belongs to another tenant)r   )
namedriverr'   r!   r=   config_json
secret_refdaily_limitper_minute_limitmax_retries)	r   r4   r   r   PermissionErrorrK   setattrrL   rM   )r   r   rP   r$   r@   rC   fieldr   r   r   save_provider   s   



$z!MessagingRepository.save_providerr   c                 C  s   |   H}t|d }|tttj|ktj|k p#t||d}|	| dD ]}||v r9t
||||  q+|  || |W  d    S 1 sOw   Y  d S )Nr   )r   r   )r!   channels_jsontemplates_jsonpurposes_jsonallow_fallback)r   r   r   r   r   r    r   r   r#   rK   rx   rL   rM   )r   r   rP   r$   appr5   ry   r   r   r   save_permission   s   


$z#MessagingRepository.save_permission)r   r   )r   r   r   r   r   r   )r   r   r&   r   r'   r   r   r(   )r   r   r'   r   r   r7   )r   r   r@   r   r   rA   )r   r   rD   r   r   rE   )
r   r   r   r   rG   r   r&   r   r   rE   )r   rJ   )rD   r   r@   r   rR   rS   r   r   )r   r   re   r   r@   rf   rc   rf   rd   rf   r   rS   )r@   r   r   r   )r   r   rP   ro   r   r   )r   r   rP   ro   r   r   )__name__
__module____qualname__r	   r   r%   r6   r?   rC   rF   rI   rQ   rb   rl   rn   rz   r   r   r   r   r   r      s     








	
	r   N)__doc__
__future__r   r   r   
sqlalchemyr   r   r   sqlalchemy.excr   config.control_planer	   modelsr   r   r   r   r   	templatesr   r   r   r   r   r   r   <module>   s    