Exemple #1
0
def received_postback(event):
    # the FB ID of the person sending the message
    sender_id = event["sender"]["id"]
    # recipient_id = event["recipient"]["id"]  # page's facebook ID
    payload = event["postback"]["payload"]
    bot.send_action(sender_id, "mark_seen")
    if payload == "start":  # Initial welcome message for first-time users
        bot.send_text_message(
            sender_id, "Hello, we're going to make a 10Xer out of you!"
        )
        bot.send_image_url(sender_id, "https://i.imgur.com/D4JtitY.png")
        db = PgInstance(PSQL_LOGIN_CMD, sender_id)
        err = db.Connect()
        if err == None:
            err = db.Delete_user()
            checklist_msg = dialog.get_checklist(db)
            bot.send_text_quick_replies(
                sender_id,
                "To get started, we're going to need the following information:\n" + checklist_msg, quick_replies_list)
            db.Disconnect()
        else:
            print(err)
            bot.send_text_quick_replies(
                sender_id, "Error connecting to db", quick_replies_list)  # replace this eventually
            return
    else:  # should never happen, should add logging for these cases
        bot.send_text_quick_replies(
            sender_id, "Invalid payload", quick_replies_list)
        print("Invalid payload: " + payload)
Exemple #2
0
def login():
    db = PgInstance()
    err = db.connect()
    if err is not None:
        print(err)
        return jsonify({"error": "could not connect to database"}), 500
    customer = db.get_customer_by_email(request.json["email"])

    if customer == None:
        db.disconnect()
        return jsonify({"error": "incorrect credentials"}), 403
    email = getattr(customer, "email")
    password_hash = getattr(customer, "password")
    correctPassword = verify_password(request.json["password"], password_hash)

    role = db.get_role(email)
    db.disconnect()

    if role == None:
        print(err)
        return jsonify({"error": "incorrect credentials"}), 403

    if correctPassword:
        return jsonify({
            "token":
            "Bearer " + create_access_token(
                identity=[email, role],
                expires_delta=datetime.timedelta(minutes=jwt_lifespan_minutes))
        }), 200
    return jsonify({"error": "incorrect credentials"}), 403
Exemple #3
0
def test_add_diner(client, body, error_msg, status):

    print(f"*** Inside test_add_diner ***")

    db = PgInstance()
    err = db.connect()
    assert err == None
    client = app.test_client()  # Redefine to get new config

    url = '/api/signup/diner'

    # test if existing email already exists in customer table by pre-inserting diner
    if body["email"] == "*****@*****.**":
        client.post(url, data=json.dumps(body), headers=headers)

    res = client.post(url, data=json.dumps(body), headers=headers)

    if res.json == None:
        return
    if "error" in res.json:
        assert res.json["error"] == error_msg
    else:
        assert "success" in res.json
        diner = db.get_diner_by_email(body["email"])
        assert body["name"] == getattr(diner, 'name')

    assert res.status_code == status
    assert res.content_type == mimetype

    db.disconnect()
Exemple #4
0
def sign_up_customer():
    # Create customer
    errors = {}
    # email sanitization
    if not validate_email(request.json["email"]):  # , verify=True):
        errors["email"] = "must be valid"
    # name sanitization
    name = request.json["name"]
    if len(name) < 1 or len(name) > 72:
        errors["name"] = "must be between 1 and 72 characters"
    # phone sanitization
    phone = request.json["phone"]
    if not phonenumbers.is_valid_number(
            phonenumbers.parse("+1" + str(phone), None)):
        errors["phone"] = "must be valid"
    if len(errors) > 0:
        return jsonify(errors), 400

    db = PgInstance()
    err = db.connect()
    if err != None:
        print(err)
        return jsonify({"error": "could not connect to database"}), 500
    err = db.create_customer(
        request.json["email"].lower(), request.json["name"], [phone], False
    )  # by default single phone #, only restaurants should have multiple
    db.disconnect()
    if err != None:
        return {"error": err}, 401

    return get_otp(request.json["email"])
