diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..4bb51fb --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "Bash(git add *)", + "Bash(git commit *)" + ] + } +} diff --git a/app/__init__.py b/app/__init__.py index e69de29..19b0ccc 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -0,0 +1,29 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager +from flask_migrate import Migrate +from config import Config + +db = SQLAlchemy() +login_manager = LoginManager() +migrate = Migrate() + +def create_app(config_class=Config): + app = Flask(__name__) + app.config.from_object(config_class) + + db.init_app(app) + login_manager.init_app(app) + migrate.init_app(app, db) + + login_manager.login_view = "auth.login" + login_manager.login_message_category = "info" + + from app.auth.routes import auth_bp + from app.main.routes import main_bp + app.register_blueprint(auth_bp, url_prefix="/auth") + app.register_blueprint(main_bp) + + from app import models # noqa: F401 — registers models with SQLAlchemy + + return app diff --git a/app/models.py b/app/models.py index e69de29..ca652b5 100644 --- a/app/models.py +++ b/app/models.py @@ -0,0 +1,24 @@ +from datetime import datetime +from flask_login import UserMixin +from werkzeug.security import generate_password_hash, check_password_hash +from app import db, login_manager + +class User(UserMixin, db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(64), unique=True, nullable=False) + email = db.Column(db.String(120), unique=True, nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + def set_password(self, password): + self.password_hash = generate_password_hash(password) + + def check_password(self, password): + return check_password_hash(self.password_hash, password) + + def __repr__(self): + return f"" + +@login_manager.user_loader +def load_user(user_id): + return User.query.get(int(user_id)) diff --git a/config.py b/config.py index e69de29..b1865b4 100644 --- a/config.py +++ b/config.py @@ -0,0 +1,9 @@ +import os +from dotenv import load_dotenv + +load_dotenv() + +class Config: + SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key-not-safe") + SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db") + SQLALCHEMY_TRACK_MODIFICATIONS = False diff --git a/run.py b/run.py index e69de29..fe05d46 100644 --- a/run.py +++ b/run.py @@ -0,0 +1,6 @@ +from app import create_app + +app = create_app() + +if __name__ == "__main__": + app.run()