o
    y d1                  
   @   s  d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl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d dlmZ d dlZd dlZd dlZd dl Z e!e"d e"ddkred ne"ddkred ne"ddkred ne#ddddddiZ$ee%Z&ee& ee&j'e&_'e	e&e$dZ(dd Z)ej*+dZ,e) Z-e(.ddZ/ej0ej1 Z2dd  Z3d!d" Z4d#d$ Z5d%d& Z6d'd( Z7d)d* Z8e/9d+e
j:d,d+d-d.e
j:d,d/d0d.d1Z;e/<d2G d3d+ d+eZ=e/9d4e
j:d,d5d6e
j:d,d7d6e
j:d,d8d6e
j:d,d9d6d:Z>e/j?dd;e/<d<G d=d4 d4eZ@e(.d>d?ZAeAj?dd;eA<d@G dAdB dBeZBeAj?dd;eA<dCG dDdB dBeZBeAj?dd;eA<dEG dFdG dGeZCe(.dHdIZDeDj?dd;eD<dJG dKdL dLeZEeDj?dd;eD<dMG dNdL dLeZEeDj?dd;eD<dOG dPdL dLeZEe%dQkre&F  dS dS )R    )Flaskrequest)ProxyFix)CORS)ResourceApifieldsN)
HTTPStatus)ObjectId)	json_util)jsonify)Response)load_dotenv	FLASK_ENVdevelopmentz.env.developmentstagingz.env.staging
productionz.env.productionzWrong EnvironmentapikeyapiKeyheaderAuthorization)typeinname)authorizationsc                  C   s   t tjd} | S )NMONGODB_CONNECTION_STRING)pymongoMongoClientosenvironget)client r"   :/mnt/c/Users/ChattiNader/Documents/MyHotelMatch/api/app.pymongodb_connect1   s   r$   MONGODB_DATABASEauthenticationzAuthentication Enpointsc              
   C   s  zEt | }tt d d|i}|d r:|tt d d|d id  v r:|tt d d|d id | v sCtdd	 W d S W d S  tjj	yb } ztdt
| W Y d }~d S d }~w tjyr   tdd	 Y d S  tjy   tdd	 Y d S w )
Nuserssubactiverolesr   rolepermissions  zNot Authorized)decode_auth_tokenr!   r%   find_onekeysns_authabortjwt
exceptionsDecodeErrorstrExpiredSignatureErrorInvalidTokenError)
auth_tokenendpointmethodr(   usererrr"   r"   r#   checkPermission>   s    .$r>   c                 C   sJ   t j  t jddttd d t j  | d}tj|tdddS )	Nr   i  TOKEN_EXPIRATION_HOURS)daysseconds)expiatr(   
SECRET_KEYHS256)	algorithm)datetimeutcnow	timedeltaintr   getenvr3   encode)user_idpayloadr"   r"   r#   encode_auth_tokenO   s   $rO   c                 C   s    t j| tddgd}|d S )NrD   rE   )
algorithmsr(   )r3   decoder   rK   )r9   rN   r"   r"   r#   r.   \   s   r.   c                 C   st   t | dk }td| d u }td| d u }td| d u }|p%|p%|p%| }|s8d|||||dd}d|fS d S )	N   z\dz[A-Z]z[a-z]fail)password_oklength_errordigit_erroruppercase_errorlowercase_errorstatusmessage  )lenresearch)passwordrU   rV   rW   rX   rT   responseObjectr"   r"   r#   checkPassworda   s,   	rb   c              
   C   s  d}t || sddd}d|fS z| ddd }ttj|d	}|W S  tjjyD } zdt|d}d|fW  Y d }~S d }~w tjj	yb } zdt|d}d|fW  Y d }~S d }~w tjj
y } zdt|d}d|fW  Y d }~S d }~ww )
Nz*^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$rS   zinvalid emailrY   r\   @   MX)r^   r_   rsplitbooldnsresolverqueryNoNameserversr6   NoAnswerNXDOMAIN)emailregexra   domainnsr=   r"   r"   r#   
checkEmaily   s*   
rs   c                 C   s0   t t d d| i} | sddd}d|fS d S )Nr*   r   rS   zrole does not existrY   r\   )r!   r%   r/   )r+   ra   r"   r"   r#   	checkRole   s
   
rt   LoginT
your_login)requireddescriptionexamplePasswordyour_password)loginr`   z/loginc                   @   sB   e Zd Zeddeddeddeedd Zd	S )
ru      Authentication Successfulr\   Bad Requestr-   Authentication Failedc                 C   s   t jd }t jd }tt d d|i}|s ddd}|dfS |d s-dd	d}|dfS t|d
|d drKt|d }dd|d}|dfS ddd}|dfS )z#Log in using a login and a passwordr|   r`   r'   failedz)authentication failed user does not existrY   r-   r)   z)authentication failed user is deactivatedutf8hashed_passwordutf-8r(   successzSuccessfully logged in.)rZ   r[   r9   r}   rS   zauthentication failed)	r   jsonr!   r%   r/   bcryptcheckpwrL   rO   )selfr|   given_passwordr<   ra   r9   r"   r"   r#   post   s0   

