Skip to content

Commit

Permalink
chore: refactored implementation and added samples for user endpoint
Browse files Browse the repository at this point in the history
Co-authored-by: Trisha Reddy <105570654+trishavreddy@users.noreply.github.com>
  • Loading branch information
bliutech and trishavreddy committed Jul 12, 2023
1 parent d398937 commit b4e6fda
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 67 deletions.
37 changes: 25 additions & 12 deletions server/app.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,41 @@
#!/usr/bin/env python3
import os

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

import config

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = config.DATABASE_URI
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
import routes.user as user

basedir = os.path.abspath(os.path.dirname(__file__))

db = SQLAlchemy(app)
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(
basedir, config.DATABASE_NAME
)
db = SQLAlchemy(app=app)


# debugging endpoint
@app.route("/api", methods=["GET", "POST", "PUT", "DELETE"])
def api():
data = request.get_json()
# data =
def api_handler():
data = request.json
print(data)
return jsonify(data)


@app.route("/api/user/<id>", methods=["GET", "POST", "PUT", "DELETE"])
def user(id):
return user.router()
# user endpoint
@app.route("/api/user", defaults={"id": None}, methods=["POST"])
@app.route("/api/user/<id>", methods=["GET", "PUT", "DELETE"])
def user_handler(id):
return user.router(id)


if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)
with app.app_context():
from models.user import User

db.metadata._add_table(User.__tablename__, None, User.__table__)
db.create_all()

app.run(host="0.0.0.0", port=5000, debug=True)
2 changes: 1 addition & 1 deletion server/config.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
DATABASE_URI = "sqlite:///sqlite.db"
DATABASE_NAME = "sqlite.db"
10 changes: 0 additions & 10 deletions server/models/__init__.py

This file was deleted.

18 changes: 17 additions & 1 deletion server/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,32 @@
class User(db.Model):
__tablename__ = "users"

username = db.Column(db.String(80), unique=True, nullable=False, primary_key=True)
_count = 0

id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(80), nullable=False)

def __init__(self, username, password):
# account for existing users before class is first initialized
count = db.session.query(self.__class__).count()
if count != 0:
User._count = count

# initialze the user
self.id = User._count
self.username = username
self.password = password

# increment the count to track user ids
User._count += 1

def __repr__(self):
return "<User %r>" % self.username

def json(self):
return {"id": self.id, "username": self.username}

def save_to_db(self):
db.session.add(self)
db.session.commit()
Expand Down
4 changes: 2 additions & 2 deletions server/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
black==23.3.0
black==23.7.0
blinker==1.6.2
click==8.1.3
click==8.1.4
Flask==2.3.2
Flask-SQLAlchemy==3.0.5
itsdangerous==2.1.2
Expand Down
131 changes: 90 additions & 41 deletions server/routes/user.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,106 @@
#!/usr/bin/env python3
from flask import jsonify, request

from models.user import User

def router():

# user router
def router(id):
if request.method == "GET":
return get()
return get(id)
if request.method == "POST":
return post()
if request.method == "PUT":
return put()
return put(id)
if request.method == "DELETE":
return delete()
return jsonify(), 500
return delete(id)

res = {"status": "Unsupported HTTP request method."}

def get():
# getting user
return jsonify(res), 500

users = User.query.all()
return jsonify([user.serialize() for user in users])

# retrieve user from database by id
def get(id):
if id is None:
res = {"status": "User ID required."}
return jsonify(res), 400

def post():
# creating user
res = {"status": ""}

from app import app, db

with app.app_context():
users = []

if id == "all":
users = db.session.query(User).all()
else:
users = db.session.query(User).filter_by(id=id).all()

if len(users) == 0:
res["status"] = "User not found."
return jsonify(res), 404

res["users"] = [user.json() for user in users]

data = request.get_json()
return jsonify(res), 200


# create user
def post():
data = request.json
username = data.get("username")
password = data.get("password")
new_user = User(username=username, password=password)
db.session.add(new_user)
db.session.commit()
return jsonify(new_user.serialize()), 201


def put(user_id):
# updating user

user = User.query.get(user_id)
if user:
data = request.get_json()
user.username = data.get("username")
user.password = data.get("password")
db.session.commit()
return jsonify(user.serialize())
return jsonify({"message": "User not found"}), 404


def delete(user_id):
# deleting user

user = User.query.get(user_id)
if user:
db.session.delete(user)
db.session.commit()
return jsonify({"message": "User deleted"})
return jsonify({"message": "User not found"}), 404

res = {"status": ""}

if username is None or password is None:
res["status"] = "Both `username` and `password` are required."
return jsonify(res), 400

from app import app, db

with app.app_context():
user = db.session.query(User).filter_by(username=username).first()

if user is not None:
res["status"] = "User already exists."
return jsonify(res), 409

new_user = User(username=username, password=password)
new_user.save_to_db()

res["status"] = "User created."
res["user"] = new_user.json()

return jsonify(res), 201


# update user
def put(id):
res = {"status": ""}

# user = User.query.get(user_id)
# if user:
# data = request.get_json()
# user.username = data.get("username")
# user.password = data.get("password")
# db.session.commit()
# return jsonify(user.serialize())

res["status"] = "User not found."
return jsonify(res), 404


# delete user
def delete(id):
res = {"status": ""}

# user = User.query.get(user_id)
# if user:
# db.session.delete(user)
# db.session.commit()
# return jsonify({"message": "User deleted"})

res["status"] = "User not found."
return jsonify(res), 404

0 comments on commit b4e6fda

Please sign in to comment.