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
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
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
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
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
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)
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
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
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)
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
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