diff --git a/app/__init__.py b/app/__init__.py index 6c3fb29..962ebc1 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,18 +1,30 @@ from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager + +db = SQLAlchemy() +login_manager = LoginManager() def create_app(): app = Flask(__name__) - # Basic config + app.config["SQLALCHEMY_DATABASE_URI"] = "" app.config["SECRET_KEY"] = "dev-secret-key" - # # ---- Register Blueprints (Routes) ---- - # from .routes.auth_routes import auth_bp - # from .routes.solver_routes import solver_bp + db.init_app(app) + login_manager.init_app(app) + login_manager.login_view = "login.login" + + from .models.user import User + + @login_manager.user_loader + def load_user(user_id): + return db.session.get(User, int(user_id)) + + from .routes.login_routes import login_bp from .routes.main_routes import main_bp - # app.register_blueprint(auth_bp) - # app.register_blueprint(solver_bp) + app.register_blueprint(login_bp) app.register_blueprint(main_bp) return app diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..2e91d73 Binary files /dev/null and b/app/__pycache__/__init__.cpython-311.pyc differ diff --git a/app/models/__pycache__/user.cpython-311.pyc b/app/models/__pycache__/user.cpython-311.pyc new file mode 100644 index 0000000..656c1fa Binary files /dev/null and b/app/models/__pycache__/user.cpython-311.pyc differ diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..106078a --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,14 @@ +from .. import db +from flask_login import UserMixin + +class User(UserMixin, db.Model): + __tablename__ = "users" + + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(20), unique=True, nullable=False) + password = db.Column(db.String(255), nullable=False) # <- größer! + email = db.Column(db.String(120), unique=True, nullable=False) + created_at = db.Column(db.DateTime, server_default=db.func.now()) + + def __repr__(self): + return f"" diff --git a/app/routes/__pycache__/login_routes.cpython-311.pyc b/app/routes/__pycache__/login_routes.cpython-311.pyc new file mode 100644 index 0000000..0e5e154 Binary files /dev/null and b/app/routes/__pycache__/login_routes.cpython-311.pyc differ diff --git a/app/routes/__pycache__/main_routes.cpython-311.pyc b/app/routes/__pycache__/main_routes.cpython-311.pyc new file mode 100644 index 0000000..3c156e5 Binary files /dev/null and b/app/routes/__pycache__/main_routes.cpython-311.pyc differ diff --git a/app/routes/login_routes.py b/app/routes/login_routes.py new file mode 100644 index 0000000..a7143d7 --- /dev/null +++ b/app/routes/login_routes.py @@ -0,0 +1,49 @@ +from flask import Blueprint, render_template, request, url_for, redirect +from werkzeug.security import generate_password_hash, check_password_hash +from flask_login import login_user +from ..models.user import User +from .. import db + +login_bp = Blueprint("login", __name__) + +@login_bp.route("/register", methods=["GET", "POST"]) +def register(): + if request.method == "POST": + username = request.form.get("username") + password = request.form.get("password") + email = request.form.get("email") + + if User.query.filter_by(username=username).first(): + return render_template("sign_up.html", error="Username already taken!") + + hashed_password = generate_password_hash(password) + + new_user = User( + username=username, + password=hashed_password, + email=email + ) + + db.session.add(new_user) + db.session.commit() + + return redirect(url_for("login.login")) + + return render_template("sign_up.html") + + +@login_bp.route("/login", methods=["GET", "POST"]) +def login(): + if request.method == "POST": + username = request.form.get("username") + password = request.form.get("password") + + user = User.query.filter_by(username=username).first() + + if user and check_password_hash(user.password, password): + login_user(user) + return redirect(url_for("main.dashboard")) + + return render_template("login.html", error="Invalid username or password") + + return render_template("login.html") diff --git a/app/templates/login.html b/app/templates/login.html new file mode 100644 index 0000000..419978c --- /dev/null +++ b/app/templates/login.html @@ -0,0 +1,41 @@ + + + + + + + Login + + + + + +

Login to your account

+ + {% if error %} +

{{ error }}

+ {% endif %} + +
+ + + + + +
+ + + \ No newline at end of file diff --git a/app/templates/sign_up.html b/app/templates/sign_up.html new file mode 100644 index 0000000..09e9a04 --- /dev/null +++ b/app/templates/sign_up.html @@ -0,0 +1,41 @@ + + + + + + + Sign Up + + + + + +

Create an account

+ + {% if error %} +

{{ error }}

+ {% endif %} + +
+ + + + + +
+ + + \ No newline at end of file diff --git a/database_setup.sql b/database_setup.sql new file mode 100644 index 0000000..e1be1a2 --- /dev/null +++ b/database_setup.sql @@ -0,0 +1,7 @@ +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(20) NOT NULL UNIQUE, + password VARCHAR(80) NOT NULL, + email VARCHAR(120) NOT NULL UNIQUE, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); diff --git a/requirements.txt b/requirements.txt index 4732092..e18447d 100644 Binary files a/requirements.txt and b/requirements.txt differ