Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 45 additions & 19 deletions project/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
)
from flask_sqlalchemy import SQLAlchemy


basedir = Path(__file__).resolve().parent

# configuration
Expand All @@ -31,38 +30,29 @@
SQLALCHEMY_DATABASE_URI = url
SQLALCHEMY_TRACK_MODIFICATIONS = False


# create and initialize a new Flask app
app = Flask(__name__)
# load the config
app.config.from_object(__name__)
# init sqlalchemy
db = SQLAlchemy(app)

from project import models


def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not session.get("logged_in"):
flash("Please log in.")
return jsonify({"status": 0, "message": "Please log in."}), 401
return f(*args, **kwargs)

return decorated_function


@app.route("/")
def index():
"""Searches the database for entries, then displays them."""
entries = db.session.query(models.Post)
return render_template("index.html", entries=entries)


@app.route("/add", methods=["POST"])
def add_entry():
"""Adds new post to the database."""
if not session.get("logged_in"):
abort(401)
new_entry = models.Post(request.form["title"], request.form["text"])
Expand All @@ -71,10 +61,8 @@ def add_entry():
flash("New entry was successfully posted")
return redirect(url_for("index"))


@app.route("/login", methods=["GET", "POST"])
def login():
"""User login/authentication/session management."""
error = None
if request.method == "POST":
if request.form["username"] != app.config["USERNAME"]:
Expand All @@ -87,31 +75,25 @@ def login():
return redirect(url_for("index"))
return render_template("login.html", error=error)


@app.route("/logout")
def logout():
"""User logout/authentication/session management."""
session.pop("logged_in", None)
flash("You were logged out")
return redirect(url_for("index"))


@app.route("/delete/<int:post_id>", methods=["GET"])
@login_required
def delete_entry(post_id):
"""Deletes post from database."""
result = {"status": 0, "message": "Error"}
try:
new_id = post_id
db.session.query(models.Post).filter_by(id=new_id).delete()
db.session.query(models.Post).filter_by(id=post_id).delete()
db.session.commit()
result = {"status": 1, "message": "Post Deleted"}
flash("The entry was deleted.")
except Exception as e:
result = {"status": 0, "message": repr(e)}
return jsonify(result)


@app.route("/search/", methods=["GET"])
def search():
query = request.args.get("query")
Expand All @@ -120,6 +102,50 @@ def search():
return render_template("search.html", entries=entries, query=query)
return render_template("search.html")

# === REST API for Notes ===

@app.route("/api/notes", methods=["GET"])
def get_notes():
notes = db.session.query(models.Note).all()
return jsonify([note.to_dict() for note in notes]), 200

@app.route("/api/notes/<int:note_id>", methods=["GET"])
def get_note(note_id):
note = db.session.get(models.Note, note_id)
if note:
return jsonify(note.to_dict()), 200
return jsonify({"error": "Note not found"}), 404

@app.route("/api/notes", methods=["POST"])
def create_note():
data = request.get_json()
if not data or "content" not in data:
return jsonify({"error": "Content is required"}), 400
note = models.Note(content=data["content"])
db.session.add(note)
db.session.commit()
return jsonify(note.to_dict()), 201

@app.route("/api/notes/<int:note_id>", methods=["PUT"])
def update_note(note_id):
note = db.session.get(models.Note, note_id)
if not note:
return jsonify({"error": "Note not found"}), 404
data = request.get_json()
if not data or "content" not in data:
return jsonify({"error": "Content is required"}), 400
note.content = data["content"]
db.session.commit()
return jsonify(note.to_dict()), 200

@app.route("/api/notes/<int:note_id>", methods=["DELETE"])
def delete_note(note_id):
note = db.session.get(models.Note, note_id)
if not note:
return jsonify({"error": "Note not found"}), 404
db.session.delete(note)
db.session.commit()
return jsonify({"message": "Note deleted"}), 200

if __name__ == "__main__":
app.run()
5 changes: 5 additions & 0 deletions project/create_tables.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from app import app, db

with app.app_context():
db.create_all()
print("Tables created successfully.")
Binary file modified project/flaskr.db
Binary file not shown.
11 changes: 11 additions & 0 deletions project/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,14 @@ def __init__(self, title, text):

def __repr__(self):
return f"<title {self.title}>"


class Note(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String, nullable=False)

def __init__(self, content):
self.content = content

def to_dict(self):
return {"id": self.id, "content": self.content}