From 79f8dacd521b2b42c417f9605742eefd558afb51 Mon Sep 17 00:00:00 2001 From: iamBadgers Date: Wed, 29 Apr 2026 22:49:58 -0700 Subject: [PATCH] user creation --- requirements.txt | 1 + src/auth.py | 41 ++++++++++++++++++++++++++++++----------- src/main.py | 2 ++ src/user_model.py | 9 +++++---- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/requirements.txt b/requirements.txt index d091c13..5d08106 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ charset-normalizer==3.4.6 click==8.3.1 docker @ git+https://github.com/docker/docker-py@df3f8e2abc5a03de482e37214dddef9e0cee1bb1 Flask==3.1.3 +Flask-Login==0.6.3 Flask-SQLAlchemy==3.1.1 greenlet==3.4.0 idna==3.11 diff --git a/src/auth.py b/src/auth.py index c46734b..ebf4657 100644 --- a/src/auth.py +++ b/src/auth.py @@ -1,33 +1,52 @@ -from flask import Blueprint +from flask import Blueprint, request, jsonify from user_model import User from main import db +from flask_login import login_user, logout_user +from random import randint auth = Blueprint("auth_api", __name__) -@auth.route("/login") -def login(self): - return +@auth.route("/login", methods=["POST"]) +def login(): + username = request.get_json()["username"] + password = request.get_json()["password"] + + user = User.query.filter_by(user_name=username).first() + + if user and user.test_password(password): + login_user(user) + return None, 200 + + return None, 403 @auth.route("/logout") -def logout(self): +def logout(): return @auth.route("/user") -def get_current_user(self): +def get_current_user(): return @auth.route("/user", methods=["POST"]) -def create_user(self): - return +def create_user(): + username = request.get_json()["username"] + password = request.get_json()["password"] + + user = User(id=randint(0, 999999), user_name=username) + user.set_password(password) + + db.session.add(user) + db.session.commit() + return jsonify(user.to_dict()) @auth.route("/user/", methods=["POST"]) -def update_user(self): +def update_user(): return @auth.route("/user/", methods=["DELETE"]) -def delete_user(self): +def delete_user(): return @auth.route("/user/") -def get_user(self): +def get_user(): return diff --git a/src/main.py b/src/main.py index a38f4a6..405df94 100644 --- a/src/main.py +++ b/src/main.py @@ -20,8 +20,10 @@ def create_app(): db.close() import tables + import auth app.register_blueprint(tables.tables, url_prefix="/api") + app.register_blueprint(auth.auth, url_prefix="/api/auth") with app.app_context(): init_db(get_db()) diff --git a/src/user_model.py b/src/user_model.py index 263856a..ea735d8 100644 --- a/src/user_model.py +++ b/src/user_model.py @@ -1,6 +1,7 @@ from sqlalchemy import Column, ForeignKey, Integer, Table from sqlalchemy.orm import relationship from main import db +from werkzeug.security import generate_password_hash, check_password_hash def create_new_session(user: User) -> Session: return @@ -9,16 +10,16 @@ class User(db.Model): __tablename__ = "users" - user_id = db.Column(db.Integer, primary_key=True) + id = db.Column(db.Integer, primary_key=True) password_hash = db.Column(db.Text) user_name = db.Column(db.Text, unique=True) sessions = relationship("Session", back_populates="user") def set_password(self, newPassword: str): - self.password_hash = "testing" + self.password_hash = generate_password_hash(newPassword) def test_password(self, password: str) -> bool: - return True + return self.check_password_hash(password) def to_dict(self): return {"username": self.user_name} @@ -28,7 +29,7 @@ class Session(db.Model): __tableanme__ = "sessions" session_id = db.Column(db.Text, primary_key=True) - parent_id = db.Column(db.Integer, ForeignKey("users.user_id")) + parent_id = db.Column(db.Integer, ForeignKey("users.id")) issue_timestamp = db.Column(db.Integer) user = relationship("User", back_populates="sessions")