api.py (2385B)
1 from flask import Blueprint, request, abort, make_response, session 2 3 from blueprints.utils import crypto 4 from blueprints.utils import database 5 from . import response 6 from . import validation_schemas as schemas 7 import logging 8 9 api_bp = Blueprint('api', __name__) 10 11 12 @api_bp.route("/") 13 def index(): 14 return "<h1>Welcome to the Chicken Parmesan API</h1>" 15 16 17 @api_bp.route("/login", methods=["POST"]) 18 def login(): 19 errors = schemas.CredentialSchema().validate(request.json) 20 if errors: 21 return response.create_response(errors, 400) 22 23 login_data = schemas.CredentialSchema().load(request.json) 24 25 if database.is_banned(login_data["username"]): 26 logging.warning(f"User {login_data['username']} tried to login while banned") 27 return abort(403) 28 29 if not database.login_user(login_data["username"], login_data["password"]): 30 logging.warning(f"User {login_data['username']} tried to login with invalid credentials") 31 return response.create_response({"message": "Invalid credentials!"}, 400) 32 33 resp = make_response({"message": "Login successful!"}) 34 resp.status_code = 200 35 session["jwt-token"] = crypto.create_jwt(login_data["username"]) 36 37 logging.info(f"User {login_data['username']} logged in") 38 return resp 39 40 41 @api_bp.route("/register", methods=["POST"]) 42 def register(): 43 errors = schemas.CredentialSchema().validate(request.json) 44 if errors: 45 return response.create_response(errors, 400) 46 47 register_data = schemas.CredentialSchema().load(request.json) 48 49 if not database.register_user(register_data["username"], register_data["password"]): 50 logging.warning(f"User {register_data['username']} tried to register with an already taken username") 51 return response.create_response({"message": "Username already taken!"}, 400) 52 53 logging.info(f"User {register_data['username']} registered") 54 return response.create_response({"message": "Registration successful!"}, 201) 55 56 57 @api_bp.route("/logout", methods=["GET"]) 58 @crypto.require_token 59 def logout(jwt_data): 60 if not database.logout_user(jwt_data["username"]): 61 logging.error(f"Could not log out user {jwt_data['username']}") 62 return abort(500) 63 64 resp = make_response({"message": "Logout successful!"}) 65 resp.status_code = 200 66 session.clear() 67 68 logging.info(f"User {jwt_data['username']} logged out") 69 return resp