update emails and verifing
This commit is contained in:
+26
-10
@@ -1,12 +1,12 @@
|
|||||||
from database import execute, fetch_one
|
from database import execute, fetch_one
|
||||||
import bcrypt
|
import bcrypt
|
||||||
from jose import jwt, JWTError
|
from jose import jwt
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from fastapi import Header, HTTPException
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
import os
|
||||||
from fastapi import Depends, HTTPException
|
from fastapi import Depends
|
||||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||||
|
from email_service import create_verification, send_verification_email
|
||||||
|
|
||||||
security = HTTPBearer()
|
security = HTTPBearer()
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
@@ -30,7 +30,7 @@ def create_token(user_id):
|
|||||||
return token
|
return token
|
||||||
|
|
||||||
|
|
||||||
def create_user(username, password):
|
def create_user(username, password, email):
|
||||||
|
|
||||||
password_hash = bcrypt.hashpw(
|
password_hash = bcrypt.hashpw(
|
||||||
password.encode(),
|
password.encode(),
|
||||||
@@ -39,15 +39,30 @@ def create_user(username, password):
|
|||||||
|
|
||||||
user_id = execute(
|
user_id = execute(
|
||||||
"""
|
"""
|
||||||
INSERT INTO users (username, password_hash)
|
INSERT INTO users (
|
||||||
VALUES (?, ?)
|
username,
|
||||||
|
password_hash,
|
||||||
|
email,
|
||||||
|
email_verified
|
||||||
|
)
|
||||||
|
VALUES (?, ?, ?, 0)
|
||||||
""",
|
""",
|
||||||
(username, password_hash)
|
(
|
||||||
|
username,
|
||||||
|
password_hash,
|
||||||
|
email,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
token = create_verification(user_id)
|
||||||
|
|
||||||
|
send_verification_email(
|
||||||
|
email,
|
||||||
|
token,
|
||||||
)
|
)
|
||||||
|
|
||||||
return user_id
|
return user_id
|
||||||
|
|
||||||
|
|
||||||
def verify_user(username, password):
|
def verify_user(username, password):
|
||||||
|
|
||||||
user = fetch_one(
|
user = fetch_one(
|
||||||
@@ -80,10 +95,11 @@ def get_current_user(
|
|||||||
|
|
||||||
return payload["user_id"]
|
return payload["user_id"]
|
||||||
|
|
||||||
|
|
||||||
def get_user(user_id):
|
def get_user(user_id):
|
||||||
return fetch_one(
|
return fetch_one(
|
||||||
"""
|
"""
|
||||||
SELECT id, username
|
SELECT id, username, email, email_verified
|
||||||
FROM users
|
FROM users
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
""",
|
""",
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ def send_verification_email(email: str, token: str):
|
|||||||
raise RuntimeError("SMTP configuration is incomplete")
|
raise RuntimeError("SMTP configuration is incomplete")
|
||||||
|
|
||||||
verification_url = (
|
verification_url = (
|
||||||
f"https://jouwdomein.nl/verify-email?token={token}"
|
f"https://ben.de-roo.org/verify-email?token={token}"
|
||||||
)
|
)
|
||||||
|
|
||||||
message = EmailMessage()
|
message = EmailMessage()
|
||||||
|
|||||||
+5
-2
@@ -82,6 +82,7 @@ class Login(BaseModel):
|
|||||||
class UserCreate(BaseModel):
|
class UserCreate(BaseModel):
|
||||||
username: str
|
username: str
|
||||||
password: str
|
password: str
|
||||||
|
email: EmailStr
|
||||||
|
|
||||||
|
|
||||||
class EventCreate(BaseModel):
|
class EventCreate(BaseModel):
|
||||||
@@ -173,24 +174,26 @@ def database_status(
|
|||||||
@app.post(
|
@app.post(
|
||||||
"/create-user",
|
"/create-user",
|
||||||
summary="Create a user",
|
summary="Create a user",
|
||||||
description="Creates a new user account. The username must be unique.",
|
description="Creates a new user account and sends an email verification link. Usernames should be unique",
|
||||||
)
|
)
|
||||||
def api_create_user(user: UserCreate):
|
def api_create_user(user: UserCreate):
|
||||||
try:
|
try:
|
||||||
user_id = create_user(
|
user_id = create_user(
|
||||||
user.username,
|
user.username,
|
||||||
user.password,
|
user.password,
|
||||||
|
user.email,
|
||||||
)
|
)
|
||||||
|
|
||||||
except sqlite3.IntegrityError:
|
except sqlite3.IntegrityError:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=409,
|
status_code=409,
|
||||||
detail="username already exists",
|
detail="username or email already exists",
|
||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"status": "created",
|
"status": "created",
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
|
"email_verification": "sent",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user