
    "ie                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ 	 d d	lmZmZ  ej,                  e      Zdd
ZddZddZddZdgZy# e$ r eZdZY 1w xY w)    )annotationsN)Path)Any)datetimetimezone)inspecttext)Session)get_settings)WebPushExceptionwebpushc                \    | j                         }|yt        |      j                  |      S )NF)get_bindr   	has_table)db
table_namebinds      6apps/ordini/backend/app/services/push_notifications.py_table_existsr      s*    ;;=D|4="":..    c           
        t        | d      sg S | j                  t        d            j                         j	                         }|D cg c]  }|j                  d      r~|j                  d      rm|j                  d      r\t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      dd c}S c c}w )	Ntenant_push_subscriptionsz
            SELECT endpoint, p256dh, auth
            FROM tenant_push_subscriptions
            WHERE enabled = 1
            ORDER BY updated_at DESC
            endpointp256dhauth )r   r   )r   keys)r   executer	   mappingsallgetstr)r   rowsrows      r    _load_enabled_push_subscriptionsr%      s    89	::	
	 hj 	$ 
 77:3778#4 CGGJ/526cggh/526CGGFO1r2	

 
 
s   	BC"c                   |rt        | d      sy | j                  t        d      |rdnd|d d t        j                  t
        j                        j                         |d       y )Nr   a  
            UPDATE tenant_push_subscriptions
            SET
                enabled = CASE WHEN :disable = 1 THEN 0 ELSE enabled END,
                last_error = :last_error,
                updated_at = :updated_at
            WHERE endpoint = :endpoint
               r   i  )disable
last_error
updated_atr   )r   r   r	   r   nowr   utc	isoformat)r   r   error_detailr(   s       r   _mark_subscription_errorr/   :   s_    =-HIJJ		
 $q&u-",,x||4>>@ 		
r   c           	        t         t        j                  d       yt        t	               j
                        }|j                         st        j                  d|       yd}t        |       D ]h  }t        |j                  d      xs d      }	 t        |t        j                  |d      t        |      dt	               j                  id	
       |dz  }j | j%                          |S # t        $ r>}t        |dd       }t        |dd       }t        | |t        |      |dv        Y d }~d }~wt         $ r7}t        j#                  d       t        | |t        |      d       Y d }~d }~ww xY w)Nz4pywebpush non disponibile: notifica push non inviatar   z9Chiave VAPID non trovata in %s: notifica push non inviatar   r   F)ensure_asciisub
   )subscription_infodatavapid_private_keyvapid_claimstimeoutr'   responsestatus_code>       )r(   z#Invio push sotto-stock non riuscito)r   loggerwarningr   r   push_vapid_private_key_fileexistsr%   r"   r!   jsondumpspush_vapid_subjectr   getattrr/   	Exception	exceptioncommit)	r   payloadprivate_key_path
sent_countsubscriptionr   excr9   r:   s	            r   send_push_payloadrM   R   sK   MNLNFFG""$RTdeJ8< |''
39r:	".ZZe<"%&6"7#\^%F%FG !OJ%( IIK   	`sJ5H!(M4@K$R3s8[T^E^__ 	LBC$R3s8UKK	Ls%   AC++	E044D--E09-E++E0rM   )r   r
   r   r"   returnbool)r   r
   rN   zlist[dict[str, object]])
r   r
   r   r"   r.   r"   r(   rO   rN   None)r   r
   rH   zdict[str, object]rN   int)
__future__r   rA   loggingpathlibr   typingr   r   r   
sqlalchemyr   r	   sqlalchemy.ormr
   app.core.configr   	pywebpushr   r   ImportErrorrE   	getLogger__name__r=   r   r%   r/   rM   __all__ r   r   <module>r_      sx    "     ' $ " (3 
		8	$/60 F 
K   Gs   A& &	A21A2