diff --git a/hodor/controllers/user.py b/hodor/controllers/user.py index 084cd2fac8dc66af54c6a29ded18aea61fa998f1..e894e820ac13ceab462d482e1e7a58022bc1a873 100644 --- a/hodor/controllers/user.py +++ b/hodor/controllers/user.py @@ -10,7 +10,7 @@ from sqlalchemy.exc import IntegrityError def get_all_users(): # TODO: Authentication for calling this API endpoint. Admin only. """ - This function iterates the database to find all users and returns it as JSON. + This function iterates the database to find all users and returns as JSON :return: Response Code """ response = dict() @@ -20,8 +20,8 @@ def get_all_users(): for user in User.get_all(): current_user = dict() ''' - This can be done by directly dumping the dictionary but there's always a risk of data leak. - So, we pick what we need to give out out of the API. + This can be done by directly dumping the dictionary but there's always + a risk of data leak.So, we pick what we need to give out out of the API ''' current_user['username'] = user.username current_user['first_name'] = user.first_name @@ -33,7 +33,8 @@ def get_all_users(): return response -@app.route('/users/new', methods=['GET', 'POST']) +# Register a user +@app.route('/users/new', methods=['POST']) def add_new_user(): """ This function adds a new user @@ -48,21 +49,61 @@ def add_new_user(): newuser['last_name'] = str(request.data.get('last_name').strip()) newuser['email'] = str(request.data.get('email').strip()) newuser['password'] = str(request.data.get('password').strip()) - newuser['verification_code'] = str(request.data.get('verification_code').strip()) + newuser['verification_code'] = str(request.data.get( + 'verification_code').strip()) except Exception as e: print(e) abort(500) user = User(**newuser) user.save() - return make_response(jsonify(status=201, msg="User {} successfully added to database".format(user.username)), 201) + return make_response(jsonify(status=201, msg="User {} successfully added" + + "to database".format(user.username)), 201) + + +################################################# +# Check for an existing user in the database # +################################################# +@app.route('/users/check', methods=['POST']) +def check_for_existing_user(): + errors = [] + # If the username field is passed, checl the username field. + if request.data.get('username'): + check_username = str(request.data.get('username').strip()) + user_checkuser = User.query.filter_by(username=check_username).first() + if user_checkuser: + errors.append({ + 'field': 'username', + 'error': '{} is taken'.format(check_username) + }) + del(user_checkuser) + + # If the email field is set, check for duplicate email + if request.data.get('email'): + check_email = str(request.data.get('email').strip()) + user_checkmail = User.query.filter_by(email=check_email).first() + if user_checkmail: + errors.append({ + 'field': 'email', + 'error': '{} exists in the database'.format(check_email) + }) + + if errors: + return make_response(jsonify(status=400, err=errors), 400) + else: + return jsonify( + status=200, + msg="ok" + ) @app.errorhandler(IntegrityError) def handle_sqlalchemy_assertion_error(err): try: ''' - err.orig.args is from the DBAPIError class of SQLAlchemy. It usually contains the original error message. - The below is an attempt to clean up the message and only return the relevant part to API + err.orig.args is from the DBAPIError class of SQLAlchemy. It usually + contains the original error message. + The below is an attempt to clean up the message and only return the + relevant part to API ''' errmsg = err.orig.args[0].split('\n')[1][9:] except IndexError: