Skip to content

Commit

Permalink
refactored codebase to create auth_controller.py. All control functio…
Browse files Browse the repository at this point in the history
…nality has been removed from view, i.e., main.py
  • Loading branch information
Morgan-Sell committed Nov 17, 2024
1 parent 857d2e9 commit d51add9
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 120 deletions.
68 changes: 68 additions & 0 deletions src/controllers/auth_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from flask import Blueprint, flash, redirect, render_template, url_for
from flask_login import login_required, login_user, logout_user

from src.forms.user_forms import LogInForm, RegisterForm
from src.models import SessionLocal
from src.repository.users_repository import UsersRepository

auth_blueprint = Blueprint("auth", __name__)


@auth_blueprint.route("/")
@auth_blueprint.route("/login", methods=["GET", "POST"])
def login():
form = LogInForm()

if form.validate_on_submit():
username = form.username.data
password = form.password.data

print("Form submitted with:", username, password)
session = SessionLocal()
user_repo = UsersRepository(session)
user = user_repo.find_user_by_username(username)

if user is None:
session.close()
flash("That email does not exist. Please try again.", "danger")
elif not user_repo.check_password(password, user.password_hash):
session.close()
flash("Invalid password. Please try again.", "danger")
else:
login_user(user)
session.close()
return redirect(url_for("tasks.view_tasks", user_id=user.id))

return render_template("login.html", form=form)


@auth_blueprint.route("/logout")
@login_required
def logout():
logout_user()
flash("You have successfully logged out.", "info")
return redirect(url_for("auth.login"))


@auth_blueprint.route("/register", methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data

# create a database session
session = SessionLocal()
user_repo = UsersRepository(session)

if user_repo.find_user_by_username(username) is not None:
flash("Username already exists. Please choose a different one.", "danger")
session.close()
return redirect(url_for("auth.register"))

user_repo.add_user(username, password)
session.close()
flash("Account successfully created. You can now log in.", "success")
return redirect(url_for("auth.login"))

return render_template("register.html", form=form)
5 changes: 3 additions & 2 deletions src/controllers/tasks_controller.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from flask import Blueprint, flash, jsonify, redirect, render_template, url_for
from flask_login import login_required, current_user
from flask_login import current_user, login_required

from src.forms.task_form import AddTaskForm, DeleteTaskForm, EditTaskForm
from src.models import SessionLocal, Tasks
from src.repository.tasks_repository import TasksRespository
Expand Down Expand Up @@ -128,4 +129,4 @@ def get_task_details(task_id):
return (
jsonify({"error": f"Task ID {task_id} does not exist for this user."}),
404,
)
)
41 changes: 0 additions & 41 deletions src/controllers/user_controller.py

This file was deleted.

84 changes: 16 additions & 68 deletions src/main.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from flask import Flask, flash, redirect, render_template, url_for
from flask_login import LoginManager, login_required, login_user, logout_user

from src.forms.user_forms import LogInForm, RegisterForm
from src.models import Base, SessionLocal, Tasks, Users, engine
from src.repository.tasks_repository import TasksRespository
from src.repository.users_repository import UsersRepository
from flask import Flask, redirect, url_for
from flask_login import LoginManager

from src.controllers.auth_controller import auth_blueprint
from src.controllers.tasks_controller import tasks_blueprint
from src.models import Base, SessionLocal, engine
from src.repository.users_repository import UsersRepository

app = Flask(__name__, static_folder="../static", template_folder="../templates")
app.config["SECRET_KEY"] = "shhhh_dont_tell_anyone"
Expand All @@ -20,9 +18,19 @@
# Ensure tables are created
Base.metadata.create_all(bind=engine)

# Register blueprints to for tasks and users controllers
# Register blueprints to for tasks and authentication controllers
app.register_blueprint(auth_blueprint, url_prefix="/auth")
app.register_blueprint(tasks_blueprint, url_prefix="/tasks")


@app.route("/")
def root():
"""
Redirects the root URL - http://127.0.0.1:5001 - to the login page.
"""
return redirect(url_for("auth.login"))


@login_manager.user_loader
def load_user(user_id):
session = SessionLocal()
Expand All @@ -32,65 +40,5 @@ def load_user(user_id):
return user


@app.route("/")
@app.route("/login", methods=["GET", "POST"])
def login():
form = LogInForm()

if form.validate_on_submit():
username = form.username.data
password = form.password.data

print("Form submitted with:", username, password)
session = SessionLocal()
user_repo = UsersRepository(session)
user = user_repo.find_user_by_username(username)

