Пример #1
0
def handler(event, context):
    """AWS lambda event handler"""
    logger.debug('Handling event "%s". Context: "%s"', event, context)

    try:
        authorization_token = extract_bearer_token_from_api_event(event)
    except LookupError as e:
        return generate_api_gateway_response(
            400, body={'message': 'Missing or invalid authorization.'})

    body = json.loads(event['body'])
    try:
        redirect_uri = body['redirectUri']
    except KeyError:
        return generate_api_gateway_response(
            400,
            body={'message': 'Request must contain a "redirectUri" field'})

    spotify_client_id = os.environ['SPOTIFY_CLIENT_ID']
    spotify_client_secret = decrypt_kms_string(
        os.environ['SPOTIFY_CLIENT_SECRET'])

    try:
        refresh_token, access_token = fetch_spotify_refresh_token(
            authorization_token, redirect_uri, spotify_client_id,
            spotify_client_secret)
    except requests.HTTPError:
        return generate_api_gateway_response(401)

    return generate_api_gateway_response(200,
                                         body={
                                             'refreshToken': refresh_token,
                                             'accessToken': access_token
                                         })
Пример #2
0
def handler(event, context):
    """AWS lambda event handler"""
    logger.debug('Handling event "%s". Context: "%s"', event, context)

    try:
        access_token = extract_bearer_token_from_api_event(event)
    except LookupError as e:
        return generate_api_gateway_response(400, body={'message': 'Missing or invalid authorization'})

    body = json.loads(event['body'])
    try:
        playlist_uri = body['playlistUri']
        souffle_by = body['souffleBy']
    except LookupError as e:
        return generate_api_gateway_response(400, body={'message': 'Missing field: "{}".'.format(e)})

    try:
        spotify = SpotifyGateway(access_token)
    except SouffleSpotifyError as e:
        return generate_spotify_exception_response(e)

    try:
        souffled_playlist_uri = souffle_playlist(spotify, playlist_uri, souffle_by, dt.now())
    except SouffleParameterError as e:
        return generate_api_gateway_response(400, body={'message': e})
    except SouffleSpotifyError as e:
        return generate_spotify_exception_response(e)

    return generate_api_gateway_response(201, headers={'Location': f'spotify:playlist:{souffled_playlist_uri}'})
Пример #3
0
def generate_spotify_exception_response(exception):
    """Generate an api gateway response based on a spotify exception."""
    if exception.http_status == 401:
        return generate_api_gateway_response(401, body={'message': exception.message})
    else:
        return generate_api_gateway_response(
            500,
            body={
                'message': 'Encountered Spotify api error. Message: "{}".'.format(exception.message)
            }
        )
Пример #4
0
    def test_no_header_or_body(self):
        """No header or body. Should just return statuscode."""

        # Given / When
        response = generate_api_gateway_response(401)

        # Then
        expected_response = {'statusCode': 401}
        assert response == expected_response
Пример #5
0
    def test_headers(self):
        """Body fields are all scalar fields. Should return valid gateway response."""

        # Given / When
        headers = {'FooHeader': 'FooValue', 'BarHeader': 'BarValue'}
        response = generate_api_gateway_response(200, headers=headers)

        # Then
        expected_response = {'statusCode': 200, 'headers': headers}
        assert response == expected_response
def handler(event, context):
    """AWS lambda event handler"""
    logger.debug('Handling event "%s". Context: "%s"', event, context)

    spotify_client_id = os.environ['SPOTIFY_CLIENT_ID']
    spotify_client_secret = decrypt_kms_string(
        os.environ['SPOTIFY_CLIENT_SECRET'])

    try:
        refresh_token = extract_bearer_token_from_api_event(event)
    except LookupError as e:
        return generate_api_gateway_response(
            400, body={'message': 'Missing or invalid authorization'})

    try:
        access_token = fetch_spotify_access_token(refresh_token,
                                                  spotify_client_id,
                                                  spotify_client_secret)
    except requests.HTTPError:
        return generate_api_gateway_response(401)

    return generate_api_gateway_response(200,
                                         body={'accessToken': access_token})
Пример #7
0
    def test_complex_body_fields(self):
        """Body fields are all scalar fields. Should return valid gateway response."""

        # Given / When
        response = generate_api_gateway_response(200,
                                                 body={
                                                     'foo': ['f', 'o', 'o'],
                                                     'bar': {
                                                         'type': 'law exam'
                                                     }
                                                 })

        # Then
        expected_response = {
            'statusCode': 200,
            'body': '{"foo": ["f", "o", "o"], "bar": {"type": "law exam"}}'
        }
        assert response == expected_response
Пример #8
0
    def test_scalar_body_fields(self):
        """Body fields are all scalar fields. Should return valid gateway response."""

        # Given / When
        response = generate_api_gateway_response(200,
                                                 body={
                                                     'foo': 'foo_value',
                                                     'bar': 'bar_value',
                                                     'number': 1337,
                                                     'flag': True,
                                                     'empty': None
                                                 })

        # Then
        expected_response = {
            'statusCode':
            200,
            'body':
            '{"foo": "foo_value", "bar": "bar_value", "number": 1337, "flag": true, "empty": null}'
        }
        assert response == expected_response