Exemple #5
0
def sign_up_restaurant():
    restaurant_name, address, name, email, phone = \
        (request.json[field] for field in ('restaurantName', 'restaurantAddress', 'name', 'email', 'phone'))

    validation_errors = []
    if len(restaurant_name) < 1 or len(restaurant_name) > 72:
        validation_errors.append(
            "Restaurant Name must be between 1 and 72 characters")
    # better address validation?
    if len(name) < 1 or len(name) > 72:
        validation_errors.append("Must be a valid US address")
    if len(name) < 1 or len(name) > 72:
        validation_errors.append("Name must be between 1 and 72 characters")
    if not validate_email(email):
        validation_errors.append("Invalid Email")
    if not phonenumbers.is_valid_number(
            phonenumbers.parse("+1" + str(phone), None)):
        validation_errors.append("Invalid phone number")

    if len(validation_errors) > 0:
        err = " | ".join(validation_errors)
        return jsonify({"error": err, "errorMessage": err}), 400

    db = PgInstance()
    err = db.connect()
    if err != None:
        print(
            "ERROR: could not connect to database trying to sign up restaurant:\n",
            err)
        return jsonify({"error": err, "errorMessage": contact_open_meal}), 500

    # create Customer
    err = db.create_customer(email.lower(), name, [phone],
                             hash_password("password"), False)
    err_source = "customer"

    if not err:
        # create Restaurant
        err = db.create_restaurant(email, address, restaurant_name)
        err_source = "restaurant"

    db.disconnect()
    if not err:
        return jsonify({
            "token":
            "Bearer " + create_access_token(
                identity=[email, "Business"],
                expires_delta=datetime.timedelta(minutes=jwt_lifespan_minutes))
        }), 201
    else:
        return jsonify({
            "error": err + " (" + err_source + " table)",
            "errorMessage": err
        }), 400
Exemple #6
0
def sign_up_diner():
    name, email, phone, password, image_url = \
        (request.json[field] for field in ('name', 'email', 'phone', 'password', 'imageURL'))

    # validate data
    # (already done on front end but 2nd level of safety here in case FE/BE mismatch)
    validation_errors = []
    if not validate_email(email):  # , verify=True):
        validation_errors.append("Invalid Email")
    if len(name) < 1 or len(name) > 72:
        validation_errors.append("Name must be between 1 and 72 characters")
    if not phonenumbers.is_valid_number(
            phonenumbers.parse("+1" + str(phone), None)):
        validation_errors.append("Invalid phone number")
    if validate_password(password) != None:
        validation_errors.append("Invalid password")
    if not image_url:
        validation_errors.append("No image provided")

    if len(validation_errors) > 0:
        err = " | ".join(validation_errors)
        return jsonify({"error": err, "errorMessage": err}), 400

    db = PgInstance()
    err = db.connect()
    if err != None:
        print(
            "ERROR: could not connect to database trying to sign up diner:\n",
            err)
        return jsonify({"error": err, "errorMessage": contact_open_meal}), 500

    # create Customer
    err = db.create_customer(
        email.lower(), name, [phone], hash_password(password)
    )  # by default single phone #, only restaurants should have multiple
    err_source = "customer"

    if not err:
        # create Recipient
        err = status = db.create_recipient(email, image_url)
        err_source = "recipient"

    db.disconnect()
    if not err:
        return jsonify({"success": "Diner successfully created"}), 201
        #return jsonify({"token": "Bearer " + create_access_token(identity=[email, "Recipient"], expires_delta=datetime.timedelta(minutes=jwt_lifespan_minutes))}), 201
    else:
        return jsonify({
            "error": f"{err} ({err_source} table)",
            "errorMessage": err
        }), 400
Exemple #7
0
def get_otp(email, resetPassword=False):
    otp, expiration = generate_otp()

    # Create OTP
    db = PgInstance()
    err = db.connect()
    if err is not None:
        print(err)
        return jsonify({"error": "could not connect to database"}), 500
    db.save_verification_code(email, otp, expiration)
    db.disconnect()

    # Send the email
    title = "Welcome to OpenMeal!"
    if resetPassword:
        title = "OpenMeal: Reset Password"

    mail_sent = send_email(email, title, "Your one-time password is: " + otp)

    if mail_sent is not None:
        return jsonify(mail_sent), 535

    return jsonify({"general": "otp email sent"}), 201
