From 93a5cc6eed7684fab0d7df792a265dc275fb5b54 Mon Sep 17 00:00:00 2001 From: Kushal Dotel Date: Sat, 11 Jan 2025 16:18:22 +0545 Subject: [PATCH] feat: user registration --- backend/app.py | 4 ++ backend/blueprints/profile/__init__.py | 85 +++++++++++++++++++++++-- backend/config.py | 4 +- backend/uploads/1.jpg | Bin 0 -> 27745 bytes 4 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 backend/uploads/1.jpg diff --git a/backend/app.py b/backend/app.py index f123cff..a0f403b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -15,7 +15,11 @@ from utils.utils import random_string_generator, hash_string from blueprints.profile import profile as profileBlueprint app = Flask(__name__) +# Set configuration directly on the app instance +app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'} + app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI + db.init_app(app) app.register_blueprint(profileBlueprint, url_prefix='/api') diff --git a/backend/blueprints/profile/__init__.py b/backend/blueprints/profile/__init__.py index 83b5beb..4819db6 100644 --- a/backend/blueprints/profile/__init__.py +++ b/backend/blueprints/profile/__init__.py @@ -1,7 +1,84 @@ -from flask import Blueprint +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__) -@profile.route('/profile') -def get_profile(): - return "Profile Page" \ No newline at end of file +# 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 diff --git a/backend/config.py b/backend/config.py index 50abd11..692ecdc 100644 --- a/backend/config.py +++ b/backend/config.py @@ -20,4 +20,6 @@ PROJECT_ROOT: os.path = os.path.dirname(os.path.abspath(__file__)) USER_UPLOADS_DIR: str = os.path.join(PROJECT_ROOT, "uploads") DB_URI: str = f"{DB_ENGINE}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" -ACTIVATE_ACCOUNTS_ON_SIGNUP: bool = True \ No newline at end of file +ACTIVATE_ACCOUNTS_ON_SIGNUP: bool = True + +os.makedirs(USER_UPLOADS_DIR, exist_ok=True) \ No newline at end of file diff --git a/backend/uploads/1.jpg b/backend/uploads/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1960252cbd73812295713af6b0547f345f39f01a GIT binary patch literal 27745 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 QP+7_I4(7dHpo>5M*@6rkod5s; literal 0 HcmV?d00001