diff --git a/src/server/BreCal/api/ships.py b/src/server/BreCal/api/ships.py index f4cdfa8..284387d 100644 --- a/src/server/BreCal/api/ships.py +++ b/src/server/BreCal/api/ships.py @@ -1,7 +1,10 @@ from flask import Blueprint, request from .. import impl from ..services.auth_guard import auth_guard +from marshmallow import EXCLUDE +from ..schemas import model import json +import logging bp = Blueprint('ships', __name__) @@ -14,3 +17,33 @@ def GetShips(): return impl.ships.GetShips(token) else: return json.dumps("not authenticated"), 403 + + +@bp.route('/ships', methods=['post']) +@auth_guard() # no restriction by role +def PostShip(): + + try: + content = request.get_json(force=True) + loadedModel = model.ShipSchema().load(data=content, many=False, partial=True) + except Exception as ex: + logging.error(ex) + print(ex) + return json.dumps("bad format"), 400 + + return impl.ships.PostShip(loadedModel) + + +@bp.route('/ships', methods=['put']) +@auth_guard() # no restriction by role +def PutShip(): + + try: + content = request.get_json(force=True) + loadedModel = model.ShipSchema().load(data=content, many=False, partial=True, unknown=EXCLUDE) + except Exception as ex: + logging.error(ex) + print(ex) + return json.dumps("bad format"), 400 + + return impl.ships.PutShip(loadedModel) diff --git a/src/server/BreCal/impl/ships.py b/src/server/BreCal/impl/ships.py index 4288d7b..71858e5 100644 --- a/src/server/BreCal/impl/ships.py +++ b/src/server/BreCal/impl/ships.py @@ -31,3 +31,98 @@ def GetShips(token): +def PostShip(schemaModel): + """ + :param schemaModel: The deserialized model of the record to be inserted + """ + + # TODO: Validate the incoming data + + # This creates a *new* entry + try: + + pooledConnection = local_db.getPoolConnection() + commands = pydapper.using(pooledConnection) + + query = "INSERT INTO ship (" + isNotFirst = False + for key in schemaModel.keys(): + if key == "id": + continue + if key == "created": + continue + if key == "modified": + continue + if isNotFirst: + query += "," + isNotFirst = True + query += key + query += ") VALUES (" + isNotFirst = False + for key in schemaModel.keys(): + if key == "id": + continue + if key == "created": + continue + if key == "modified": + continue + if isNotFirst: + query += "," + isNotFirst = True + query += "?" + key + "?" + query += ")" + + commands.execute(query, schemaModel) + new_id = commands.execute_scalar("select last_insert_id()") + + pooledConnection.close() + + return json.dumps({"id" : new_id}), 201, {'Content-Type': 'application/json; charset=utf-8'} + + except Exception as ex: + logging.error(ex) + print(ex) + result = {} + result["message"] = "call failed" + return json.dumps(result), 500, {'Content-Type': 'application/json; charset=utf-8'} + + +def PutShip(schemaModel): + """ + :param schemaModel: The deserialized model of the record to be inserted + """ + + # This updates an *existing* entry + try: + + pooledConnection = local_db.getPoolConnection() + commands = pydapper.using(pooledConnection) + + query = "UPDATE ship SET " + isNotFirst = False + for key in schemaModel.keys(): + if key == "id": + continue + if key == "created": + continue + if key == "modified": + continue + if isNotFirst: + query += ", " + isNotFirst = True + query += key + " = ?" + key + "? " + + query += "WHERE id = ?id?" + + affected_rows = commands.execute(query, param=schemaModel) + + pooledConnection.close() + + return json.dumps({"id" : schemaModel["id"]}), 200, {'Content-Type': 'application/json; charset=utf-8'} + + except Exception as ex: + logging.error(ex) + print(ex) + result = {} + result["message"] = "call failed" + return json.dumps(result), 500, {'Content-Type': 'application/json; charset=utf-8'} diff --git a/src/server/BreCal/local_db.py b/src/server/BreCal/local_db.py index 85dff68..389b3be 100644 --- a/src/server/BreCal/local_db.py +++ b/src/server/BreCal/local_db.py @@ -11,7 +11,7 @@ def initPool(instancePath): try: global config_path if(config_path == None): - config_path = os.path.join(instancePath,'../../../secure/connection_data_devel.json'); + config_path = os.path.join(instancePath,'E:/temp/connection_data.json'); print (config_path) diff --git a/src/server/BreCal/schemas/model.py b/src/server/BreCal/schemas/model.py index 1cbdf21..20033f6 100644 --- a/src/server/BreCal/schemas/model.py +++ b/src/server/BreCal/schemas/model.py @@ -185,7 +185,6 @@ class UserSchema(Schema): @dataclass class Times: - id: int eta_berth: datetime eta_berth_fixed: bool @@ -223,7 +222,7 @@ class User: modified: datetime @dataclass -class Ship(Schema): +class Ship: id: int name: str imo: int @@ -233,11 +232,31 @@ class Ship(Schema): width: float is_tug: bool bollard_pull: int - eni: str + eni: int created: datetime modified: datetime deleted: bool + +class ShipSchema(Schema): + def __init__(self): + super().__init__(unknown=None) + pass + + id = fields.Int(Required=False) + name = fields.String(allow_none=False, metadata={'Required':True}) + imo = fields.Int(allow_none=False, metadata={'Required':True}) + callsign = fields.String(allow_none=True, metadata={'Required':False}) + participant_id = fields.Int(allow_none=True, metadata={'Required':False}) + length = fields.Float(allow_none=True, metadata={'Required':False}) + width = fields.Float(allow_none=True, metadata={'Required':False}) + is_tug = fields.Bool(allow_none=True, metadata={'Required':False}, default=False) + bollard_pull = fields.Int(allow_none=True, metadata={'Required':False}) + eni = fields.Int(allow_none=True, metadata={'Required':False}) + created = fields.DateTime(allow_none=True, metadata={'Required':False}) + modified = fields.DateTime(allow_none=True, metadata={'Required':False}) + deleted = fields.Int(allow_none=True, metadata={'Required':False}) + class TimesId(Schema): pass