o
    4~-iL&                  
   @   s\  d dl mZmZmZmZ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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mZ d dlmZm Z  d dl!Z!d dl"Z"d dl#Z#d dlmZmZmZm$Z$ d dlm%Z% d dl&m'Z' dZ(dZ)dZ*dZ+dZ,ee(Z-e Z.e Z/edgddZ0de1fddZ2de1de1fddZ3G dd de/Z4G d d! d!e/Z5ee(6d"d#d$d%Z7e/j.j8e7d& e Z9ed'd(Z:e9j;d)ed*d(d*d+ e9<d,d-d, Z=e9<d.d/d. Z>e+fd0e?d1e@fd2d3ZAd4e1fd5d6ZBi ZCeDeCd7 d dl#Z#d dl&m'Z' d8e1d9e1d:e1fd;d<ZEe9jFd=ed>d?efd@dAZGe9jHd=ed>edBedBedBfd?edCe1dDe1de1fdEdFZIe9jFdGed>d?efdHdIZJe9jHdGed>edBedBfd?edDe1de1fdJdKZKe9FdLdMdN ZLe9jFdLed>d?efdOdNZLe9jFdPed>d?efdQdRZMe9jFdSed>edfd?edTe1fdUdVZNe9jFdWed>d?efdXdYZOe9jHdWed>edBfd?edDe1fdZd[ZPe9jHd\ed>edBedBfd?edDe1d]e1fd^d_ZQe9jHd`ed>edBedBedBfd?edDe1de1dae1fdbdcZRe9Fdddedf ZSd dlTZTd dlUZUeVdgkr,eTWdhXeTjY eUjZdidjdkd$dl dS dS )m    )FastAPIRequestFormDependsHTTPExceptionCookie)HTMLResponseRedirectResponse)Jinja2Templates)StaticFiles)ColumnIntegerStringcreate_engineMetaData)declarative_base)Database)select)CryptContext)jwtJWTError)datetime	timedeltaN)r   r   r   DateTime)func)MIMETextzkpostgresql+asyncpg://postgres:p4python@postgres.cqf3qroocfwm.us-east-1.rds.amazonaws.com:5432/Inhouse-EmailYOUR_SECRET_KEYHS256<   i,  argon2auto)schemes
deprecatedpasswordc                 C   s
   t | S N)pwd_contexthashr#    r(   0/home/esfera/Desktop/Rishu/Inhouse_Email/main.pyhash_password   s   
r*   hashedc                 C   s   t | |S r$   )r%   verify)r#   r+   r(   r(   r)   verify_password"   s   r-   c                   @   sH   e Zd ZdZeedddZeeddddZeedddZ	eeddZ
dS )	UserusersTprimary_keyindexF)uniquer2   nullable)r3   r4   r4   N)__name__
__module____qualname____tablename__r   r   idr   usernameemailr#   r(   r(   r(   r)   r.   %   s    r.   c                   @   s   e Zd ZdZeedddZeeddZeeddZ	eeddZ
eeddZeeddZeeddZeedde dZeedde dZeeddZd	S )
LeadleadsTr0   Fr5   )timezone)server_default)onupdateN)r6   r7   r8   r9   r   r   r:   r   namer<   companystatusr   email_sent_atemail_replied_atr   now
created_at
updated_atnotesr(   r(   r(   r)   r=   ,   s    r=   z+asyncpg T)echo)bind	templates)	directoryz/staticstatic)rB   startupc                         t  I d H  d S r$   )databaseconnectr(   r(   r(   r)   rQ   C      shutdownc                      rR   r$   )rS   
disconnectr(   r(   r(   r)   rV   G   rU   dataexpires_deltac                 C   s8   |   }t t|d }|d|i tj|ttdS )N)minutesexp)	algorithm)	copyr   utcnowr   updater   encode
SECRET_KEY	ALGORITHM)rX   rY   	to_encodeexpirer(   r(   r)   create_access_tokenL   s   re   tokenc                 C   sR   zt j| ttgd}|d}|d u rtddd|W S  ty(   tdddw )N)
algorithmssubi  zInvalid token)status_codedetail)r   decodera   rb   getr   r   )rf   payloadr;   r(   r(   r)   get_current_userR   s   
rn   zotp_stor --------to_emailsubjectbodyc           
   
   C   s   z7d}d}d}d}t |}||d< ||d< | |d< t||}||| || |  td|   W d S  tyO }	 ztd	|	 W Y d }	~	d S d }	~	ww )
