Guest User

Untitled

a guest
Dec 21st, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. """define methods to handle /api/v1/auth/ routes"""
  2. from flask import Blueprint, request, jsonify, make_response, current_app
  3. from API.app.v2.utils.exeptions import MalformedRequest
  4. from API.app.v2.models.users import Users
  5. from werkzeug.security import check_password_hash
  6. from flask_jwt_extended import jwt_required, create_access_token
  7. from API.app.v2.utils.validation import login_schema, signup_schema
  8. from cerberus import Validator
  9. from psycopg2 import ProgrammingError
  10.  
  11.  
  12. BP = Blueprint('auth', __name__, url_prefix='/api/v2/auth/')
  13. INVALID_JSON_MSG = 'Malformed Request data.Please use JSON data'
  14.  
  15.  
  16. @BP.errorhandler(MalformedRequest) # register MalfromedRequest handler
  17. def handle_malformed_request(error):
  18. """handle malformed request, missing json or malformed json"""
  19. response = jsonify(error.to_dict())
  20. response.status_code = error.status_code
  21. return response
  22.  
  23.  
  24. @BP.errorhandler(ProgrammingError) # register DataBaseError handler
  25. def handle_database_errors(error):
  26. """handle database errors"""
  27. response = jsonify({
  28. 'message': "Application error. Please try again later."
  29. })
  30. response.status_code = 500
  31. """Log the error"""
  32. current_app.logger.error(f'A database error occured. {error}')
  33. return response
  34.  
  35.  
  36. @BP.route('login', methods=['POST'])
  37. def login():
  38. """method to process POST /login request"""
  39. if request.method == 'POST':
  40. credentials = request.get_json(force=True, silent=True)
  41. if not credentials:
  42. raise MalformedRequest(INVALID_JSON_MSG) # return bad request
  43. v = Validator(login_schema, allow_unknown=True)
  44. r = v.validate(credentials)
  45. errors = v.errors
  46. errors['message'] = 'Please correct the indicated errors'
  47. if not r:
  48. return make_response(jsonify(errors), 400)
  49. username = credentials['username'].lower()
  50. password = credentials['password']
  51. users = Users()
  52. result = users.get_user(username)
  53. if not result:
  54. return make_response(jsonify({
  55. 'message': 'Invalid Username or Password'
  56. }), 401)
  57. return make_response(jsonify({
  58. 'message': 'Login Successfull',
  59. 'access_token': create_access_token(identity=username)
  60. }), 200) if check_password_hash(result['password'], password) else \
  61. make_response(jsonify({
  62. 'message': 'Invalid Username or Password'
  63. }), 401)
  64.  
  65.  
  66. @BP.route('signup', methods=['POST'])
  67. def signup():
  68. """method to process POST to /signup"""
  69. if request.method == 'POST':
  70. credentials = request.get_json(force=True, silent=True)
  71. if not credentials:
  72. raise MalformedRequest(INVALID_JSON_MSG) # return BADREQUEST
  73. validator = Validator(signup_schema, allow_unknown=True)
  74. valid = validator.validate(credentials)
  75. errors = validator.errors
  76. errors[' message'] = 'Please Fix the indicated errors'
  77. if not valid:
  78. return make_response(jsonify(errors), 400)
  79. password = credentials['password']
  80. conf_password = credentials['confirm_password']
  81. f_name = credentials['first_name']
  82. l_name = credentials['last_name']
  83. username = credentials['username'].lower()
  84. email = credentials['email_address'].lower()
  85. if password != conf_password:
  86. raise MalformedRequest('Passwords do not match', 400)
  87. users = Users()
  88. result = users.get_user(username) # check username
  89. if result:
  90. return make_response(jsonify({
  91. 'message': 'Username already exists'
  92. }), 409)
  93. result = users.get_email(email) # check email
  94. if result:
  95. return make_response(jsonify({
  96. 'message': 'Email address already registered'
  97. }), 409)
  98. result = users.add_user({
  99. 'username': username,
  100. 'password': password,
  101. 'email_address': email,
  102. 'first_name': f_name,
  103. 'last_name': l_name,
  104. })
  105. return make_response(jsonify({
  106. 'message': 'Signup Successful'
  107. }), 201)
Add Comment
Please, Sign In to add comment