GeoTracking/app.py

155 lines
4.4 KiB
Python

from driverHandler import DriverHandler
from gpxInterpreter import GPXHandler
from vehicleHandler import VehicleHandler
from dotenv import load_dotenv
from flask import Flask, app, send_from_directory, request
from sqlalchemy import NullPool, create_engine
from sqlalchemy.orm import sessionmaker, Session
from geoObjects import createTables
__session: Session
FlaskApp: app
__gpxHandler: GPXHandler
__driverHandler: DriverHandler
__vehicleHandler: VehicleHandler
def entryPoint():
print("load environment")
load_dotenv()
print("create flask application")
FlaskApp = Flask(__name__, static_folder='web/dist')
def db_connect(connectionPath):
return create_engine(connectionPath, poolclass=NullPool)
__session = sessionmaker(bind=db_connect())()
# handler classes
# handles parsing files and interacting with database
__gpxHandler = GPXHandler(__session)
__driverHandler = DriverHandler(__session)
__vehicleHandler = VehicleHandler(__session)
# creating tables
createTables(__session)
app.run(debug=True)
# TODO: move functional parts out to api package if not handled by other classes
@FlaskApp.route('/')
def serve_vue_app():
return send_from_directory(FlaskApp.static_folder, 'index.html')
@FlaskApp.route("/track", method=['GET'])
def getTrack():
if "start" in request.args and "end" in request.args or "track" in request.args:
if "start" in request.args and "end" in request.args:
# get tracks by filter
try:
return __gpxHandler.getTracksInTime(request.args["start"], request.args["end"]), 200
except Exception as e:
return f"error {e}", 500
elif "track" in request.args:
# get track by id
try:
return __gpxHandler.getTrack(int(request.args["track"])), 200
except Exception as e:
return f"error {e}", 500
pass
else:
# gets all tracks as list
return __gpxHandler.getTracks()
@FlaskApp.route("/driver", methods=['GET', 'POST'])
def handleDriverRoute():
if request.method == "GET":
if 'driver' in request.args:
try:
__driverHandler.getVehicle(int(request.args["driver"]))
# return drivers, 200
except Exception as e:
return "error" + " " + str(e), 500
else:
try:
__driverHandler.getVehicles()
# return drivers, 200
except Exception as e:
return "error" + " " + str(e), 500
elif request.method == "POST":
if "name" not in request.args:
return "missing name", 400
# handle creating vehicle
try:
__driverHandler.createVehicle(request.args["name"])
except Exception as e:
return "error" + " " + str(e), 500
@FlaskApp.route("/vehicle", methods=['GET', 'POST'])
def handleVehicleRoute():
if request.method == "GET":
if 'vehicle' in request.args:
try:
__vehicleHandler.getVehicle(int(request.args["driver"]))
# return drivers, 200
except Exception as e:
return "error" + " " + str(e), 500
else:
try:
__vehicleHandler.getVehicles()
# return drivers, 200
except Exception as e:
return "error" + " " + str(e), 500
elif request.method == "POST":
if "name" not in request.args:
return "missing name", 400
if "type" not in request.args:
return "missing type", 400
# handle creating vehicle
try:
__vehicleHandler.createVehicle(
request.args["name"], request.args["type"])
except Exception as e:
return "error" + " " + str(e), 500
@FlaskApp.route('/upload', methods=['POST'])
def uploadFile():
if 'file' not in request.files:
return "no file provided", 400
if request.args["routeName"] == '':
return "no routename provided", 400
file = request.files['file']
if file.filename == '':
return "no file selected", 400
try:
__gpxHandler.parse(file, request.args["routeName"])
return "file stored succesfull", 200
except Exception as e:
return "error" + " " + str(e), 500
if __name__ == '__main__':
entryPoint()