Skip to content
Snippets Groups Projects
users.py 4.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • Victor Löfgren's avatar
    Victor Löfgren committed
    import datetime
    
    
    from app import db
    from app.api import api_blueprint
    from app.database.models import Blacklist, User
    from app.utils.validator import edit_user_schema, login_schema, register_schema, validateObject
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    from flask import request
    
    from flask.globals import session
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    from flask_jwt_extended import (
        create_access_token,
        create_refresh_token,
        get_jwt_identity,
        get_raw_jwt,
    
        jwt_refresh_token_required,
        jwt_required,
    
    Victor Löfgren's avatar
    Victor Löfgren committed
    )
    
    
    def get_current_user():
        return User.query.filter_by(id=get_jwt_identity()).first()
    
    
    @api_blueprint.route("/users/test", methods=["GET"])
    def test():
        return {"message": "hello teknik8"}, 200
    
    
    @api_blueprint.route("/users/test_auth", methods=["GET"])
    @jwt_required
    def test_auth():
        return {"message": "you are authenticated"}, 200
    
    
    @api_blueprint.route("/users/login", methods=["POST"])
    def login():
        json_dict = request.get_json(force=True)
    
        validate_msg = validateObject(login_schema, json_dict)
        if validate_msg != None:
            return {"message": validate_msg}, 400
    
        email = json_dict["email"]
        password = json_dict["password"]
        user = User.query.filter_by(email=email).first()
    
        # Dont show the user that the email was correct unless the password was also correct
        if not user:
            return {"message": "The email or password you entered is incorrect."}, 401
    
        if not user.is_correct_password(password):
            return {"message": "The email or password you entered is incorrect."}, 401
    
        expires = datetime.timedelta(days=7)
        access_token = create_access_token(identity=user.id, expires_delta=expires)
        refresh_token = create_refresh_token(identity=user.id)
        return (
            {"id": user.id, "access_token": access_token, "refresh_token": refresh_token},
            200,
        )
    
    
    @api_blueprint.route("/users/logout", methods=["POST"])
    @jwt_required
    def logout():
        jti = get_raw_jwt()["jti"]
    
        db.session.add(Blacklist(jti))
        db.session.commit()
        return {"message": "message fully logged out"}, 200
    
    
    @api_blueprint.route("/users/refresh", methods=["POST"])
    @jwt_refresh_token_required
    def refresh():
        current_user = get_jwt_identity()
        ret = {"access_token": create_access_token(identity=current_user)}
        return ret, 200
    
    
    @api_blueprint.route("/users/", methods=["POST"])
    def create():
        json_dict = request.get_json(force=True)
    
        validate_msg = validateObject(register_schema, json_dict)
        if validate_msg != None:
            return {"message": validate_msg}, 400
    
        existing_user = User.query.filter_by(email=json_dict["email"]).first()
    
        if existing_user != None:
            return {"message": "User already exists"}, 400
    
        user = User(json_dict["email"], json_dict["password"])
        db.session.add(user)
        db.session.commit()
    
        return user.get_dict(), 200
    
    
    @api_blueprint.route("/users/", methods=["PUT"])
    @jwt_required
    def edit():
        json_dict = request.get_json(force=True)
    
        validate_msg = validateObject(edit_user_schema, json_dict)
        if validate_msg != None:
            return {"message": validate_msg}, 400
    
        user = get_current_user()
        user.name = json_dict["name"].title()
    
        db.session.commit()
        return user.get_dict(), 200
    
    
    @api_blueprint.route("/users/", methods=["DELETE"])
    @jwt_required
    def delete():
        user = get_current_user()
        db.session.delete(user)
        jti = get_raw_jwt()["jti"]
        db.session.add(Blacklist(jti))
        db.session.commit()
        return {"message": "User was deleted"}, 200
    
    
    ###
    # Getters
    ###
    @api_blueprint.route("/users/", defaults={"UserID": None}, methods=["GET"])
    @api_blueprint.route("/users/<int:UserID>", methods=["GET"])
    @jwt_required
    def get(UserID):
    
        if UserID:
            user = User.query.filter_by(id=UserID).first()
        else:
            user = get_current_user()
    
        if not user:
            return {"message": "User not found"}, 404
    
        return user.get_dict(), 200
    
    
    # Searchable, returns 10 max at default
    @api_blueprint.route("/users/search", methods=["GET"])
    def search():
        arguments = request.args
        query = User.query
    
        if "name" in arguments:
            query = query.filter(User.name.like(f"%{arguments['name']}%"))
    
        if "email" in arguments:
            query = query.filter(User.email.like(f"%{arguments['email']}%"))
    
        if "page" in arguments:
            page_size = 15
            if "page_size" in arguments:
                page_size = int(arguments["page_size"])
            query = query.limit(page_size)
            query = query.offset(int(arguments["page"]) * page_size)
        else:
            query = query.limit(15)
    
        return [i.get_dict() for i in query.all()], 200