diff --git a/freqtrade/aws/strategy.py b/freqtrade/aws/strategy.py index 7d55445c7..4d4823faf 100644 --- a/freqtrade/aws/strategy.py +++ b/freqtrade/aws/strategy.py @@ -4,6 +4,7 @@ from base64 import urlsafe_b64decode import boto3 import simplejson as json +from boto3.dynamodb.conditions import Key, Attr from jsonschema import validate from freqtrade.aws.schemas import __SUBMIT_STRATEGY_SCHEMA__ @@ -51,12 +52,39 @@ def performance(event, context): def get(event, context): """ - loads a strategy + returns the code of the requested strategy, if it's public :param event: :param context: :return: """ - pass + + assert 'pathParameters' in event + assert 'user' in event['pathParameters'] + assert 'name' in event['pathParameters'] + + table = db.Table(os.environ['strategyTable']) + + response = table.query( + KeyConditionExpression=Key('user').eq(event['pathParameters']['user']) & + Key('name').eq(event['pathParameters']['name']) + + ) + + if "Items" in response and len(response['Items']) > 0: + item = response['Items'][0] + item.pop('content') + + return { + "statusCode": response['ResponseMetadata']['HTTPStatusCode'], + "body": json.dumps(item) + } + + else: + return { + "statusCode": response['ResponseMetadata']['HTTPStatusCode'], + "body": json.dumps(response) + } + def code(event, context): """ @@ -65,7 +93,39 @@ def code(event, context): :param context: :return: """ - pass + + assert 'pathParameters' in event + assert 'user' in event['pathParameters'] + assert 'name' in event['pathParameters'] + + table = db.Table(os.environ['strategyTable']) + + response = table.query( + KeyConditionExpression=Key('user').eq(event['pathParameters']['user']) & + Key('name').eq(event['pathParameters']['name']) + + ) + + if "Items" in response and len(response['Items']) > 0: + if response['Items'][0]["public"]: + content = urlsafe_b64decode(response['Items'][0]['content']) + + return { + "statusCode": response['ResponseMetadata']['HTTPStatusCode'], + "body": content + } + else: + + return { + "statusCode": 403, + "body": json.dumps({"success": False, "reason": "Denied"}) + } + + else: + return { + "statusCode": response['ResponseMetadata']['HTTPStatusCode'], + "body": json.dumps(response) + } def submit(event, context): @@ -76,11 +136,11 @@ def submit(event, context): :return: """ + print(event) # get data data = json.loads(event['body']) # print("received data") - # print(data) # validate against schema result = validate(data, __SUBMIT_STRATEGY_SCHEMA__) @@ -88,6 +148,9 @@ def submit(event, context): # print("data are validated"); # print(result) + # validate that the user is an Isaac User + # ToDo + strategy = urlsafe_b64decode(data['content']).decode('utf-8') # print("loaded strategy") diff --git a/freqtrade/tests/aws/test_strategy_lambda.py b/freqtrade/tests/aws/test_strategy_lambda.py index f7e46a776..fa62b66f6 100644 --- a/freqtrade/tests/aws/test_strategy_lambda.py +++ b/freqtrade/tests/aws/test_strategy_lambda.py @@ -4,6 +4,12 @@ import freqtrade.aws.strategy as aws def test_strategy(lambda_context): + """ + very uggly long test + + :param lambda_context: + :return: + """ content = """# --- Do not remove these libs --- from freqtrade.strategy.interface import IStrategy from typing import Dict, List @@ -98,19 +104,37 @@ class TestStrategy(IStrategy): assert (len(json.loads(aws.names({}, {})['body'])) == 2) - # we need to be able to get the code of the strategy - code = aws.code({'pathParameters': { + # we need to be able to get a strategy ( code cannot be included ) + strategy = aws.get({'pathParameters': { "name": "TestStrategy", "user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH" }}, {}) - # code should equal our initial content - assert code == content + print(strategy) + strategy = json.loads(strategy['body']) - # we need to be able to get a strategy ( code cannot be included ) - strategy = json.loads(aws.get({}, {})) assert "content" not in strategy assert "user" in strategy assert "name" in strategy assert "description" in strategy assert "public" in strategy + assert "content" not in strategy + + # we need to be able to get the code of the strategy + code = aws.code({'pathParameters': { + "name": "TestStrategy", + "user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH" + }}, {})['body'] + + # code should equal our initial content + assert code == content + + # we are not allowed to load a private strategy + code = aws.code({'pathParameters': { + "name": "TestStrategy", + "user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TG" + }}, {}) + + # code should equal our initial content + assert code['statusCode'] == 403 + assert json.loads(code['body']) == {"success": False, "reason": "Denied"} diff --git a/serverless.yml b/serverless.yml index 567213ac9..2e0898922 100644 --- a/serverless.yml +++ b/serverless.yml @@ -132,6 +132,9 @@ functions: parameter: paths: name: true + response: + headers: + Content-Type: "'text/plain'" environment: strategyTable: ${self:custom.strategyTable}