diff --git a/backend/__init__.py b/backend/__init__.py deleted file mode 100644 index fc167974541af2a6f7b12bff44233097b534a487..0000000000000000000000000000000000000000 --- a/backend/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -import os -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_security import Security, SQLAlchemyUserDatastore, auth_required, hash_password -from flask_security.models import fsqla_v3 as fsqla -from flask_login import LoginManager - - -# Create app -app = Flask(__name__) -app.config['DEBUG'] = True - -# Register app blueprints: -from server import default as default_blueprint -app.register_blueprint(default_blueprint) - -from auth import auth as auth_blueprint -app.register_blueprint(auth_blueprint) - -# Define database models: -fsqla.FsModels.set_db_info(db) - -class Role(db.Model, fsqla.FsRoleMixin): - pass - -class User(db.Model, fsqla.FsUserMixin): - pass - -# Define security configurations: -if app.config['DEBUG']: - # Generate a nice key using secrets.token_urlsafe() - app.config['SECRET_KEY'] = os.environ.get("SECRET_KEY", "FaHW65b6vBDGlhazs-8JZHb4jiZvI_9jj6hcUa_EV1Q") - # Bcrypt is set as default SECURITY_PASSWORD_HASH, which requires a salt - # Generate a good salt using: secrets.SystemRandom().getrandbits(128) - app.config['SECURITY_PASSWORD_SALT'] = os.environ.get("SECURITY_PASSWORD_SALT", "327589938147555935984237744799432734422") - - # have session and remember cookie be samesite (flask/flask_login) - app.config["REMEMBER_COOKIE_SAMESITE"] = "strict" - app.config["SESSION_COOKIE_SAMESITE"] = "strict" -else: - # Secrets for the development environment are hard-coded. - # Secrets for production/deployment must be passed securely to the app. - # This can be done using environment variables. - exit("App is not secure, security configurations for production environment must be made") - - -# Database configurations: -# Use an in-memory db -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' -# Create database connection object -db = SQLAlchemy(app) - -# Setup Flask-Security -user_datastore = SQLAlchemyUserDatastore(db, User, Role) -app.security = Security(app, user_datastore) - -login_manager = LoginManager() -login_manager.init_app(app) - -if __name__ == '__main__': - - # Only do this once: - with app.app_context(): - # Create User to test with - db.create_all() - if not app.security.datastore.find_user(email="test@me.com"): - app.security.datastore.create_user(email="test@me.com", password=hash_password("password")) - db.session.commit() - - # Start the app - app.run() \ No newline at end of file diff --git a/backend/app.py b/backend/app.py new file mode 100644 index 0000000000000000000000000000000000000000..98f909a0227961adee0bbdaa4fe574b8f3a35713 --- /dev/null +++ b/backend/app.py @@ -0,0 +1,48 @@ +import os +from flask import Flask +from flask import current_app +from flask_sqlalchemy import SQLAlchemy +from config import Config +from flask_security import Security, SQLAlchemyUserDatastore, auth_required, hash_password +from models import db, User, Role +from flask_security.models import fsqla_v3 as fsqla + +# Create app +app = Flask(__name__) +app.config.from_object(Config) + + +# Define security configurations: +if not app.config['DEBUG']: + exit("App is not secure, security configurations for production environment must be made") + +# Register the blueprints with the app +from server import default as default_blueprint +app.register_blueprint(default_blueprint) + +from auth import auth as auth_blueprint +app.register_blueprint(auth_blueprint) + +# Setup Flask Security +user_datastore = SQLAlchemyUserDatastore(db, User, Role) +app.security = Security(app, user_datastore) + +""" +#login_manager = LoginManager() +#login_manager.init_app(app) +""" + +if __name__ == '__main__': + + with app.app_context(): + # Bind the database to the app + db.init_app(app) + db.create_all() + + if not app.security.datastore.find_user(email="test@me.com"): + app.security.datastore.create_user(email="test@me.com", password=hash_password("test")) + db.session.commit() + + + # Start the app + app.run() \ No newline at end of file diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000000000000000000000000000000000000..0874b841116d44e874dd3073e1562132f8f1b5e1 --- /dev/null +++ b/backend/config.py @@ -0,0 +1,13 @@ +import os + +class Config: + DEBUG = True + # Generate a nice key using secrets.token_urlsafe() + SECRET_KEY = os.environ.get("SECRET_KEY", "FaHW65b6vBDGlhazs-8JZHb4jiZvI_9jj6hcUa_EV1Q") + # Generate a good salt using: secrets.SystemRandom().getrandbits(128) + SECURITY_PASSWORD_SALT = os.environ.get("SECURITY_PASSWORD_SALT", "327589938147555935984237744799432734422") + # have session and remember cookie be samesite (flask/flask_login) + REMEMBER_COOKIE_SAMESITE = "strict" + SESSION_COOKIE_SAMESITE = "strict" + # Use an in-memory db + SQLALCHEMY_DATABASE_URI = 'sqlite://' \ No newline at end of file diff --git a/backend/models.py b/backend/models.py index c4f6f29f733506ce6f0c39940eb1fe3a42856a80..fb4707dc4f42cffc391f57ea2b0ecb146d2cb1da 100644 --- a/backend/models.py +++ b/backend/models.py @@ -1,8 +1,29 @@ -from sqlalchemy import create_engine -from sqlalchemy import Column -from sqlalchemy import Integer, String, text -from sqlalchemy.orm import Mapped, mapped_column -from sqlalchemy.orm import DeclarativeBase, sessionmaker +from flask_sqlalchemy import SQLAlchemy +from flask_security.models import fsqla_v3 as fsqla +db = SQLAlchemy() +# Set up Flask-Security with the User and Role models +fsqla.FsModels.set_db_info(db) +class Role(db.Model, fsqla.FsRoleMixin): + pass + +class User(db.Model, fsqla.FsUserMixin): + pass + +""" +class Users(Base): + __tablename__="users" + + id: Mapped[int] = mapped_column(primary_key = True) + name: Mapped[str] = mapped_column(String(50)) + email: Mapped[str] = mapped_column(String(120), unique=True) + + def __init__(self, name=None, email=None): + self.name = name + self.email = email + + def __repr__(self): + return f"<Users(id={self.id}, name={self.name})>" +""" diff --git a/backend/server.py b/backend/server.py index 109442c8581dce5dce185bf58f3ceb36697c9abb..3090dde4eb71cb949db477fe4437f2e2a139a4a7 100755 --- a/backend/server.py +++ b/backend/server.py @@ -1,18 +1,19 @@ -from flask import Flask, Blueprint - -app = Flask(__name__) +from models import db, User +from flask import Blueprint, jsonify default = Blueprint("default", __name__) @default.route("/") -def homepage(): - return "abc" - - -if __name__ == '__main__': - app.debug = True - app.run() - +def test_retrieve_user(): + + user = db.session.query(User).filter_by(email="test@me.com").first() + + # Check if the user exists + if user: + # Return user details as JSON response + return jsonify({'email': user.email}) + else: + return "User not found", 404