o
    3h_!                     @   s  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mZ d dlmZ d dlZd dlmZmZ d d	lmZ d d
lmZmZmZ edeZe ZeddZe Zejddgdeeeddd Z ejddgdeeedddd Z!ejddgdedd Z"ejddgdeedd Z#ejddgdeeeddd  Z$ejd!dgded"d# Z%ejd$dgded%d& Z&d'd( Z'ejd)dgded*d+ Z(ejd,dgdeed-d. Z)dS )/    )	Blueprintrequestjsonifycurrent_appsession)generate_password_hash)get_jwt_identity)check_password_hash)db	AdminUser)AdminUserSchemaN)MailMessage)URLSafeTimedSerializer)require_api_keylogin_requiredrole_requiredZadminT)manyz/admin_usersPOST)methodssuper_adminc               
   C   s   t  } td z@t| }|dd}t|d |d< t|d |d |d |d}t	j
| t	j
  td|j d	|  t|d
fW S  tyo } ztdt|  tdt|idfW  Y d }~S d }~ww )Nz%Received request to create admin userrolecontent_adminpassword_hashusernameemail)r   r   r   r   zAdmin user z  created successfully with role    zError creating admin user: error  )r   get_jsonlogginginfoadmin_user_schemaloadgetr   r   r
   r   addcommitr   dump	Exceptionr   strr   )	json_dataZadmin_user_datar   Znew_admin_usere r,   C/home/www/bk.finsightngr.online/FinSight/app/routes/admin_routes.pycreate_admin_user   s*   


 r.   GETr   c                  C   s   t jdd } t jjddtd}t jjddtd}tj}| r+|tjd|  d}|j	||d}t
t|j|j|j|jd	S )
Nsearchpage   )typeper_page
   %)r1   r4   )admin_userstotalr1   r4   )r   argsr$   intr   queryfilterr   ilikepaginater   admin_users_schemar'   itemsr8   r1   r4   )r0   r1   r4   r;   r7   r,   r,   r-   get_admin_users;   s   
rA   z/admin_users/<int:admin_id>c                 C   s   t j| }t|S )N)r   r;   
get_or_404r"   r'   admin_id
admin_userr,   r,   r-   get_admin_userU   s   
rF   PUTc              
   C   s  t j| }t }t jtd }|jdkr$|j| kr$t	ddidfS d|v r5|jdkr5t	ddidfS z&t
j|dd	}| D ]
\}}t||| qAtj  td
 t
|W S  ty } ztdt|  t	dt|idfW  Y d }~S d }~ww )Nadmin_user_idr   r   z<Permission denied. Only super admins can update other users.i  r   z6Permission denied. Only super admins can modify roles.T)partialzAdmin user updated successfullyzError updating admin user: r   )r   r;   rB   r   r   r$   r   r   idr   r"   r#   r@   setattrr
   r&   r    r!   r'   r(   r   r)   )rD   rE   r*   Zcurrent_adminZupdated_admin_userkeyvaluer+   r,   r,   r-   update_admin_user]   s&   

 rN   DELETEc                 C   s<   t j| }tj| tj  td t	ddidfS )NzAdmin user deleted successfullymessage   )
r   r;   rB   r
   r   deleter&   r    r!   r   rC   r,   r,   r-   delete_admin_user   s
   

rS   z/admin/loginc                  C   s   t  } | d}| d}td|  tjj|d }|rMt	|j
|rM|jtd< |jtd< |jtd< td| d	|j d
 td|jddfS td| d tddidfS )Nr   passwordzAdmin login attempt for r   rH   admin_usernameZ
admin_rolezAdmin z (Role: z) logged in successfullyzLogin successful)msgr      zLogin failed for z: Invalid credentialsrW   zBad username or password  )r   r   r$   r    r!   r   r;   	filter_byfirstr	   r   rJ   r   r   r   r   r   )r*   r   rT   rE   r,   r,   r-   login   s$   




r\   z/forgot_passwordc                  C   s   t  } | d}td|  tjj|d }|rFt	t
jd }|j|dd}t
jd  d| }t|| td	 td
didfS td td
didfS )Nr   zPassword reset requested for )r   
SECRET_KEYzpassword-reset-salt)saltFRONTEND_URLz/reset_password/zReset password link sentrW   zPassword reset link sentrX   zEmail not foundi  )r   r   r$   r    r!   r   r;   rZ   r[   r   r   configdumpssend_email_with_reset_linkr   r   )r*   r   rE   
serializerZreset_token
reset_linkr,   r,   r-   forgot_password   s   



re   c                 C   sV   d}d| }t || g|d}t  t| W d    d S 1 s$w   Y  d S )NzReset Your Passwordz'Click the link to reset your password: )subjectZ
recipientsbody)r   r   app_contextmailsend)tord   rf   rg   rW   r,   r,   r-   rb      s   

"rb   z/change_passwordc                  C   s   t  } t d}| d}| d}td tjj|d	 }|rDt
|j|rDt||_tj  td|  tddid	fS td
 tddidfS )Nr   old_passwordnew_passwordzChange password requestrU   z"Password changed successfully for rW   zPassword changed successfullyrX   z'Invalid credentials for password changezInvalid credentialsrY   )r   r   r   r$   r    r!   r   r;   rZ   r[   r	   r   r   r
   r   r&   r   r   )r*   r   rl   rm   rE   r,   r,   r-   change_password   s   





rn   z/logoutc                   C   sJ   dt vrtddidfS t dd  t dd  td tddidfS )	NrH   rW   zSession expiredrY   rV   zAdmin logged out successfullyzLogout successfulrX   )r   r   popr    r!   r,   r,   r,   r-   logout   s   
rp   )*flaskr   r   r   r   r   Zwerkzeug.securityr   Zflask_jwt_extendedr   r	   
app.modelsr
   r   app.schemasr   r    
flask_mailr   r   itsdangerousr   	app.utilsr   r   r   __name__admin_bpr"   r?   ri   router.   rA   rF   rN   rS   r\   re   rb   rn   rp   r,   r,   r,   r-   <module>   sd   

"