Exemple #8
0
def received_text(event):
    # the FB ID of the person sending the message
    sender_id = event["sender"]["id"]
    bot.send_action(sender_id, "mark_seen")
    # Attempt to get text
    try:
        text = event["message"]["text"]
    except:
        bot.send_text_quick_replies(
            sender_id, "I didn't quite understand.", quick_replies_list)
        return
    # Attempt to get payload
    payload = None
    try:
        payload = event["message"]["quick_reply"]["payload"]
    except:
        pass
    # If payload exists and is a quick reply
    if payload != None and payload.split("_")[0] == "qr":
        if payload.split("_")[1] == "set":  # set commands require a text follow-up
            PREVIOUS_PAYLOAD_DICT[sender_id] = payload
            selected_info = payload.split("_")[2]
            inquiry_msg = dialog.get_inquiry_msg(selected_info)
            bot.send_text_quick_replies(
                sender_id, inquiry_msg, quick_replies_list)
        else:
            # Connect to db
            db = PgInstance(PSQL_LOGIN_CMD, sender_id)
            err = db.Connect()
            if err != None:
                print(err)
                bot.send_text_quick_replies(
                    sender_id, "Error connecting to db", quick_replies_list)  # replace this eventually
                return
            db_response, user_err_msg, err = dialog.handle_quick_replies(
                payload, text, db, bot.get_user_info(sender_id, ["timezone"]))
            # Check for err from SQL query
            if err != None:
                print(err)
                bot.send_text_quick_replies(
                    sender_id, "Error with sql query", quick_replies_list)  # replace this eventually
                return
            # Disconnect from db
            err = db.Disconnect()
            if err != None:
                print(err)
                bot.send_text_quick_replies(
                    sender_id, "Error disconnecting from db", quick_replies_list)  # replace this eventually
                return
            # Send db query response to user
            if db_response != "":
                bot.send_text_quick_replies(
                    sender_id, db_response, quick_replies_list)
    elif sender_id in PREVIOUS_PAYLOAD_DICT:
        previous_payload = PREVIOUS_PAYLOAD_DICT[sender_id]
        del PREVIOUS_PAYLOAD_DICT[sender_id]
        # Connect to db
        db = PgInstance(PSQL_LOGIN_CMD, sender_id)
        err = db.Connect()
        if err != None:  # Successful connection
            print(err)
            bot.send_text_quick_replies(
                sender_id, "Error connecting to db", quick_replies_list)  # replace this eventually
            return
        db_response, user_err_msg, err = dialog.handle_quick_replies(
            previous_payload, text, db, bot.get_user_info(sender_id, ["timezone"]))
        # Check for user_err_msg
        if user_err_msg != None:
            bot.send_text_quick_replies(
                sender_id, user_err_msg, quick_replies_list)
        # Check for err from SQL query
        if err != None:
            print(err)
            bot.send_text_quick_replies(
                sender_id, "Error with sql query", quick_replies_list)  # replace this eventually
            return
        # Send db query response to user
        if db_response != "":
            bot.send_text_quick_replies(
                sender_id, db_response, quick_replies_list)
        # Send checklist message
        checklist_msg = dialog.get_checklist(db)
        bot.send_text_quick_replies(
            sender_id, "Checklist status:\n" + checklist_msg, quick_replies_list)
        # Disconnect from db
        err = db.Disconnect()
        if err != None:
            print(err)
            bot.send_text_quick_replies(
                sender_id, "Error disconnecting from db", quick_replies_list)  # replace this eventually
            return
    else:
        bot.send_text_quick_replies(
            sender_id, "Please use one of the options below to communicate with me!", quick_replies_list)
Exemple #9
0
def sign_up_donor():
    db = PgInstance()
    err = db.connect()
    if err is not None:
        print(err)
        return jsonify({"error": "could not connect to database"}), 500

    # verify email
    otp_record = db.get_otp_email(request.json["otp"])
    if otp_record == None:
        db.disconnect()
        return jsonify({"error": "invalid email"}), 400
    email = getattr(otp_record, "email")
    print(otp_record)
    # verify otp
    valid_otp = db.verify_otp(email, request.json["otp"])
    if not valid_otp:
        db.disconnect()
        return jsonify({"error": "invalid otp"}), 400
    # create recipient
    print(request.json)
    err = db.create_recipient(email)
    if err != None:
        db.disconnect()
        return jsonify({"error": err}), 400

    db.disconnect()
    return jsonify({
        "token":
        "Bearer " + create_access_token(
            identity=[email, "Donor"],
            expires_delta=datetime.timedelta(minutes=jwt_lifespan_minutes))
    }), 201
Exemple #10
0
def sign_up_recipient():
    db = PgInstance()
    err = db.connect()
    if err is not None:
        print(err)
        return jsonify({
            "error": "could not connect to database",
            "errorMessage:": contact_open_meal
        }), 500

    # # verify email
    # otp_record = db.get_otp_email(request.json["otp"])
    # if otp_record == None:
    #     db.disconnect()
    #     return jsonify({"error": "invalid email"}), 400
    # email = getattr(otp_record, "email")
    # print(otp_record)
    # verify otp
    email = request.json["email"]
    valid_otp = db.verify_otp(request.json["email"], request.json["otp"])
    if not valid_otp:
        db.disconnect()
        return jsonify({
            "error":
            "invalid otp",
            "errorMessage":
            "Incorrect one-time password.  Please try again."
        }), 400
    # create recipient
    print(request.json)
    err = db.create_recipient(email)
    if err != None:
        db.disconnect()
        return jsonify({"error": err, "errorMessage": contact_open_meal}), 400

    db.disconnect()
    return jsonify({
        "token":
        "Bearer " + create_access_token(
            identity=[email, "Recipient"],
            expires_delta=datetime.timedelta(minutes=jwt_lifespan_minutes))
    }), 201