Ejemplo n.º 1
0
def get_health():
    payload = {}
    code = 200

    try:
        db.polls.find_one()
        payload["mongo_db"] = "success"
    except:  # pylint: disable=W0702
        payload["mongo_db"] = "failure"
        code = 400

    try:
        payload["logins"] = rd.get("counters:logins") or 0
        payload["logins_success"] = rd.get("counters:logins:success") or 0
        payload["logins_failure"] = rd.get("counters:logins:failure") or 0

        payload["polls"] = rd.get("counters:polls") or 0
        payload["votes"] = rd.get("counters:votes") or 0

        payload["limit_hit"] = rd.get("counters:limit_hit") or 0

        payload["redis_db"] = "success"
    except:  # pylint: disable=W0702
        payload["redis_db"] = "failure"
        code = 502

    return return_json(payload), code
Ejemplo n.º 2
0
def get_polls():
    user_id = get_jwt_identity()

    user_polls = []
    for poll in db.polls.find({"_user_id": user_id}):
        user_polls.append(poll)

    return return_json(user_polls), 200
Ejemplo n.º 3
0
def delete_poll(poll_id):
    user_id = ObjectId(get_jwt_identity())

    if not ObjectId.is_valid(poll_id):
        return return_error("Invalid ID format!")

    db.polls.delete_one({"_id": ObjectId(poll_id), "_user_id": str(user_id)})

    return return_json(""), 204
Ejemplo n.º 4
0
def register_user(payload):
    if db.users.find_one({"email": payload["email"]}):
        return return_error("Email address is already in use!", 400)

    payload["salt"], payload["password"] = generate_hash(payload["password"])

    db.users.insert_one(payload)

    rd.incr("counters:registers:success")
    return return_json(""), 204
Ejemplo n.º 5
0
def get_poll(poll_id):

    if not ObjectId.is_valid(poll_id):
        return return_error("Invalid ID format!")

    poll = db.polls.find_one({"_id": ObjectId(poll_id)})
    if not poll:
        return return_error("Poll not found!", 404)

    return return_json(poll), 200
Ejemplo n.º 6
0
def get_logged_user():
    user = db.users.find_one({"_id": ObjectId(get_jwt_identity())}, {
        "password": 0,
        "salt": 0
    })

    if not user:
        return return_error("User not found!", 404)

    return return_json(user)
Ejemplo n.º 7
0
def update_password(payload):
    user_id = ObjectId(get_jwt_identity())
    user = db.users.find_one({"_id": user_id})

    if not user:
        return return_error("User not found!", 404)

    user["salt"], user["password"] = generate_hash(payload["password"])

    db.users.replace_one({"_id": user["_id"]}, user)

    return return_json(""), 204
Ejemplo n.º 8
0
def login_user(payload):
    rd.incr("counters:logins")
    user = db.users.find_one({"email": payload["email"]})

    if not user:
        rd.incr("counters:logins:failure")
        return return_error("Invalid credentials!", 401)

    password_hash = hashlib.pbkdf2_hmac("sha256",
                                        payload["password"].encode("utf-8"),
                                        user["salt"], 100000)

    if password_hash != user["password"]:
        rd.incr("counters:logins:failure")
        return return_error("Invalid credentials!", 401)

    jwt_token = create_access_token(identity=str(user["_id"]))

    rd.incr("counters:logins:success")
    return return_json({"jwt_token": jwt_token}), 200
Ejemplo n.º 9
0
def update_logged_user(payload):
    user_id = ObjectId(get_jwt_identity())
    user = db.users.find_one({"_id": user_id})

    # Check if Email is already used.
    if db.users.find_one({
            "_id": {
                "$ne": user_id
            },
            "email": payload.get("email")
    }):
        return return_error("Email address is already in use!", 400)

    user.update(payload)
    db.users.replace_one({"_id": user_id}, user)

    del user["salt"]
    del user["password"]

    return return_json(user)
Ejemplo n.º 10
0
def create_poll(payload):
    user_id = get_jwt_identity()
    poll = {}

    # Tag poll if user is logged.
    if user_id:
        poll["_user_id"] = user_id
        poll["name"] = db.users.find_one({"_id": ObjectId(user_id)})["name"]
    else:
        poll["name"] = "Anonymous"

    poll["voters"] = []
    poll["created_at"] = time.time()
    poll["question"] = payload["question"]

    # Prepare options database scheme.
    poll["options"] = []
    for option in payload["options"]:
        poll["options"].append({"name": option, "votes": 0})

    db.polls.insert_one(poll)
    rd.incr("counters:polls")
    return return_json(poll), 201
Ejemplo n.º 11
0
def vote_poll(payload, poll_id):
    if not ObjectId.is_valid(poll_id):
        return return_error("Invalid ID format!")

    poll = db.polls.find_one({"_id": ObjectId(poll_id)})

    if not poll:
        return return_error("Poll not found!", 404)

    # Check if user fingerprint already in database.
    if payload["fingerprint"] in poll["voters"]:
        return return_error("You already voted in that poll!")

    poll["voters"].append(payload["fingerprint"])

    try:
        poll["options"][payload["option_id"]]["votes"] += 1
    except IndexError:
        return return_error("Option Id out of polls bounds!")

    db.polls.replace_one({"_id": ObjectId(poll_id)}, poll)

    rd.incr("counters:votes")
    return return_json(poll), 201