def get_driver_profile(): cur = get_db().cursor() token = verify_token(request.headers['Authorization'].split(" ")[1], current_app.config['SECRET_KEY']) print(request.method) if not token: return make_response( jsonify({ "success": 0, "message": "Driver doesn't exist" }), 404) elif token["typ"] != "transporter": return make_response( jsonify({ "success": 0, "message": "You need to be logged in as a driver to get profile" }), 400) cur.execute("SELECT * FROM transporter WHERE id = {}".format(token["sub"])) response = {"success": 1, "details": cur.fetchone()} cur.execute("SELECT * FROM vehicle WHERE transporter_id = {}".format( token["sub"])) vehicles = cur.fetchall() response["vehicles"] = vehicles if not vehicles: response["vehicles"] = "No vehicles found" return make_response(jsonify(response), 200)
def lnm_webhook(v_id, transporter_id): payment_data = request.get_json() if not payment_data['Body']['stkCallback']['ResultCode']: # save payment details in the database db_conn = get_db() cur = db_conn.cursor() pay_id = uuid4() amount = payment_data["Body"]["stkCallback"]["CallbackMetadata"][ "Item"][0]["Value"] receipt_no = payment_data["Body"]["stkCallback"]["CallbackMetadata"][ "Item"][1]["Value"] payment_time = payment_data["Body"]["stkCallback"]["CallbackMetadata"][ "Item"][3]["Value"] client_no = payment_data["Body"]["stkCallback"]["CallbackMetadata"][ "Item"][4]["Value"] client_query = "SELECT id FROM user WHERE phone = {} LIMIT 1".format( client_no) cur.execute(client_query) db_conn.commit() client_id = cur.fetchone() payment_query = "INSERT INTO payment (payment_id, amount, receipt_id, client_id, vehicle_id, payment_time) VALUES '{}', {}, '{}', {}, {}, {}".format( pay_id, amount, receipt_no, client_id, v_id, payment_time) cur.execute(payment_query) db_conn.commit()
def do_client_login(): '''This function checks POSTed data against what is in the database and returns a jwt to authorize users to use the site''' db = get_db() request_data = request.get_json(force=True) user_info = fetch_user(db, request_data['username'], request_data['pwd'], 'client') if user_info is None: return make_response( jsonify({ 'success': 0, 'message': 'User not found' }), 404) elif user_info['pwd'] == request_data['pwd'] and user_info[ 'username'] == request_data['username']: token = jwt.encode( { 'typ': 'user', 'sub': user_info['id'], 'exp': datetime.utcnow() + timedelta(days=10) }, current_app.config["SECRET_KEY"], algorithm='HS256').decode('utf-8') del user_info["pwd"] return make_response( jsonify({ 'success': 1, 'message': 'Successful login', 'user_details': user_info, 'token': '{}'.format(token) }), 200)
def do_registration(user_type): '''Get the users's information from POST data and inserts into the database''' db_conn = get_db() request_data = request.get_json(force=True) result, status = register_user(db_conn, request_data, user_type) return make_response(jsonify(result), status)
def do_driver_login(): db_conn = get_db() request_data = request.get_json(force=True) user_info = fetch_user(db_conn, request_data['username'], request_data['pwd'], 'transporter') if not user_info: return make_response( jsonify({ 'success': 0, 'message': 'User not found' }), 404) elif user_info['pwd'] == request_data['pwd'] and user_info[ 'username'] == request_data['username']: token = jwt.encode( { 'typ': 'transporter', 'sub': user_info['id'], 'exp': datetime.now() + timedelta(days=10) }, current_app.config["SECRET_KEY"], algorithm='HS256').decode('utf-8') return jsonify({ 'success': 1, 'message': 'Successful login', 'token': '{}'.format(token) })
def upload_image(vehicle_id): db_conn = get_db() cur = db_conn.cursor() #get token and check token validity token = verify_token(request.headers['Authorization'].split(" ")[1], current_app.config['SECRET_KEY']) if vehicle_id is None: return make_response( jsonify({ "success": 0, "message": "You must specify the vehicle id to post a picture of it." }), 400) elif not token: return make_response( jsonify({ "success": 0, "message": "Driver doesn't exist" }), 404) elif token["typ"] != "driver": return make_response( jsonify({ "success": 0, "message": "You need to be logged in as a driver to register a vehicle" }), 400) body = request.get_json(force=True) if body["image"] == '': return make_response( jsonify({ "success": 0, "message": "no files uploaded" }), 400) elif body["image"] and allowed_file(body["filename"]): filename = secure_filename(body["filename"]) path = os.path.join(current_app.config['IMAGE_STORE_PATH'], str(token["sub"]), body["filename"]) if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) with open(path, "wb") as f: f.write(b64decode(body["image"])) f.close() # save the file path to the database cur.execute("UPDATE vehicle SET pictures = %s WHERE id = %s", (path, vehicle_id)) db_conn.commit() return make_response( jsonify({ "success": 1, "message": "Successfully uploaded image" }), 200)
def book_vehicle(v_id): db_conn = get_db() cur = db_conn.cursor() # get vehicle id from the route v_id = int(v_id) if v_id is None: return make_response( jsonify({ "success": 0, "message": "Specify vehicle to book" }), 400) token = verify_token(request.headers['Authorization'].split(" ")[1], current_app.config['SECRET_KEY']) if not token: return make_response( jsonify({ "success": 0, "message": "Client doesn't exist" }), 404) elif token['typ'] != 'user': return make_response( jsonify({ "success": 0, "message": "You must have logged in with a client account to book a vehicle." }), 400) # check that vehicle exists cur.execute("SELECT * FROM vehicle WHERE id = {}".format(v_id)) db_conn.commit() vehicle = cur.fetchone() if vehicle['booked'] != 'no': return make_response( jsonify({ "success": 0, "message": "The vehicle is not available for booking" }), 404) cur.execute("UPDATE vehicle SET booked = %s WHERE id = %s", (token['sub'], v_id)) db_conn.commit() if cur.rowcount < 0: return make_response( jsonify({ "success": 0, "message": "Booking Unsuccessful" }), 500) return make_response( jsonify({ "success": 1, "message": "Successfully booked vehicle" }), 200)
def get_vehicles(search_params=None): cur = get_db().cursor() fetch_query = "SELECT vehicle.id, vehicle.vehicle_type, vehicle.capacity, vehicle.price, vehicle.number_plate, vehicle.pictures, vehicle.booked, transporter.email, transporter.full_name, transporter.phone FROM vehicle INNER JOIN transporter ON vehicle.transporter_id=transporter.id" #get any search parameters if any from the url #and include them in the SQL search query if search_params is not None: fetch_query += " WHERE " params = search_params.split("&") for i, param in enumerate(params): key_value = param.split("=") if key_value[1] != "": if i is not len(params) - 1: if key_value[0] == "capacity": fetch_query += "vehicle.capacity" + "<='" + key_value[ 1] + "' AND " elif key_value[0] == "min_price": fetch_query += "vehicle.price >= " + key_value[ 1] + " AND " elif key_value[0] == "max_price": fetch_query += "vehicle.price <= " + key_value[ 1] + " AND " else: fetch_query += key_value[0] + "='" + key_value[ 1] + "' AND " else: if key_value[0] == "capacity": fetch_query += "vehicle.capacity" + "<='" + key_value[ 1] + "' AND " if key_value[0] == "min_price": fetch_query += "vehicle.price >= " + key_value[1] elif key_value[0] == "max_price": fetch_query += "vehicle.price <= " + key_value[1] else: fetch_query += key_value[0] + "='" + key_value[1] + "'" cur.execute(fetch_query) result = cur.fetchall() if not result: return make_response( jsonify({ 'success': 0, 'message': 'No vehicles found' }), 404) else: return make_response( jsonify({ 'success': 1, 'message': "Vehicles found", 'vehicles': result }), 200)
def get_cities(): cur = get_db().cursor() fetch_query = "SELECT * FROM city" cur.execute(fetch_query) cities = cur.fetchall() if not cities: response = {"success": 0, "message": "No cities found"} return make_response(jsonify(response), 404) else: response = {"success": 1, "message": "Cities found", "cities": cities} return make_response(jsonify(response), 200)
def get_regions(city_id): cur = get_db().cursor() fetch_query = "SELECT * FROM regions WHERE city_id = %s" % city_id cur.execute(fetch_query) regions = cur.fetchall() if not regions: response = {"success": 0, "message": "No regions found"} return make_response(jsonify(response), 404) else: response = {"success": 1, "message": "Regions found", "regions": regions} return make_response(jsonify(response), 200)
def get_bookings(): cur = get_db().cursor() #get token and check token validity token = verify_token(request.headers['Authorization'].split(" ")[1], current_app.config['SECRET_KEY']) if not token: return make_response( jsonify({ "success": 0, "message": "Client doesn't exist" }), 404) elif token["typ"] != "user": return make_response( jsonify({ "success": 0, "message": "You need to be logged in as a client to view bookings" }), 400) fetch_query = "SELECT vehicle.id, vehicle.vehicle_type, vehicle.capacity, vehicle.price, vehicle.number_plate, vehicle.pictures, vehicle.booked, payment.payment_id, payment.amount, payment.receipt_no, payment.client_id, payment.vehicle_id, payment.payment_time FROM vehicle LEFT JOIN payment ON vehicle.id=payment.vehicle_id WHERE vehicle.booked = %s" % token[ "sub"] cur.execute(fetch_query) result = cur.fetchall() if not result: return make_response( jsonify({ 'success': 0, 'message': 'No vehicles found' }), 404) else: return make_response( jsonify({ 'success': 1, 'message': "Vehicles found", 'vehicles': result }), 200)
def register_vehicle(): db_conn = get_db() cur = db_conn.cursor() body = request.get_json(force=True) #get token and check token validity token = verify_token(request.headers['Authorization'].split(" ")[1], current_app.config['SECRET_KEY']) if not token: return make_response( jsonify({ "success": 0, "message": "Driver doesn't exist" }), 404) if token["typ"] != "transporter": return make_response( jsonify({ "success": 0, "message": "You need to be logged in as a driver to register a vehicle" }), 400) insert_query = "INSERT INTO vehicle (vehicle_type, capacity, price, number_plate, pictures, transporter_id, booked) VALUES " insert_query += "('{}', '{}', '{}', '{}', 'No image', {}, 'no')".format( body["type"], body["capacity"], body["price"], body["number_plate"], token["sub"]) cur.execute(insert_query) db_conn.commit() if cur.rowcount > 0: fetch_query = "SELECT id FROM vehicle WHERE number_plate = '%s'" % body[ "number_plate"] cur.execute(fetch_query) response = jsonify({"success": 1, "vehicle_id": cur.fetchone()["id"]}) return make_response(response, 200)
def debit(): payload = verify_token(request.headers['Authorization'].split(' ')[1], current_app.config['SECRET_KEY']) if not payload: return make_response( { 'status': 0, 'message': 'Must be logged in to make a payment.' }, 404) else: request_data = request.get_json() vehicle = request_data['vehicle_id'] amount = request_data['amount'] client = payload['sub'] db_conn = get_db() cur = db_conn.cursor() client_phone_query = "SELECT phone FROM user WHERE id = {} LIMIT 1".format( client) cur.execute(client_phone_query) client_phone = cur.fetchone() transporter_query = "SELECT transporter_id FROM vehicle WHERE id = {}".format( vehicle) cur.execute(transporter_query) db_conn.commit() transporter = cur.fetchone() payment_response = make_payment(vehicle, amount, client_phone, transporter) if not payment_response: return make_response({ 'status': 1, 'message': 'success', 'data': payment_response }) else: return make_response({'status': 0, 'message': payment_response})
def get_user_payments(): payload = verify_token(request.headers['Authorization'].split(' ')[1], current_app.config['SECRET_KEY']) if not payload: return make_response( { 'status': 0, 'message': 'Must be logged in to check payment history.' }, 404) else: db_conn = get_db() cur = db_conn.cursor() query = "SELECT * FROM payment WHERE client_id = {}".format( payload['sub']) cur.execute(query) user_payments = cur.fetchall() return make_response({ 'status': 1, 'message': 'success', 'data': user_payments })