from fastapi import APIRouter, HTTPException, status from ..dependencies import users_token, database, mail from ..models import users, email from fastapi.responses import JSONResponse from fastapi_mail import MessageSchema, MessageType, FastMail import random router = APIRouter() @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 is already exist" ) 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) 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(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.confirmed = True user_repository.save(user) return JSONResponse(status_code=status.HTTP_200_OK, content={"message": "user account confirmed"})