
    y d1              
       
	   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j"        d                      ej"        d          dk    r ed           nK ej"        d          dk    r ed           n+ ej"        d          dk    r ed           n e#d          dddddiZ$ ee%          Z& ee&            ee&j'                  e&_'         e	e&e$          Z(d Z)ej*        +                    d          Z, e)            Z-e(.                    dd          Z/ej0        ej1        z   Z2d Z3d Z4d  Z5d! Z6d" Z7d# Z8e/9                    d$ e
j:        d%d$d&'           e
j:        d%d(d)'          d*          Z;e/<                    d+           G d, d$e                      Z=e/9                    d- e
j:        d%d./           e
j:        d%d0/           e
j:        d%d1/           e
j:        d%d2/          d3          Z>e/?                    d4          e/<                    d5           G d6 d-e                                  Z@e(.                    d7d8          ZAeA?                    d4          eA<                    d9           G d: d;e                                  ZBeA?                    d4          eA<                    d<           G d= d;e                                  ZBeA?                    d4          eA<                    d>           G d? d@e                                  ZCe(.                    dAdB          ZDeD?                    d4          eD<                    dC           G dD dEe                                  ZEeD?                    d4          eD<                    dF           G dG dEe                                  ZEeD?                    d4          eD<                    dH           G dI dEe                                  ZEe%dJk    re&F                                 dS dS )K    )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                  h    t          j        t          j                            d                    } | S )NMONGODB_CONNECTION_STRING)pymongoMongoClientosenvironget)clients    6C:\Users\ChattiNader\Documents\MyHotelMatch\api\app.pymongodb_connectr%   1   s&     0K!L!LMMFM    MONGODB_DATABASEauthenticationzAuthentication Enpointsc                 *   	 t          |           }t          t                   d                             d|i          }|d         r|t          t                   d                             d|d         i          d                                         v rA|t          t                   d                             d|d         i          d         |         v st
                              dd	           d S d S # t          j        j	        $ r3}t
                              dt          |                     Y d }~d S d }~wt          j        $ r t
                              dd	           Y d S t          j        $ r t
                              dd	           Y d S w xY 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errs         r$   checkPermissionrA   >   s   -
++&'0995#,GG X 	1H7G0H0Q0Z0Z\bdhiodp[q0r0r  tA  1B  1G  1G  1I  1I  %I  %I(.&9I2J72S2\2\^dfjkqfr]s2t2t  vC  3D  EM  3N  )N  )NMM#/00000 )N  )N>% % % %c3s88$$$$$$$$$$ - - -c+,,,,,,  - - -c+,,,,,,-s$   C-C3 3F(D55-F%)FFc           
      B   t           j                                         t          j        ddt          t	          j        d                    z            z   t           j                                         | d}t          j        |t	          j        d          d          S )	Nr   i  TOKEN_EXPIRATION_HOURS)daysseconds)expiatr+   
SECRET_KEYHS256)	algorithm)datetimeutcnow	timedeltaintr    getenvr6   encode)user_idpayloads     r$   encode_auth_tokenrS   O   s     ''))H,>AtTWXZXabzX{X{T|T|O|,},},}} '')) G
 :
	,   r&   c                 f    t          j        | t          j        d          dg          }|d         S )NrH   rI   )
algorithmsr+   )r6   decoder    rO   )r<   rR   s     r$   r1   r1   \   s.    jRY|%<%<'SSSG5>r&   c                     t          |           dk     }t          j        d|           d u }t          j        d|           d u }t          j        d|           d u }|p|p|p| }|sd|||||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)passwordr[   r\   r]   r^   rZ   responseObjects          r$   checkPasswordrh   a   s    x==2%L)E8,,4Ki(33t;Oi(33t;O# *%*)* *+K  
#* ,*#2#2   N""
# 
#r&   c                    d}t          j        ||           s	ddd}d|fS 	 |                     dd          d         }t          t          j                            |d	                    }|S # t          j        j        $ r }dt          |          d}d|fcY d }~S d }~wt          j        j	        $ r }dt          |          d}d|fcY d }~S d }~wt          j        j
        $ r }dt          |          d}d|fcY d }~S d }~ww xY w)