z
Login.postN)__name__
__module____qualname__r1   responseexpectlogin_modelr   r"   r"   r"   r#   ru      s    


Registertest)rw   ry   ztest@myautonomie.comVyXt4nt0PbAu53fuadmin)r|   ro   r`   r+   )securityz	/registerc                   @   s*   e Zd Zeddeedd ZdS )r   r\   r   c              
   C   s4  t jd}t|dd t }t jd }t jd }t| dt jv r)t jd }nddd	 t	d
D }t
| t }t|d|}d}t jd }	t|	 z)tt d t|||t|d||	d}
dt|
j|
j|dd}|dfW S  tjjy } zdt|d}|dfW  Y d}~S d}~ww )z=Register a new user, you must be admin to perform this actionr   z/authentication/registerPOSTr|   ro   r`    c                 s   s    | ]}t tV  qd S )N)secretschoicealphabet).0ir"   r"   r#   	<genexpr>   s    z Register.post.<locals>.<genexpr>rR   r   Fr+   r'   r   )r(   r|   ro   r   r)   r+   r   )_idacknowledgedr`   rY      rS   r\   N)r   headersr    r>   uuiduuid4r   rs   joinrangerb   r   gensalthashpwrL   rt   r!   r%   
insert_oner6   rQ   inserted_idr   r   errorsDuplicateKeyError)r   r9   r(   r|   ro   r`   saltr   r)   r+   resultra   r=   r"   r"   r#   r      sH   



	
zRegister.postN)r   r   r   r1   r   r   register_modelr   r"   r"   r"   r#   r      s    
hellozBasic Endpointsz/pingc                   @   8   e Zd Zeddeddedddd Zd	S )
Pingr}   r~   r\   r   r-   r   c              
   C   sj   t jd}t|dd zttddidfW S  tj	j
y4 } ztdd W Y d	}~d	S d	}~ww )
r   r   z/hello/pingGETpingpongr}   r\   r   N)r   r   r    r>   r   loadsr   dumpsbsonr   	InvalidIdns_hellor2   r   r9   r=   r"   r"   r#   r      s   Ping.getNr   r   r   r   r   r    r"   r"   r"   r#   r     
    


r   z/timec                   @   r   )
r   r}   r~   r\   r   r-   r   c              
   C   sr   t jd}t|dd zttdtt		 idfW S  t
jjy8 } ztdd W Y d}~dS d}~ww )	Timer   z/hello/timer   timer}   r\   r   Nr   r   r    r>   r   r   r   r   r6   r   r   r   r   r   r2   r   r"   r"   r#   r      s   "r   Nr   r"   r"   r"   r#   r     r   z/thing/<company>c                   @   r   )
Thingr}   r~   r\   r   r-   r   c              
   C   sv   t jd}t|d| d zttdtt		 idfW S  t
jjy: } ztdd W Y d}~dS d}~ww )	r   r   z/hello/thing/r   r   r}   r\   r   Nr   )r   companyr9   r=   r"   r"   r#   r    %  s   "z	Thing.getNr   r"   r"   r"   r#   r   "  r   r   contactszContacts Enpointsz/countc                   @   r   )
Countr}   r~   r\   r   r-   r   c              
   C   |   t jd}t|dd ztd d i }tt	d|idfW S  t
jjy= } ztdd	 W Y d
}~d
S d
}~ww r   r   z/contacts/countr   mhmlabsr   countr}   r\   r   Nr   r   r    r>   r!   count_documentsr   r   r   r   r   r   r   r   r2   r   r9   r   r=   r"   r"   r#   r    6     	Count.getNr   r"   r"   r"   r#   r   3  r   r   z/nextnotqualifiedc                   @   r   )
r   r}   r~   r\   r   r-   r   c              
   C   r   r   r   r   r"   r"   r#   r    F  r   r   Nr   r"   r"   r"   r#   r   C  r   z/contact/<id>c                   @   r   )
r   r}   r~   r\   r   r-   r   c              
   C   r   r   r   r   r"   r"   r#   r    W  r   r   Nr   r"   r"   r"   r#   r   T  r   __main__)Gflaskr   r   werkzeug.middleware.proxy_fixr   
flask_corsr   flask_restxr   r   r   rG   r   r3   stringr   r   r   r   httpr	   r
   r   r   r   r   dotenvr   r   r^   dns.resolverri   r   printrK   	Exceptionr   r   appwsgi_appapir$   r   r    r%   r!   	namespacer1   ascii_lettersdigitsr   r>   rO   r.   rb   rs   rt   modelStringr   routeru   r   docr   r   r   r   ns_contactsr   runr"   r"   r"   r#   <module>   s    


%
-






