From 41d95b5b5dc124abb4dbe51a8fff9b7275d512ec Mon Sep 17 00:00:00 2001 From: minhnp2 Date: Fri, 28 Oct 2022 17:19:31 -0500 Subject: [PATCH] Split code to be more readable --- src/backend/app.py | 91 ++++++++++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/src/backend/app.py b/src/backend/app.py index c51ed8096..dd4094dae 100644 --- a/src/backend/app.py +++ b/src/backend/app.py @@ -1,9 +1,12 @@ """ This is a module docstring """ import json import dataclasses +from collections import namedtuple +from werkzeug.datastructures import MultiDict from flask import Flask, request from login import Login from mainpage import MainPage + # from logging import FileHandler, WARNING app = Flask(__name__) @@ -33,51 +36,77 @@ def register(): return result.message, 400 return result.message, 200 + @app.route("/", methods=["POST", "GET"]) @app.route("/main", methods=["POST", "GET"]) def mainpage(): """Handle mainpage requests""" - mainpage = MainPage() + mainpage_obj = MainPage() if request.method == "POST": - apt_id = request.json["apt_id"] - username = request.json["username"] - comment = request.json["comment"] - vote = request.json["vote"] - query_result = "" - if None not in (apt_id, username, comment, vote): - reviews = mainpage.write_apartment_review(apt_id, username, comment, vote) - reviews_dict = [dataclasses.asdict(review) for review in reviews] - query_result = json.dumps(reviews_dict) - return query_result, 201 if len(query_result) != 0 else query_result, 400 - + return mainpage_post(mainpage_obj) + args = request.args - is_search = args.get("search") - is_populate = args.get("populate") - is_review = args.get("review") - is_pictures = args.get("pictures") - num_apts = args.get("numApts", type=int) - apt_id = args.get("aptId", default=0, type=int) - search_query = args.get("searchQuery", type=str) - price_sort = args.get("priceSort", type=int) - rating_sort = args.get("ratingSort", type=int) + return mainpage_get(mainpage_obj, args) + + +def mainpage_get(mainpage_obj: MainPage, args: MultiDict): + """Helper for mainpage get requests""" + action_type = namedtuple( + "action_type", ["is_search", "is_populate", "is_review", "is_pictures"] + ) + action = action_type( + args.get("search"), + args.get("populate"), + args.get("review"), + args.get("pictures"), + ) + + params = namedtuple( + "params", ["num_apts", "apt_id", "search_query", "price_sort", "rating_sort"] + ) + param = params( + args.get("numApts", type=int), + args.get("aptId", default=0, type=int), + args.get("searchQuery", type=str), + args.get("priceSort", type=int), + args.get("ratingSort", type=int), + ) + query_result = "" - if is_search is not None and search_query is not None: - query_result = json.dumps(mainpage.search_apartments(search_query)) - elif is_populate is not None and num_apts is not None: + if action.is_search is not None and param.search_query is not None: + query_result = json.dumps(mainpage_obj.search_apartments(param.search_query)) + elif action.is_populate is not None and param.num_apts is not None: apts = [] - if price_sort is not None and rating_sort is not None: - apts = mainpage.apartments_sorted(num_apts, price_sort, rating_sort) + if param.price_sort is not None and param.rating_sort is not None: + apts = mainpage_obj.apartments_sorted( + param.num_apts, param.price_sort, param.rating_sort + ) else: - apts = mainpage.apartments_default(num_apts) + apts = mainpage_obj.apartments_default(param.num_apts) apts_dict = [dataclasses.asdict(apt) for apt in apts] query_result = json.dumps(apts_dict) - elif is_review is not None and apt_id is not None: - reviews = mainpage.get_apartments_reviews(apt_id) + elif action.is_review is not None and param.apt_id is not None: + reviews = mainpage_obj.get_apartments_reviews(param.apt_id) reviews_dict = [dataclasses.asdict(review) for review in reviews] query_result = json.dumps(reviews_dict) - elif is_pictures is not None and apt_id is not None: - query_result = json.dumps(mainpage.get_apartments_pictures(apt_id)) + elif action.is_pictures is not None and param.apt_id is not None: + query_result = json.dumps(mainpage_obj.get_apartments_pictures(param.apt_id)) return query_result, 200 if len(query_result) != 0 else query_result, 400 + +def mainpage_post(mainpage_obj: MainPage): + """Helper for mainpage post requests""" + apt_id = request.json["apt_id"] + username = request.json["username"] + comment = request.json["comment"] + vote = request.json["vote"] + query_result = "" + if None not in (apt_id, username, comment, vote): + reviews = mainpage_obj.write_apartment_review(apt_id, username, comment, vote) + reviews_dict = [dataclasses.asdict(review) for review in reviews] + query_result = json.dumps(reviews_dict) + return query_result, 201 if len(query_result) != 0 else query_result, 400 + + if __name__ == "__main__": app.run(debug=True) # pragma: no cover