Nz*^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$rY   zinvalid emailr_   rb   @   MX)rd   re   rsplitbooldnsresolverqueryNoNameserversr9   NoAnswerNXDOMAIN)emailregexrg   domainnsr@   s         r$   
checkEmailrz   y   sU   8E9UE"" #$*GGN""#c1%%b)#,$$VT2233	<% # # #$*s3xx@@N"""""""<  # # #$*s3xx@@N"""""""<  # # #$*s3xx@@N"""""""#sB   A
A- -DBDD3CDD%D :D Dc                 v    t           t                   d                             d| i          } | s	ddd}d|fS d S )Nr-   r   rY   zrole does not existr_   rb   )r#   r'   r2   )r.   rg   s     r$   	checkRoler|      sO    "#G,55vtnEED #$*7LMMN""# #r&   LoginT
your_login)requireddescriptionexamplePasswordyour_password)loginrf   z/loginc                       e Zd Ze                    dd          e                    dd          e                    dd          e                    e          d                                                 ZdS )	r}      Authentication Successfulrb   Bad Requestr0   Authentication Failedc                    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          j        |                    d
          |d                             d                    rt          |d                   }dd|d}|dfS ddd}|dfS )z#Log in using a login and a passwordr   rf   r*   failedz)authentication failed user does not existr_   r0   r,   z)authentication failed user is deactivatedutf8hashed_passwordutf-8r+   successzSuccessfully logged in.)r`   ra   r<   r   rY   zauthentication failed)	r   jsonr#   r'   r2   bcryptcheckpwrP   rS   )selfr   given_passwordr?   rg   r<   s         r$   postz
Login.post   s    W% j1&'0997E:JKK 	'"F N "3&&H~ 	'"F N "3&&>.//77>O9P9W9WX_9`9`aa 	'*4;77J#4( N
 "3&&(.)@B BN!3&&r&   N)__name__
__module____qualname__r4   responseexpectlogin_modelr    r&   r$   r}   r}      s         c677c=))c233^^K  ' ' !  43 *) 87' ' 'r&   Registertest)r   r   ztest@myautonomie.comVyXt4nt0PbAu53fuadmin)r   rv   rf   r.   )securityz	/registerc                       e Zd Ze                    dd          e                    e          d                         ZdS )r   rb   r   c           
         t           j                            d          }t          |dd           t	          j                    }t           j        d         }t           j        d         }t          |           dt           j        v rt           j        d         }n,d                    d t          d	          D                       }t          |           t          j                    }t          j        |                    d
          |          }d}t           j        d         }	t          |	           	 t           t"                   d                             t'          |          ||t'          |                    d                    ||	d          }
dt'          |
j                  |
j        |dd}|dfS # t.          j        j        $ r }dt'          |          d}|dfcY d}~S d}~ww xY w)z=Register a new user, you must be admin to perform this actionr   z/authentication/registerPOSTr   rv   rf    c              3   H   K   | ]}t          j        t                    V  d S )N)secretschoicealphabet).0is     r$   	<genexpr>z Register.post.<locals>.<genexpr>   s,      KKAw~h77KKKKKKr&   rX   r   Fr.   r*   r   )r+   r   rv   r   r,   r.   r   )_idacknowledgedrf   r_      rY   rb   N)r   headersr"   rA   uuiduuid4r   rz   joinrangerh   r   gensalthashpwrP   r|   r#   r'   
insert_oner9   rV   inserted_idr   r   errorsDuplicateKeyError)r   r<   r+   r   rv   rf   saltr   r,   r.   resultrg   r@   s                r$   r   zRegister.post   s    _((99

$>GGGjllW%W%5%%|J/HHwwKKrKKKKKHh~ -(?(?FF|F#$	',-g6AA3xx#&'='=g'F'F#G#G C C  F $v122$*$7 (  N "3&&~/ 	' 	' 	'(.3s88DDN!3&&&&&&&	's   2BF5 5G)	G$G)$G)N)r   r   r   r4   r   r   register_modelr   r   r&   r$   r   r      sW         c=))^^N##&' &' $# *)&' &' &'r&   hellozBasic Endpointsz/pingc                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	Pingr   r   rb   r   r0   r   c                 2   t           j                            d          }t          |dd           	 t	          j        t          j        ddi                    dfS # t          j	        j
        $ r&}t                              dd           Y d	}~d	S d	}~ww xY w)