Nzsmtp.titan.emaili  zcontact@nudgeworld.ioz	F0cus3d1!SubjectFromTozEmail sent to zError sending email:)r   smtplibSMTP_SSLloginsend_messagequitprint	Exception)
ro   rp   rq   smtp_server	smtp_portsender_emailsender_passwordmsgserverer(   r(   r)   
send_emailc   s$   
r   	/register)response_classrequestc                 C      t d| d dS )Nregister.htmlr   errorrN   TemplateResponser   r(   r(   r)   register_pagez      r   .r;   r<   c                    s   t ttj|ktj|kB }t|I d H }|r#td| ddS t	|}tj
 j|||d}t|I d H  tdddS )Nr   zUser already existsr   )r;   r<   r#   /login.  urlri   )r   r.   wherer;   r<   rS   	fetch_onerN   r   r*   	__table__insertvaluesexecuter	   )r   r;   r<   r#   queryexisting_userhashed_passwordinsert_queryr(   r(   r)   register~   s   r   r   c                 C   r   )N
login.htmlr   r   r   r(   r(   r)   
login_page   r   r   c                    s|   t ttj|k}t|I d H }|rt||d s%td| ddS t	d|d i}t
ddd	}|jd
|ddd |S )Nr#   r   zInvalid email or password.r   rh   r;   /dashboard/leadsr   r   access_tokenTi  )keyvaluehttponlymax_age)r   r.   r   r<   rS   r   r-   rN   r   re   r	   
set_cookie)r   r<   r#   r   userrf   responser(   r(   r)   rw      s   rw   /c                      s   t ddS )Nr   r   )r	   r(   r(   r(   r)   root   s   
r   c                    s   t dd| iS )Nr   r   r   r   r(   r(   r)   r      s   r   c                    s,   t t}t|I d H }td| |dS )Nz
leads.html)r   r>   )r   r=   rS   	fetch_allrN   r   )r   r   r>   r(   r(   r)   dashboard_leads   s   r   z
/dashboardr   c                    s~   |st ddS t|}tttj|k}t|I d H }tt}t	|I d H }t	ttI d H }t
d| |||dS )Nr   r   z	base.html)r   r   current_userr>   )r	   rn   r   r.   r   r;   rS   r   r=   r   rN   r   )r   r   r;   current_user_queryr   leads_query	all_leads	all_usersr(   r(   r)   	dashboard   s   
r   z/forgot-passwordc                 C   s   t d| d d dS )Nforgot_password.htmlr   r   messager   r   r(   r(   r)   forgot_password_page   s   r   c                    s   t ttj|k}t|I d H }|std| dd dS tt	
dd}|t t dt|< t|dd|  td	| |d d
S )Nr   zEmail not foundr   i i?B )otpexpireszYour OTP for Password ResetzYour OTP is: verify_otp.htmlr   r<   r   )r   r.   r   r<   rS   r   rN   r   strrandomrandinttimeOTP_EXPIRY_SECONDS	otp_storer   )r   r<   r   r   r   r(   r(   r)   forgot_password   s   r   z/verify-otpr   c                    s   |t vrtd| |ddS t | d }t t | d kr.t | td| |ddS ||kr<td| |ddS td| |d dS )	Nr   zNo OTP foundr   r   r   zOTP expiredzInvalid OTPreset_password.html)r   rN   r   r   pop)r   r<   r   
stored_otpr(   r(   r)   
verify_otp   s   
r   z/reset-passwordconfirm_passwordc                    sl   ||krt d| |ddS t|}tj tj|kj|d}t	
|I d H  t|d  tdddS )Nr   zPasswords do not matchr   r'   r   r   r   )rN   r   r*   r.   r   r_   r   r<   r   rS   r   r   r   r	   )r   r<   r#   r   r   update_queryr(   r(   r)   reset_password   s   r   z/logoutc                     s   t ddd} | d | S )Nr   r   r   r   )r	   delete_cookie)r   r(   r(   r)   logout   s   
r   __main__zuvicorn.accesszmain:appz0.0.0.0i@  )hostportreload)[fastapir   r   r   r   r   r   fastapi.responsesr   r	   fastapi.templatingr
   fastapi.staticfilesr   
sqlalchemyr   r   r   r   r   sqlalchemy.ext.declarativer   	databasesr   sqlalchemy.sqlr   passlib.contextr   joser   r   r   r   r   r   ru   r   r   email.mime.textr   DATABASE_URLra   rb   ACCESS_TOKEN_EXPIRE_MINUTESr   rS   metadataBaser%   r   r*   r-   r.   r=   replaceengine
create_allapprN   mounton_eventrQ   rV   dictintre   rn   r   rz   r   rl   r   postr   r   rw   r   r   r   r   r   r   r   r   logginguvicornr6   	getLoggersetLevelWARNINGrunr(   r(   r(   r)   <module>   s     



0&
&0

