def post_account_login():
    """
        First we need to verify the request contains a username and a password
        if not, then we must display an error.
        :return:
    """
    app.logger.info('Reading credentials from request...')
    username = request.form['username']
    password = request.form['password']

    if username is None:
        return render_template("authentication/login.html",
                               error="Debe proporcionar un usuario")
    if password is None:
        return render_template("authentication/login.html",
                               error="Debe proporcionar una contrasena")

    app.logger.info('Credentials OK, now authenticating...')

    user = get_user_by_username(username)
    if user is None:
        return render_template(
            "authentication/login.html",
            error="No se ha encontrado el usuario proporcionado")

    if user.authenticate(password):
        app.logger.info('Credentials are correct...')
        session['logged_in'] = True
        login_user(user)
        return redirect(url_for('get_dashboard_root'))
    else:
        app.logger.info('Credentials are not correct...')
        error = "Su contraseƱa no es correcta"
        return render_template("authentication/login.html", error=error)
def post_add_band():
    
    try:

        band = Band(
            band_id = uuid.uuid4(),
            name = request.form['name'],
            description = request.form['description'],
            genres = request.form['genres'],
            logo_url = request.form['logo']
            
        )
        
        band.set_founded(
            day = request.form['day'],
            month = request.form['month'],
            year = request.form['year']
        )
        band.save()
        user = get_user_by_username(current_user.username)
        user.bands.connect(band)
        user.save()
        band.members.connect(user)
        band.save()
        return redirect(url_for('get_dashboard_root'))
    except Exception as e:
        print(e)
        return render_template(
            "band/add.html", 
            error= "Error processing request"
        )
def post_account():

    # First we verify the request is an actual json request. If not, then we
    # responded with a HTTP 400 Bad Request result code.
    if not request.is_json:
        app.logger.warning(
            'Request without JSON payload received on token endpoint')
        return jsonify({"msg": "Only JSON request is supported"}), 400

    # If we get here, is because the request contains valid json so we can
    # parse the parameters
    account_data = request.get_json()

    if 'username' in account_data and get_user_by_username(
            user_name=account_data['username']) is not None:
        return jsonify({"msg": "The provided username is not valid"}), 400

    user = create_user(account_data=account_data)

    # Now we verify that all required values are present and build a new instance
    # of user. If the instance is None, then one of the validations failed so
    # an HTTP BAD REQUEST status code should be returned
    if user is not None:
        # We try to create an instance
        try:
            # We try to persist the user account in Mongo Database
            user.save()

            return jsonify({
                'user_id': user.user_id,
                'username': user.username
            }), 201
        except NotUniqueError as nue:
            app.logger.error(
                "A request tried to use an already existing username.")
            return jsonify({"msg": "Username or email are not available"}), 400
        except ValidationError as ve:
            app.logger.error(
                "An error occurred while trying to create a user account. Error: "
                + ve.message)
            return jsonify({"msg": "The request failed to validate"}), 400
        except:
            app.logger.error(
                "An error occurred while trying to create a user account. Error: "
                + str(sys.exc_info()[0]))
            return jsonify({
                "msg":
                "The server cannot complete the account creation process"
            }), 500
    else:
        return jsonify({
            "msg":
            "One or more of the required values is not present in the request"
        }), 400
def get_dashboard_root():
    """
        Gets the main application dashboard view if the user is already 
        authenticated.
        :return: Status response json
    """

    user = get_user_by_username(current_user.username)
    bands = user.bands.all()

    return render_template("dashboard/index.html", bands=bands)
def post_token():
    """
        Receives authentication credentials in order to generate an access
        token to be used to access protected models. Tokens generated
        by this endpoint are JWT Tokens.
    """

    # First we verify the request is an actual json request. If not, then we
    # responded with a HTTP 400 Bad Request result code.
    if not request.is_json:
        app.logger.warning(
            'Request without JSON payload received on token endpoint')
        return jsonify({"msg": "Only JSON request is supported"}), 400

    # Read credentials from json request
    params = request.get_json()

    # Try to ready username and password properties. If one of them is not found,
    # then we generate an error and stop execution.

    username = params.get('username', None)
    password = params.get('password', None)

    if not username:
        app.logger.warning(
            'Request without username parameter received on token endpoint')
        return jsonify({"msg": "A username parameter must be provided"}), 400
    if not password:
        app.logger.warning(
            'Request without password parameter received on token endpoint')
        return jsonify({"msg": "A password parameter must be provided"}), 400

    # If we get here, is because a username and password credentials were
    # provided, so now we must verify them.

    user = get_user_by_username(username)

    if user is not None:
        if user.authenticate(password):

            # ACCESS TOKEN
            access_token_expires = app.config[
                'JWT_ACCESS_TOKEN_VALIDITY_HOURS']
            access_token = create_access_token(
                identity=user.user_id, expires_delta=access_token_expires)

            # REFRESH TOKEN
            refresh_token_expires = app.config[
                'JWT_REFRESH_TOKEN_VALIDITY_DAYS']
            refresh_token = create_refresh_token(
                identity=user.user_id, expires_delta=refresh_token_expires)

            app.logger.info('A new token has been generated for user [' +
                            user.user_id + "]")

            return jsonify({
                'access_token': access_token,
                'expiration': access_token_expires.total_seconds(),
                'refresh_token': refresh_token
            }), 200
    else:
        app.logger.warning('Request with invalid username was received')
        return jsonify(
            {"msg":
             "Unable to find user with [" + username + "] username"}), 404