diff --git a/src/server/BreCal/api/shipcalls.py b/src/server/BreCal/api/shipcalls.py index fb74627..e6ac854 100644 --- a/src/server/BreCal/api/shipcalls.py +++ b/src/server/BreCal/api/shipcalls.py @@ -7,6 +7,7 @@ from ..services.auth_guard import auth_guard, check_jwt from BreCal.validators.input_validation import validate_posted_shipcall_data, check_if_user_is_bsmd_type from BreCal.validators.input_validation_shipcall import InputValidationShipcall from BreCal.database.sql_handler import execute_sql_query_standalone +from BreCal.validators.validation_error import create_validation_error_response, create_werkzeug_error_response from . import verify_if_request_is_json import logging @@ -58,7 +59,7 @@ def PostShipcalls(): except ValidationError as ex: logging.error(ex) print(ex) - return json.dumps({"message":f"bad format. \nError Messages: {ex.messages}. \nValid Data: {ex.valid_data}"}), 400 + return create_validation_error_response(ex=ex, status_code=400) except Exception as ex: logging.error(ex) @@ -88,12 +89,12 @@ def PutShipcalls(): except ValidationError as ex: logging.error(ex) print(ex) - return json.dumps({"message":f"bad format. \nError Messages: {ex.messages}. \nValid Data: {ex.valid_data}"}), 400 + return create_validation_error_response(ex=ex, status_code=400) except werkzeug.exceptions.Forbidden as ex: logging.error(ex) print(ex) - return json.dumps({"message":ex.description}), 403 + return create_werkzeug_error_response(ex=ex, status_code=403) except Exception as ex: logging.error(ex) diff --git a/src/server/BreCal/api/ships.py b/src/server/BreCal/api/ships.py index 31b6cf6..5935402 100644 --- a/src/server/BreCal/api/ships.py +++ b/src/server/BreCal/api/ships.py @@ -6,6 +6,7 @@ from ..schemas import model import json import logging from . import verify_if_request_is_json +from BreCal.validators.validation_error import create_validation_error_response from BreCal.validators.input_validation import check_if_user_is_bsmd_type from BreCal.validators.input_validation_ship import InputValidationShip @@ -45,6 +46,11 @@ def PostShip(): # validate the request data & user permissions InputValidationShip.evaluate_post_data(user_data, loadedModel, content) + except ValidationError as ex: + logging.error(ex) + print(ex) + return create_validation_error_response(ex=ex, status_code=400) + except Exception as ex: logging.error(ex) print(ex) @@ -69,6 +75,11 @@ def PutShip(): # validate the request data & user permissions InputValidationShip.evaluate_put_data(user_data, loadedModel, content) + except ValidationError as ex: + logging.error(ex) + print(ex) + return create_validation_error_response(ex=ex, status_code=400) + except Exception as ex: logging.error(ex) print(ex) @@ -97,6 +108,11 @@ def DeleteShip(): # validate the request data & user permissions InputValidationShip.evaluate_delete_data(user_data, ship_id) + except ValidationError as ex: + logging.error(ex) + print(ex) + return create_validation_error_response(ex=ex, status_code=400) + except Exception as ex: logging.error(ex) print(ex) diff --git a/src/server/BreCal/api/times.py b/src/server/BreCal/api/times.py index 131673f..65b18ed 100644 --- a/src/server/BreCal/api/times.py +++ b/src/server/BreCal/api/times.py @@ -7,6 +7,7 @@ import logging from marshmallow import ValidationError from BreCal.validators.input_validation_times import InputValidationTimes from . import verify_if_request_is_json +from BreCal.validators.validation_error import create_validation_error_response, create_werkzeug_error_response bp = Blueprint('times', __name__) @@ -44,7 +45,7 @@ def PostTimes(): except ValidationError as ex: logging.error(ex) print(ex) - return json.dumps(f"bad format. \nError Messages: {ex.messages}. \nValid Data: {ex.valid_data}"), 400 + return create_validation_error_response(ex=ex, status_code=400) except Exception as ex: logging.error(ex) @@ -73,7 +74,7 @@ def PutTimes(): except ValidationError as ex: logging.error(ex) print(ex) - return json.dumps(f"bad format. \nError Messages: {ex.messages}. \nValid Data: {ex.valid_data}"), 400 + return create_validation_error_response(ex=ex, status_code=400) except Exception as ex: logging.error(ex) @@ -87,17 +88,28 @@ def PutTimes(): @auth_guard() # no restriction by role def DeleteTimes(): - if 'id' in request.args: - options = {} - options["id"] = request.args.get("id") + try: + if 'id' in request.args: + options = {} + options["id"] = request.args.get("id") - # read the user data from the JWT token (set when login is performed) - user_data = check_jwt() + # read the user data from the JWT token (set when login is performed) + user_data = check_jwt() - # validate the request - InputValidationTimes.evaluate_delete_data(user_data, times_id = request.args.get("id")) + # validate the request + InputValidationTimes.evaluate_delete_data(user_data, times_id = request.args.get("id")) - return impl.times.DeleteTimes(options) - else: - logging.warning("Times delete missing id argument") - return json.dumps("missing argument"), 400 + return impl.times.DeleteTimes(options) + else: + logging.warning("Times delete missing id argument") + return json.dumps("missing argument"), 400 + + except ValidationError as ex: + logging.error(ex) + print(ex) + return create_validation_error_response(ex=ex, status_code=400) + + except Exception as ex: + logging.error(ex) + print(ex) + return json.dumps("bad format"), 400 diff --git a/src/server/BreCal/validators/input_validation_ship.py b/src/server/BreCal/validators/input_validation_ship.py index da3be4d..47fa918 100644 --- a/src/server/BreCal/validators/input_validation_ship.py +++ b/src/server/BreCal/validators/input_validation_ship.py @@ -102,6 +102,9 @@ class InputValidationShip(): @staticmethod def put_content_may_not_contain_imo_number(content:dict): put_data_ship_imo = content.get("imo",None) + + # #TODO: Aktuelle IMO abfragen und nach Änderung suchen, bevor eine Fehlermeldung erstellt wird + if put_data_ship_imo is not None: raise ValidationError(f"The IMO number field may not be changed since it serves the purpose of a primary (matching) key.") return diff --git a/src/server/BreCal/validators/validation_error.py b/src/server/BreCal/validators/validation_error.py new file mode 100644 index 0000000..cdac103 --- /dev/null +++ b/src/server/BreCal/validators/validation_error.py @@ -0,0 +1,34 @@ +import logging +import typing +import json +from marshmallow import ValidationError +import werkzeug +from werkzeug.exceptions import Forbidden + + + +def create_validation_error_response(ex:ValidationError, status_code:int=400)->typing.Tuple[str,int]: + # generate an overview the errors + #example: + # {'lock_time': ['The provided value must be in the future. Current Time: 2024-09-02 08:23:32.600791, Value: 2024-09-01 08:20:41.853000']} + errors = ex.messages + + # example: + # "Valid Data": { + # "id": 2894, + # "eta_berth": "datetime.datetime(2024, 9, 2, 11, 11, 43)", + # "eta_berth_fixed": false + # } + valid_data = ex.valid_data + + + json_response = { + "message":"ValidationError", + "errors":errors, + "valid_data":valid_data + } + return (json.dumps(json_response), status_code) + +def create_werkzeug_error_response(ex:Forbidden, status_code:int=403)->typing.Tuple[str,int]: + return json.dumps({"message":ex.description}), status_code +