if user is None:
session.close()
flash("That email does not exist. Please try again.", "danger")
elif not user_repo.check_password(password, user.password_hash):
session.close()
flash("Invalid password. Please try again.", "danger")
else:
login_user(user)
session.close()
return redirect(url_for("tasks.view_tasks", user_id=user.id))

return render_template("login.html", form=form)


@app.route("/logout")
@login_required
def logout():
logout_user()
flash("You have successfully logged out.", "info")
return redirect(url_for("login"))


@app.route("/register", methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data

# create a database session
session = SessionLocal()
user_repo = UsersRepository(session)

if user_repo.find_user_by_username(username) is not None:
flash("Username already exists. Please choose a different one.", "danger")
session.close()
return redirect(url_for("register"))

user_repo.add_user(username, password)
session.close()
flash("Account successfully created. You can now log in.", "success")
return redirect(url_for("login"))

return render_template("register.html", form=form)


if __name__ == "__main__":
app.run(debug=True, port=5001)
6 changes: 3 additions & 3 deletions templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="{{ url_for('login') }}">Peak Performer</a>
<a class="navbar-brand" href="{{ url_for('auth.login') }}">Peak Performer</a>
<div class="collapse navbar-collapse">
<ul class="navbar-nav ml-auto">
{% if current_user.is_authenticated %}
Expand All @@ -23,11 +23,11 @@
<a class="dropdown-item" href="{{ url_for('tasks.edit_task', user_id=current_user.id) }}">Edit Task</a>
<a class="dropdown-item" href="{{ url_for('tasks.delete_task', user_id=current_user.id) }}">Delete Task</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{{ url_for('logout') }}">Log Out</a>
<a class="dropdown-item text-danger" href="{{ url_for('auth.logout') }}">Log Out</a>
</div>
</li>
{% else %}
<li class="nav-item"><a class="nav-link" href="{{ url_for('login') }}">Login</a></li>
<li class="nav-item"><a class="nav-link" href="{{ url_for('auth.login') }}">Login</a></li>
{% endif %}
</ul>
</div>
Expand Down
4 changes: 2 additions & 2 deletions templates/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<h2 class="mt-2" style="font-family: 'Brush Script MT', cursive; font-size: 2.5rem; color: #333;">Peak Performer</h2>
<img src="{{ url_for('static', filename='img/climb.png') }}" alt="ToDo List Icon" width="70">
</div>
<form method="POST" action="{{ url_for('login') }}">
<form method="POST" action="{{ url_for('auth.login') }}">
{{ form.hidden_tag() }} <!-- CSRF token -->
<div class="form-group">
<label for="username">Username</label>
Expand All @@ -22,7 +22,7 @@ <h2 class="mt-2" style="font-family: 'Brush Script MT', cursive; font-size: 2.5r
LOGIN
</button>
<p class="text-center mt-3">
Don't have an account? <a href="{{ url_for('register') }}">Sign Up</a>
Don't have an account? <a href="{{ url_for('auth.register') }}">Sign Up</a>
</p>
</form>
<p class="text-center mt-4" style="font-size: 0.9rem; color: #888;">
Expand Down
4 changes: 2 additions & 2 deletions templates/register.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<h2 class="mt-2" style="font-family: 'Brush Script MT', cursive; font-size: 2.5rem; color: #333;">Peak Performer</h2>
<img src="{{ url_for('static', filename='img/climb.png') }}" alt="Climber Icon" width="70">
</div>
<form method="POST" action="{{ url_for('register') }}">
<form method="POST" action="{{ url_for('auth.register') }}">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.username.label }}
Expand All @@ -33,7 +33,7 @@ <h2 class="mt-2" style="font-family: 'Brush Script MT', cursive; font-size: 2.5r
SIGN UP
</button>
<p class="text-center mt-3">
Already have an account? <a href="{{ url_for('login') }}">Login</a>
Already have an account? <a href="{{ url_for('auth.login') }}">Login</a>
</p>
</form>
<p class="text-center mt-4" style="font-size: 0.9rem; color: #888;">
Expand Down
4 changes: 2 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sqlalchemy.orm import sessionmaker

from src.config import TaskStatus
from src.controllers.user_controller import user_blueprint
from src.controllers.auth_controller import auth_blueprint
from src.models import Base, Tasks, Users
from src.repository.tasks_repository import TasksRespository
from src.repository.users_repository import UsersRepository
Expand Down Expand Up @@ -91,7 +91,7 @@ def users_repository(test_db):
@pytest.fixture(scope="function")
def app():
app = Flask(__name__)
app.register_blueprint(user_blueprint)
app.register_blueprint(auth_blueprint)
app.config["TESTING"] = True
return app

Expand Down

0 comments on commit d51add9

Please sign in to comment.