r   r   z/hello/pingGETpingpongr   rb   r   N)r   r   r"   rA   r   loadsr   dumpsbsonr   	InvalidIdns_hellor5   r   r<   r@   s      r$   r"   zPing.get  s    
 _((99

M5999	/:iovv.>??@@#EE{$ 	/ 	/ 	/NN3.........	/s   )A B0BBNr   r   r   r   r   r"   r   r&   r$   r   r     x         s788sM**s344/ / 54 +* 98/ / /r&   r   z/timec                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	r   r   r   rb   r   r0   r   c           	      n   t           j                            d          }t          |dd           	 t	          j        t          j        dt          t          j	                              i                    dfS # t          j        j        $ r&}t                              dd           Y d}~dS d}~ww xY w)	Timer   z/hello/timer   timer   rb   r   Nr   r   r"   rA   r   r   r   r   r9   r   r   r   r   r   r5   r   s      r$   r"   zPing.get  s    
 _((99

M5999	/:iovs49;;7G7G.HIIJJCOO{$ 	/ 	/ 	/NN3.........	/s   AA: :B4B//B4Nr   r   r&   r$   r   r     r   r&   z/thing/<company>c                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	Thingr   r   rb   r   r0   r   c           	      t   t           j                            d          }t          |d|z   d           	 t	          j        t          j        dt          t          j	                              i                    dfS # t          j        j        $ r&}t                              dd           Y d}~dS d}~ww xY w)	r   r   z/hello/thing/r   r   r   rb   r   Nr   )r   companyr<   r@   s       r$   r"   z	Thing.get%  s    
 _((99

OG$;UCCC	/:iovs49;;7G7G.HIIJJCOO{$ 	/ 	/ 	/NN3.........	/s   AA= =B7B22B7Nr   r   r&   r$   r   r   "  r   r&   r   contactszContacts Enpointsz/countc                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	Countr   r   rb   r   r0   r   c                 ~   t           j                            d          }t          |dd           	 t          d         d                             i           }t          j        t          j	        d|i                    dfS # t          j        j        $ r&}t                              dd	           Y d
}~d
S d
}~ww xY wr   r   z/contacts/countr   mhmlabsr   countr   rb   r   Nr   r   r"   rA   r#   count_documentsr   r   r   r   r   r   r   r   r5   r   r<   r   r@   s       r$   r"   z	Count.get6      
 _((99

$5u===	/9%j1AA"EEE:iow.>??@@#EE{$ 	/ 	/ 	/NN3.........	/   AB B<B77B<Nr   r   r&   r$   r   r   3  x         s788sM**s344/ / 54 +* 98/ / /r&   r   z/nextnotqualifiedc                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	r   r   r   rb   r   r0   r   c                 ~   t           j                            d          }t          |dd           	 t          d         d                             i           }t          j        t          j	        d|i                    dfS # t          j        j        $ r&}t                              dd	           Y d
}~d
S d
}~ww xY wr   r   r   s       r$   r"   z	Count.getF  r   r   Nr   r   r&   r$   r   r   C  r   r&   z/contact/<id>c                       e Zd Ze                    dd          e                    dd          e                    dd          d                                     ZdS )	r   r   r   rb   r   r0   r   c                 ~   t           j                            d          }t          |dd           	 t          d         d                             i           }t          j        t          j	        d|i                    dfS # t          j        j        $ r&}t                              dd	           Y d
}~d
S d
}~ww xY wr   r   r   s       r$   r"   z	Count.getW  r   r   Nr   r   r&   r$   r   r   T  r   r&   __main__)Gflaskr   r   werkzeug.middleware.proxy_fixr   
flask_corsr   flask_restxr   r   r	   rK   r   r6   stringr   r   r   r   httpr
   r   r   r   r   r    dotenvr   r   rd   dns.resolverrp   r   printrO   	Exceptionr   r   appwsgi_appapir%   r!   r"   r'   r#   	namespacer4   ascii_lettersdigitsr   rA   rS   r1   rh   rz   r|   modelStringr   router}   r   docr   r   r   r   ns_contactsr   runr   r&   r$   <module>r      s                   2 2 2 2 2 2       - - - - - - - - - -   



                                    				        				      ibi   29[]**K"####RY{y((KRY{|++K!""""
)'
(
((   eHoo S			x%%	c#n---   :>>"455 			
--(*C
D
D&-/- - -"
 
 
  
# # #0# # #(# # # mmGV]  
   & &   	x"' "' "' "' "'H "' "' "'J zV]D&999V]D2HIIIt5GHHHFM4999	, ,   	h{*' *' *' *' *'x *' *'   *'Z =="344 
x  	/ / / / /8 / /  ! / 
x  	/ / / / /8 / /  ! / 
x  	"##/ / / / /H / / $# ! / mmJ(;<<(##8/ / / / /H / /  $#/ (##&''/ / / / /H / / (' $#/ (##?##/ / / / /H / / $# $#/ zGGIIIII r&   