|
|
|
from email.policy import default
|
|
|
|
from flask import Blueprint, request, jsonify, current_app
|
|
|
|
from werkzeug.utils import secure_filename
|
|
|
|
from datetime import datetime
|
|
|
|
from db.model import db
|
|
|
|
from db.model import User, UserRole # Adjust based on your model's location
|
|
|
|
from werkzeug.security import generate_password_hash
|
|
|
|
import uuid
|
|
|
|
import os
|
|
|
|
from config import *
|
|
|
|
|
|
|
|
profile = Blueprint('profile', __name__)
|
|
|
|
|
|
|
|
# Function to check allowed file extensions
|
|
|
|
def allowed_file(filename):
|
|
|
|
"""Check if the uploaded file has an allowed extension."""
|
|
|
|
return '.' in filename and filename.rsplit('.', 1)[1].lower() in current_app.config['ALLOWED_EXTENSIONS']
|
|
|
|
|
|
|
|
@profile.route('/register', methods=['POST'])
|
|
|
|
def register():
|
|
|
|
"""Handle user registration."""
|
|
|
|
data = request.form
|
|
|
|
|
|
|
|
# Extract form data
|
|
|
|
email = data.get('email')
|
|
|
|
first_name = data.get('firstName')
|
|
|
|
last_name = data.get('lastName')
|
|
|
|
username = data.get('username')
|
|
|
|
password = data.get('password')
|
|
|
|
bio = data.get('bio', '')
|
|
|
|
dob = data.get('dob') # Optional field for date of birth
|
|
|
|
role = int(data.get('role', UserRole.USER.value)) # Default to 'USER' role if not provided
|
|
|
|
is_activated = True # New user will be activated initially
|
|
|
|
profile_picture = request.files.get('profile_picture')
|
|
|
|
|
|
|
|
# Validate required fields
|
|
|
|
if not all([email, first_name, last_name, username, password]):
|
|
|
|
return jsonify({"error": "Missing required fields"}), 400
|
|
|
|
|
|
|
|
# Check if the file is allowed and save it
|
|
|
|
if profile_picture and allowed_file(profile_picture.filename):
|
|
|
|
filename = secure_filename(profile_picture.filename)
|
|
|
|
# file_path = os.path.join(USER_UPLOADS_DIR, filename)
|
|
|
|
profile_picture.save(
|
|
|
|
os.path.join(USER_UPLOADS_DIR, filename)
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
filename = DEFAULT_PROFILE_FILE # Use a default image if no file is uploaded
|
|
|
|
# Hash the password
|
|
|
|
hashed_password = generate_password_hash(password)
|
|
|
|
|
|
|
|
# Generate activation key (a UUID for example)
|
|
|
|
activation_key = str(uuid.uuid4())
|
|
|
|
|
|
|
|
# Create a new user
|
|
|
|
new_user = User(
|
|
|
|
email=email,
|
|
|
|
firstName=first_name,
|
|
|
|
lastName=last_name,
|
|
|
|
username=username,
|
|
|
|
hash_password=hashed_password,
|
|
|
|
bio=bio,
|
|
|
|
dob=datetime.fromisoformat(dob) if dob else datetime(2002, 1, 1),
|
|
|
|
pfpFilename=filename,
|
|
|
|
role=role,
|
|
|
|
isActivated=is_activated,
|
|
|
|
activationKey=activation_key,
|
|
|
|
sessions=[],
|
|
|
|
user_badges=[],
|
|
|
|
enrollments=[],
|
|
|
|
quizzes=[],
|
|
|
|
quiz_attempts=[],
|
|
|
|
chats=[],
|
|
|
|
notifications=[]
|
|
|
|
)
|
|
|
|
|
|
|
|
# Save the user to the database
|
|
|
|
try:
|
|
|
|
db.session.add(new_user)
|
|
|
|
db.session.commit()
|
|
|
|
return jsonify({"message": "User registered successfully. Please check your email to activate your account."}), 201
|
|
|
|
except Exception as e:
|
|
|
|
db.session.rollback()
|
|
|
|
return jsonify({"error": "Registration failed, please try again later."}), 500
|