diff --git a/app.py b/app.py index 5de9272..db56645 100644 --- a/app.py +++ b/app.py @@ -35,6 +35,22 @@ SessionFactory = sessionmaker(bind=engine) session = SessionFactory() create_table(engine) +print("pushing initial data if not already happened") +try: + defDriver = session.query(Driver).filter(id=1) + defVehicle = session.query(Vehicle).filter(id=1) + if not defDriver and not defVehicle: + defaultVehicle = Vehicle(id=1, name="default", licenseplate="default") + defaultDriver = Driver(id=1, name="default") + + session.add(defaultVehicle) + session.add(defaultDriver) + session.commit() + session.flush() +except: + print("default data not pushed as already present") +session.flush() + print("initialize handlers") gpxHandler = GPXHandler(session) driverHandler = DriverHandler(session) @@ -106,7 +122,16 @@ def getTrack(): app.logger.debug(f"fetching all tracks failed with error {e}") return f"error {e}", 500 case "DELETE": - pass + data = request.get_json() + + if "id" not in data: + return "no if found", 400 + + try: + gpxHandler.deleteTrack(data["id"]) + return "track deleted", 200 + except Exception as e: + return f"couldnt delete track due to error: {e}", 500 @app.route("/track/meta", methods=['GET']) @@ -175,10 +200,20 @@ def handleDriverRoute(): except Exception as e: app.logger.debug(f"creating drivers failed with error {e}") return "error" + " " + str(e), 500 - case "PUT": - pass case "DELETE": - pass + data = request.get_json() + + if "id" not in data: + return "no if found", 400 + + try: + if data["id"] == 1: + return "deleting defaults is forbidden", 400 + + driverHandler.deleteDriver(data["id"]) + return "driver deleted", 200 + except Exception as e: + return f"couldnt delete driver due to error: {e}", 500 @app.route("/vehicle", methods=['GET', 'POST', 'PUT', 'DELETE']) @@ -230,10 +265,20 @@ def handleVehicleRoute(): except Exception as e: app.logger.debug(f"creating vehicle with name {name} failed with error {e}") return "error" + " " + str(e), 500 - case "PUT": - pass case "DELETE": - pass + data = request.get_json() + + if "id" not in data: + return "no if found", 400 + + try: + if data["id"] == 1: + return "deleting defaults is forbidden", 400 + + vehicleHandler.deleteVehicle(data["id"]) + return "vehicle deleted", 200 + except Exception as e: + return f"couldnt delete vehicle due to error: {e}", 500 @app.route('/upload', methods=['POST']) diff --git a/modules/driverHandler.py b/modules/driverHandler.py index 82c08e6..858d208 100644 --- a/modules/driverHandler.py +++ b/modules/driverHandler.py @@ -1,7 +1,7 @@ from sqlalchemy.orm import Session from errors.NotFoundException import NotFoundError -from modules.geoObjects import Driver +from modules.geoObjects import Driver, Track class DriverHandler: @@ -19,30 +19,32 @@ class DriverHandler: raise ValueError("name is empty") driver = Driver(name=name) - + self.dbSession.add(driver) self.dbSession.commit() - + return driver except Exception as e: raise RuntimeError(f"failed to create driver with errors{e}") - + # handles getting a driver by its id from the database def getDriver(self, driverID: int) -> Driver: try: - driver = self.dbSession.query(Driver).filter_by(id=driverID).first() + driver = self.dbSession.query( + Driver).filter_by(id=driverID).first() if driver: return driver else: - raise NotFoundError(f"Driver with ID {driverID} not found", errors=[]) + raise NotFoundError( + f"Driver with ID {driverID} not found", errors=[]) except Exception as e: raise RuntimeError(f"failed to get driver with errors{e}") - + # handles getting all drivers from the database def getDrivers(self): try: drivers = self.dbSession.query(Driver).all() - + driverList = [ { "id": driver.id, @@ -53,6 +55,19 @@ class DriverHandler: ] return driverList - + except Exception as e: - raise RuntimeError(f"failed to get drivers with errors{e}") \ No newline at end of file + raise RuntimeError(f"failed to get drivers with errors{e}") + + def deleteDriver(self, id): + try: + updated_rows = ( + self.dbSession.query(Track).filter( + Track.driver_id == id).update({Track.driver_id: 1}) + ) + self.dbSession.query(Driver).filter(Driver.id == id).delete() + self.dbSession.commit() + + except Exception as e: + raise RuntimeError(f"failed to delete driver due to error: {e}") + diff --git a/modules/geoObjects.py b/modules/geoObjects.py index 4393193..d8e94f9 100644 --- a/modules/geoObjects.py +++ b/modules/geoObjects.py @@ -12,10 +12,10 @@ def db_connect(): engine = create_engine("postgresql://example:example@localhost/geotrack", poolclass=NullPool) # Überprüfe die Verbindung with engine.connect() as connection: - print("Verbindung zur Datenbank erfolgreich!") + print("connected to database!") return engine except OperationalError as e: - print(f"Fehler bei der Verbindung zur Datenbank: {e}") + print(f"database connection failed: {e}") return None # Funktion zur Erstellung der Tabellen @@ -23,11 +23,12 @@ def create_table(engine): try: if engine is not None: Base.metadata.create_all(engine) - print("Tabellen wurden erfolgreich erstellt!") + + print("created tables") else: - print("Keine Verbindung zur Datenbank verfügbar.") + print("error no connection") except Exception as e: - print(f"Fehler bei der Tabellenerstellung: {e}") + print(f"unexpected error during initial database creation: {e}") # Track-Tabelle class Track(Base): diff --git a/modules/gpxInterpreter.py b/modules/gpxInterpreter.py index 99859c6..0b853c9 100644 --- a/modules/gpxInterpreter.py +++ b/modules/gpxInterpreter.py @@ -180,4 +180,10 @@ class GPXHandler: for track in tracks # iterates all tracks and appends them to the list ] - return track_list \ No newline at end of file + return track_list + + def deleteTrack(self, trackid): + self.__dbSession.query(Waypoint).filter(Waypoint.track_id == trackid).delete() + self.__dbSession.query(Track).filter(Track.id == trackid).delete() + self.__dbSession.commit() + \ No newline at end of file diff --git a/modules/vehicleHandler.py b/modules/vehicleHandler.py index 06367de..5006e3f 100644 --- a/modules/vehicleHandler.py +++ b/modules/vehicleHandler.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session -from modules.geoObjects import Vehicle +from modules.geoObjects import Track, Vehicle class VehicleHandler: dbSession: Session @@ -42,3 +42,15 @@ class VehicleHandler: ] return driverList + + def deleteVehicle(self, id): + try: + updated_rows = ( + self.dbSession.query(Track).filter( + Track.vehicle_id == id).update({Track.vehicle_id: 1}) + ) + self.dbSession.query(Vehicle).filter(Vehicle.id == id).delete() + self.dbSession.commit() + + except Exception as e: + raise RuntimeError(f"failed to delete driver due to error: {e}") \ No newline at end of file diff --git a/web/src/components/fileUpload.vue b/web/src/components/fileUpload.vue index 2a4b8df..cd51537 100644 --- a/web/src/components/fileUpload.vue +++ b/web/src/components/fileUpload.vue @@ -25,8 +25,8 @@ export default defineComponent({ const form = ref(); const drivers: Ref = ref([]) const vehicles: Ref = ref([]) - const selectedDriverID: Ref = ref(0); - const selectedVehicleID: Ref = ref(0); + const selectedDriverID: Ref = ref(1); + const selectedVehicleID: Ref = ref(1); const selectedDriverName: Ref = ref("N/A"); const selectedVehicleName: Ref = ref("N/A"); @@ -119,7 +119,7 @@ export default defineComponent({ if (!file.value) { messageType.value = "warning"; - message.value = "please fill all values"; + message.value = "please select a file"; return; } diff --git a/web/src/views/driver.vue b/web/src/views/driver.vue index f146a83..4ea2cbc 100644 --- a/web/src/views/driver.vue +++ b/web/src/views/driver.vue @@ -17,6 +17,31 @@ export default defineComponent({ const messageType: Ref = ref(""); const message: Ref = ref(""); + // handles delete a driver + const deleteDriver = async (driverID: number) => { + const headers: Headers = new Headers() + headers.set('Content-Type', 'application/json') + headers.set('Accept', 'application/json') + + const requestBody = JSON.stringify({ id: driverID }); + + const request: RequestInfo = new Request("http://localhost:5000/driver", { + method: "DELETE", + headers: headers, + body: requestBody + }) + + var response = await fetch(request) + if (!response.ok) { + console.log(await response.text()) + messageType.value = "error"; + message.value = `deleting driver failed with error: ${await response.text()}`; + } else { + console.log(await response.text()) + messageType.value = "success"; + message.value = `deleted driver`; + } + } // handles sending webrequests to the backend const getDrivers = async () => { @@ -45,7 +70,7 @@ export default defineComponent({ } else { console.log(await response.text()) messageType.value = "error"; - message.value = `upload failed: ${response.text()}`; + message.value = `upload failed: ${response.text()}`; } } @@ -72,7 +97,7 @@ export default defineComponent({ } else { console.log(await response.text()) messageType.value = "error"; - message.value = `upload failed: ${response.text()}`; + message.value = `upload failed: ${response.text()}`; } } @@ -82,7 +107,8 @@ export default defineComponent({ driverName, driverList, message, - messageType + messageType, + deleteDriver }; }, }); @@ -90,7 +116,8 @@ export default defineComponent({