mayureshagashe2105 commited on
Commit
dce75a4
Β·
1 Parent(s): 1c097b9

Add email microservice

Browse files
TechdocsAPI/backend/__init__.py CHANGED
@@ -12,11 +12,6 @@ from langchain.llms import Clarifai
12
  from langchain.chains import LLMChain
13
  from langchain.prompts import PromptTemplate
14
 
15
- from fastapi_mail import ConnectionConfig, FastMail
16
- import yagmail
17
- from jinja2 import Environment, FileSystemLoader
18
- import os
19
-
20
  app = FastAPI(title="Techdocs",
21
  version="V0.0.1",
22
  description="API for automatic code documentation generation!"
@@ -49,33 +44,8 @@ try:
49
  app.state.llmchain = llmchain
50
 
51
 
52
- conf = ConnectionConfig(
53
- MAIL_USERNAME=config.MAIL_USERNAME,
54
- MAIL_PASSWORD=config.MAIL_PASSWORD,
55
- MAIL_FROM=config.MAIL_FROM,
56
- MAIL_PORT=8080,
57
- MAIL_SERVER="smtp.gmail.com",
58
- MAIL_STARTTLS=False,
59
- MAIL_SSL_TLS=True,
60
- TEMPLATE_FOLDER="backend/templates",
61
- USE_CREDENTIALS = True,
62
- VALIDATE_CERTS = True
63
-
64
- # MAIL_TLS=True,
65
- # MAIL_SSL=False
66
- )
67
-
68
- app.state.mail_client = FastMail(conf)
69
  app.state.templates = Jinja2Templates(directory="./backend/templates")
70
 
71
- #testing yagmail
72
- yag = yagmail.SMTP(config.MAIL_USERNAME, config.MAIL_PASSWORD)
73
- app.state.yagmail = yag
74
- env = Environment(
75
- loader=FileSystemLoader('./backend/templates/'))
76
- app.state.jinjaenv = env
77
-
78
-
79
 
80
 
81
  except mysql.connector.Error as err:
 
12
  from langchain.chains import LLMChain
13
  from langchain.prompts import PromptTemplate
14
 
 
 
 
 
 
15
  app = FastAPI(title="Techdocs",
16
  version="V0.0.1",
17
  description="API for automatic code documentation generation!"
 
44
  app.state.llmchain = llmchain
45
 
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  app.state.templates = Jinja2Templates(directory="./backend/templates")
48
 
 
 
 
 
 
 
 
 
49
 
50
 
51
  except mysql.connector.Error as err:
TechdocsAPI/backend/core/ConfigEnv.py CHANGED
@@ -21,9 +21,7 @@ class Settings(BaseSettings):
21
  CLARIFAI_PAT:str
22
  MODEL_VERSION_ID:str
23
 
24
- MAIL_USERNAME:str
25
- MAIL_PASSWORD:str
26
- MAIL_FROM:str
27
 
28
  class Config:
29
  env_file = ".env"
 
21
  CLARIFAI_PAT:str
22
  MODEL_VERSION_ID:str
23
 
24
+ MAIL_SERVER_URL:str
 
 
25
 
26
  class Config:
27
  env_file = ".env"
TechdocsAPI/backend/core/ExceptionHandlers.py CHANGED
@@ -19,6 +19,12 @@ async def email_not_verified(request: Request, exec: EmailNotVerifiedException):
19
  content=repr(exec)
20
  )
21
 
 
 
 
 
 
 
22
  @app.exception_handler(InvalidCredentialsException)
23
  async def handle_login_failed(request: Request, exec: InvalidCredentialsException):
24
  return JSONResponse(status_code=status.HTTP_403_FORBIDDEN,
 
19
  content=repr(exec)
20
  )
21
 
22
+ @app.exception_handler(EmailNotSentException)
23
+ async def email_not_sent(request: Request, exec: EmailNotSentException):
24
+ return JSONResponse(status_code=status.HTTP_403_FORBIDDEN,
25
+ content=repr(exec)
26
+ )
27
+
28
  @app.exception_handler(InvalidCredentialsException)
29
  async def handle_login_failed(request: Request, exec: InvalidCredentialsException):
30
  return JSONResponse(status_code=status.HTTP_403_FORBIDDEN,
TechdocsAPI/backend/core/Exceptions.py CHANGED
@@ -54,4 +54,16 @@ class EmailNotVerifiedException(Exception):
54
  self.status = 'EmailNotVerifiedException'
55
 
56
  def __repr__(self):
57
- return "exception.EmailNotVerifiedException()"
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  self.status = 'EmailNotVerifiedException'
55
 
56
  def __repr__(self):
57
+ return "exception.EmailNotVerifiedException()"
58
+
59
+
60
+ class EmailNotSentException(Exception):
61
+ def __init__(self):
62
+ self.set_statuses()
63
+ super(EmailNotSentException, self).__init__()
64
+
65
+ def set_statuses(self):
66
+ self.status = 'EmailNotSentException'
67
+
68
+ def __repr__(self):
69
+ return "exception.EmailNotSentException()"
TechdocsAPI/backend/services/auth/__init__.py CHANGED
@@ -1,2 +1,3 @@
1
  from .ops import *
2
- from .utils.JWTBearer import *
 
 
1
  from .ops import *
2
+ from .utils.JWTBearer import *
3
+ from .utils.functools import *
TechdocsAPI/backend/services/auth/ops.py CHANGED
@@ -1,4 +1,5 @@
1
  from .utils.auth_funcs import *
 
2
  from .utils.JWTBearer import *
3
  from backend.models import *
4
  from backend.services.db.utils.DBQueries import DBQueries
@@ -11,11 +12,6 @@ from fastapi import HTTPException, BackgroundTasks
11
  from pydantic import ValidationError
12
  from jose import jwt
13
 
14
- from fastapi_mail import MessageSchema, MessageType
15
-
16
- # import openai
17
- # from transformers import RobertaTokenizer, T5ForConditionalGeneration
18
-
19
  async def ops_signup(bgtasks: BackgroundTasks, response_result: GeneralResponse, data: UserAuth):
20
  """Wrapper method to handle signup process.
21
 
@@ -41,30 +37,26 @@ async def ops_signup(bgtasks: BackgroundTasks, response_result: GeneralResponse,
41
  "verify_link": verification_link
42
  }
43
 
44
- message = MessageSchema(
45
- subject="Welcome to Techdocs:[Account Verification]",
46
- recipients=[data.email], # List of recipients, as many as you can pass
47
- template_body=email_body_params,
48
- subtype=MessageType.html
49
- )
50
-
51
- # template = app.state.jinjaenv.get_template("email_verification.html")
52
- # output = template.render(data=email_body_params)
53
- # email = "Hi {username} πŸ‘‹\n\nWelcome to Techdocs! Please click on the link below to verify your account.\n\n<a href='{verify_link}'>Click Here</a>\n\nThanks,\nTechdocs Team".format(**email_body_params)
54
- # bgtasks.add_task(app.state.mail_client.send_message, message=message, template_name="email_verification.html")
55
- # bgtasks.add_task(app.state.yagmail.send, to=data.email, subject="Welcome to Techdocs:[Account Verification]",
56
- # contents=email)
57
-
58
- # bgtasks.add_task(app.state.mail_client.send_message, message=message, template_name="email_verification.html")
59
- # await app.state.mail_client.send_message(message=message, template_name="email_verification.html")
60
 
61
- DBQueries.insert_to_database('auth', (data.username, Auth.get_password_hash(data.password), data.email, 1),
62
  ['username', 'password', 'email', 'is_verified'])
63
 
64
 
65
 
66
  response_result.status = 'success'
67
- # response_result.message = [f'Activate your account by clicking on the link sent to {data.email}.\nMake sure to check your spam folder.']
68
 
69
  def ops_login(data:LoginCreds):
70
  """Wrapper method to handle login process.
@@ -93,8 +85,8 @@ def ops_login(data:LoginCreds):
93
  # password is incorrect
94
  raise InvalidCredentialsException(response_result)
95
 
96
- # if not user[2]:
97
- # raise EmailNotVerifiedException()
98
 
99
  # password is correct
100
  return TokenSchema(access_token=Auth.create_access_token(data.username),
 
1
  from .utils.auth_funcs import *
2
+ from .utils.functools import *
3
  from .utils.JWTBearer import *
4
  from backend.models import *
5
  from backend.services.db.utils.DBQueries import DBQueries
 
12
  from pydantic import ValidationError
13
  from jose import jwt
14
 
 
 
 
 
 
15
  async def ops_signup(bgtasks: BackgroundTasks, response_result: GeneralResponse, data: UserAuth):
16
  """Wrapper method to handle signup process.
17
 
 
37
  "verify_link": verification_link
38
  }
39
 
40
+ details = {
41
+ "recipient": [data.email],
42
+ "subject": "Welcome to Techdocs:[Account Verification]",
43
+ "template_name": "email_verification.html",
44
+ "template_kwargs": email_body_params
45
+ }
46
+
47
+ status = post_request(url=config.MAIL_SERVER_URL, data=details, headers=None)
48
+ if status != 200:
49
+ raise EmailNotSentException()
50
+
51
+
 
 
 
 
52
 
53
+ DBQueries.insert_to_database('auth', (data.username, Auth.get_password_hash(data.password), "", 0),
54
  ['username', 'password', 'email', 'is_verified'])
55
 
56
 
57
 
58
  response_result.status = 'success'
59
+ response_result.message = [f'Activate your account by clicking on the link sent to {data.email}.\nMake sure to check your spam folder.']
60
 
61
  def ops_login(data:LoginCreds):
62
  """Wrapper method to handle login process.
 
85
  # password is incorrect
86
  raise InvalidCredentialsException(response_result)
87
 
88
+ if not user[2]:
89
+ raise EmailNotVerifiedException()
90
 
91
  # password is correct
92
  return TokenSchema(access_token=Auth.create_access_token(data.username),
TechdocsAPI/backend/services/auth/utils/functools.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from typing import Any, Dict
3
+ import json
4
+
5
+ def post_request(url: str, data: Dict[str, Any], headers: Dict[str, str]=None):
6
+ json_data = json.dumps(data)
7
+ headers = headers or {'Content-type': 'application/json', 'Accept': 'application/json'}
8
+ response = requests.post(url, data=data, headers=headers)
9
+ return response.status_code
TechdocsAPI/backend/templates/email_verification.html DELETED
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><title>Verify Email</title><style>body { font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0; } .container { width: 80%; margin: 0 auto; padding: 20px; background-color: #fff; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h3 { color: #333; text-align: center; } p { color: #555; text-align: center; margin-bottom: 20px; } a.button { display: block; width: 50%; margin: 20px auto; padding: 12px; border-radius: 5px; text-align: center; text-decoration: none; background-color: #0275d8; color: #fff; font-size: 1rem; transition: background-color 0.3s; } a.button:hover { background-color: #025aa5; } .disclaimer { color: #777; text-align: center; } </style> </head> <body> <div class="container"> <h3>Account Verification</h3> <p>Hi, {{username}}πŸ‘‹. Thank you for registering with Techdocs. Please click the button below to verify your account:</p> <a class="button" href="{{verify_link}}" target="_blank">Verify your email</a> <p class="disclaimer">Please disregard this email if you did not register with Techdocs. Thank you.</p> </div> </body> </html>
 
 
TechdocsAPI/requirements.txt CHANGED
@@ -9,5 +9,3 @@ pydantic[email]
9
  langchain
10
  clarifai
11
  Pillow
12
- fastapi_mail==1.3.1
13
- yagmail
 
9
  langchain
10
  clarifai
11
  Pillow