From 7bb09ea5cd78ecc6e6534d206350b9ebe83ba9bc Mon Sep 17 00:00:00 2001 From: Connor Bechthold Date: Fri, 29 Dec 2023 22:41:32 -0500 Subject: [PATCH] create sep function for getting resident by ID and propogate duplicate error msg to frontend --- backend/app/rest/residents_routes.py | 15 ++++---- .../implementations/residents_service.py | 37 +++++++++++++------ .../services/interfaces/residents_service.py | 15 +++++--- frontend/src/APIClients/ResidentAPIClient.ts | 4 +- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/backend/app/rest/residents_routes.py b/backend/app/rest/residents_routes.py index 6b74fa13..9f8ffff1 100644 --- a/backend/app/rest/residents_routes.py +++ b/backend/app/rest/residents_routes.py @@ -24,9 +24,9 @@ def add_resident(): # Check for the existence of a resident prior to adding them fmt_resident_id = resident.get("initial") + str(resident.get("room_num")) try: - res = residents_service.get_residents(False, 1, 10, fmt_resident_id) - if len(res["residents"]) > 0: - return jsonify({"error": "Resident already with id {fmt_resident_id} already exists".format(fmt_resident_id=fmt_resident_id)}), 409 + existing_resident = residents_service.get_resident_by_id(fmt_resident_id) + if existing_resident: + return jsonify({"error": "Resident with ID {fmt_resident_id} already exists.".format(fmt_resident_id=fmt_resident_id)}), 409 except Exception as e: error_message = getattr(e, "message", None) return jsonify({"error": (error_message if error_message else str(e))}), 500 @@ -55,9 +55,9 @@ def update_resident(resident_id): # Check for the existence of a resident prior to adding them fmt_resident_id = updated_resident.get("initial") + str(updated_resident.get("room_num")) try: - res = residents_service.get_residents(False, 1, 10, fmt_resident_id) - if len(res["residents"]) == 1 and res["residents"][0]["id"] != resident_id: - return jsonify({"error": "Resident with id {fmt_resident_id} already exists".format(fmt_resident_id=fmt_resident_id)}), 409 + existing_resident = residents_service.get_resident_by_id(fmt_resident_id) + if existing_resident and existing_resident["id"] != resident_id: + return jsonify({"error": "Resident with ID {fmt_resident_id} already exists.".format(fmt_resident_id=fmt_resident_id)}), 409 except Exception as e: error_message = getattr(e, "message", None) return jsonify({"error": (error_message if error_message else str(e))}), 500 @@ -144,9 +144,8 @@ def get_residents(): pass try: - resident_id = request.args.get("resident_id") residents_results = residents_service.get_residents( - return_all, page_number, results_per_page, resident_id, filters + return_all, page_number, results_per_page, filters ) return jsonify(residents_results), 201 except Exception as e: diff --git a/backend/app/services/implementations/residents_service.py b/backend/app/services/implementations/residents_service.py index 1a11a30d..da0d1181 100644 --- a/backend/app/services/implementations/residents_service.py +++ b/backend/app/services/implementations/residents_service.py @@ -1,6 +1,6 @@ from ..interfaces.residents_service import IResidentsService from ...models.residents import Residents -from ...models.log_records import LogRecords +from ...models.log_record_residents import LogRecordResidents from ...models.buildings import Buildings from ...models import db from datetime import datetime @@ -22,6 +22,13 @@ def __init__(self, logger): """ self.logger = logger + def to_resident_json(self, resident): + resident, building = resident[0], resident[1] + + resident_dict = resident.to_dict() + resident_dict["building"]["name"] = building + return resident_dict + def to_residents_json_list(self, resident_results): residents_json_list = [] for result in resident_results: @@ -81,7 +88,7 @@ def update_resident(self, resident_id, updated_resident): db.session.commit() def delete_resident(self, resident_id): - resident_log_records = LogRecords.query.filter_by( + resident_log_records = LogRecordResidents.query.filter_by( resident_id=resident_id ).count() if resident_log_records == 0: @@ -100,19 +107,25 @@ def delete_resident(self, resident_id): ) db.session.commit() + def get_resident_by_id(self, resident_id): + try: + resident = ( + Residents.query.join( + Buildings, Buildings.id == Residents.building_id + ) + .with_entities(Residents, Buildings.name.label("building")) + .filter_by(resident_id=resident_id) + .first() + ) + return self.to_resident_json(resident) + except Exception as postgres_error: + raise postgres_error + def get_residents( - self, return_all, page_number, results_per_page, resident_id=None, filters=None + self, return_all, page_number, results_per_page, filters=None ): try: - if resident_id: - residents_results = ( - Residents.query.join( - Buildings, Buildings.id == Residents.building_id - ) - .with_entities(Residents, Buildings.name.label("building")) - .filter_by(resident_id=resident_id) - ) - elif return_all: + if return_all: residents_results = ( Residents.query.join( Buildings, Buildings.id == Residents.building_id diff --git a/backend/app/services/interfaces/residents_service.py b/backend/app/services/interfaces/residents_service.py index 24796097..a677de27 100644 --- a/backend/app/services/interfaces/residents_service.py +++ b/backend/app/services/interfaces/residents_service.py @@ -50,14 +50,19 @@ def delete_resident(self, resident_id): @abstractmethod def get_residents( - self, return_all, page_number, results_per_page, resident_id=None + self, return_all, page_number, results_per_page, filters=None ): """ Gets residents in json format. - :param resident_id: id of resident to be deleted in the format of initial+room_num - :type resident_id: string - :param id: id of resident to be deleted, the primary key of the resident - :type resident_id: initial + :param return_all: whether to return all associated records or paginate + :type return_all: boolean + :param page_number: page number of records to retrieve + :type page_number: int + :param results_per_page: max number of records to retrieve for the page + :type results_per_page: int + :param filters: filters to apply to the query in json format + :type filters: json + :raises Exception: if resident retrieval fails """ pass diff --git a/frontend/src/APIClients/ResidentAPIClient.ts b/frontend/src/APIClients/ResidentAPIClient.ts index 64fb4cdb..83d9b4bc 100644 --- a/frontend/src/APIClients/ResidentAPIClient.ts +++ b/frontend/src/APIClients/ResidentAPIClient.ts @@ -78,7 +78,7 @@ const createResident = async ({ if (axiosErr.response && axiosErr.response.status === 409) { return { - errMessage: "Resident with the specified user ID already exists." + errMessage: axiosErr.response.data.error ?? `Resident with the specified user ID already exists.` }; } return false; @@ -128,7 +128,7 @@ const editResident = async ({ if (axiosErr.response && axiosErr.response.status === 409) { return { - errMessage: "Resident with the specified user ID already exists." + errMessage: axiosErr.response.data.error ?? "Resident with the specified user ID already exists." }; } return false;