72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
from fastapi import APIRouter, HTTPException, status, Request
|
|
from fastapi.templating import Jinja2Templates
|
|
from ..dependencies import users_token, database, mail
|
|
from ..models import users, email
|
|
from fastapi.responses import JSONResponse, HTMLResponse
|
|
from fastapi_mail import MessageSchema, MessageType, FastMail
|
|
import random, os
|
|
router = APIRouter()
|
|
|
|
|
|
# Assurer que le chemin vers "templates" est correct
|
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
templates = Jinja2Templates(directory=os.path.join(BASE_DIR, "templates"))
|
|
|
|
|
|
@router.post("/mail",tags=["mail"])
|
|
async def create_user(userSingle: users.UserCreate | None = None):
|
|
if userSingle is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Body request is empty"
|
|
)
|
|
user_repository = users.UserRepository(database=database.database)
|
|
user = user_repository.find_one_by({"$or": [{"username": {'$eq': userSingle.username}},{"email": {"$eq": userSingle.email}}] })
|
|
if user is not None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_204_NO_CONTENT,
|
|
detail="User already exists"
|
|
)
|
|
|
|
fm = FastMail(mail.conf)
|
|
numberkey = str(random.Random())
|
|
key_hashed = users_token.get_password_hash(numberkey)
|
|
email_body = {"key":key_hashed, "username":userSingle.username}
|
|
email_schema = email.EmailSchema(email=[userSingle.email], body=email_body)
|
|
message = MessageSchema(
|
|
subject="Fastapi-Mail module",
|
|
recipients=email_schema.dict().get("email"),
|
|
template_body=email_schema.dict().get("body"),
|
|
subtype=MessageType.html,
|
|
)
|
|
|
|
await fm.send_message(message, template_name="mailer.html")
|
|
current_user = users.User(username=userSingle.username, password=users_token.get_password_hash(userSingle.password), email=userSingle.email, name=userSingle.name, firstName=userSingle.firstName)
|
|
current_user.status = 0
|
|
user_repository.save(current_user)
|
|
database.connect_redis.set(userSingle.username, key_hashed)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content={"message": "email has been sent"})
|
|
|
|
@router.get("/mail", tags=["mail"])
|
|
async def confirm_user(request: Request, key: str | None = None, username: str | None = None):
|
|
if key is None or username is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Parameter key or/and username is empty"
|
|
)
|
|
|
|
user_repository = users.UserRepository(database=database.database)
|
|
user = user_repository.find_one_by({"username": {'$eq': username}})
|
|
key_hashed = database.connect_redis.get(username)
|
|
|
|
if key_hashed != key:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Key is invalid"
|
|
)
|
|
|
|
user.status = 1
|
|
user_repository.save(user)
|
|
|
|
# Rendre la page HTML avec Jinja2 et passer la variable username
|
|
return templates.TemplateResponse("confirm.html", {"request": request, "username": username}) |