-
Notifications
You must be signed in to change notification settings - Fork 36
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Spruce - Symone B. & Ngozi A. #26
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great work Symone and Ngozi! My primary feedback focused on helper functions and ways to refactor. :)
db.init_app(app) | ||
migrate.init_app(app, db) | ||
|
||
from app.models.planet import Planet |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The blueprints already import the models so we don't actually need the model import in this file anymore.
class Planet(db.Model): | ||
id = db.Column(db.Integer, primary_key=True, autoincrement=True) | ||
name = db.Column(db.String) | ||
description = db.Column(db.String) | ||
color = db.Column(db.String) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Careful! Using the class as it currently is, we'd be able to make a planet with a null name, description, and color. I do see in the POST
request that y'all checked for falsy values for name, description, and color, however, null values can still be inserted manually using SQL. When making classes in the future, consider which columns are required (non-nullable).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, I highly recommend adding a helper method to turn planet instances into a dictionary. In class, Ansel has named this method to_dict()
. This will definitely save you from writing a few lines of code down the road)!
planets_bp = Blueprint("planets", __name__, url_prefix="/planets") | ||
|
||
|
||
@planets_bp.route("", methods=["GET", "POST"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider separating each request method into its different functions. This makes testing the endpoints much easier to do and follows the single responsibility principle.
planets_response = [] | ||
for planet in planets: | ||
planets_response.append({ | ||
"id": planet.id, | ||
"name": planet.name, | ||
"description": planet.description, | ||
"color": planet.color | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could reduce these lines of code using a helper method to turn the planet object into a dictionary in the Planets class:
planets_response = [] | |
for planet in planets: | |
planets_response.append({ | |
"id": planet.id, | |
"name": planet.name, | |
"description": planet.description, | |
"color": planet.color | |
}) | |
planets_response = [] | |
for planet in planets: | |
planets_response.append(planet.to_dict()) |
And further refactor using a list comprehension :D
planets_response = [] | |
for planet in planets: | |
planets_response.append({ | |
"id": planet.id, | |
"name": planet.name, | |
"description": planet.description, | |
"color": planet.color | |
}) | |
planets_response = [ planets_response.append(planet.to_dict()) for planet in planets ] | |
return jsonify(f"Planet {new_planet.name} successfully created"), 201 | ||
|
||
|
||
@planets_bp.route("/<planet_id>", methods=["GET", "PUT", "DELETE"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See comment about separating request methods into different functions for GET/POST
return { | ||
"id": planet.id, | ||
"name": planet.name, | ||
"description": planet.description, | ||
"color": planet.color | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The to_dict()
method would be handy here
"color": planet.color | ||
} | ||
|
||
elif request.method == "PUT": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
db.session.commit() | ||
return jsonify(f"Planet {planet.name} successfully updated"), 200 | ||
|
||
elif request.method == "DELETE": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
|
||
db.session.add_all([planet_1, planet_2]) | ||
db.session.commit() | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider returning [planet_1, and planet_2] after this line, so that tests can make use of the attributes of the records (like the id or name of planet)
response = client.post("/planets", json = ({"name": "Unique Space Rock", "description": "Super somber place in the universe.", "color": "The greyest Grey"})) | ||
response_body = response.get_json() | ||
assert response.status_code == 201 | ||
assert response_body == f"Planet Unique Space Rock successfully created" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could tweak the POST
requests in routes.py
so that we can return a dictionary of the actual record that was added (just to ensure that all the attributes were valid and added).
We could perform a Planet.query.get
call to retrieve the record from the database to confirm that it was actually added.
No description provided.