implementing more strategy db query code
This commit is contained in:
parent
7320b60343
commit
ae5230cf45
@ -4,6 +4,7 @@ from base64 import urlsafe_b64decode
|
|||||||
|
|
||||||
import boto3
|
import boto3
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
|
from boto3.dynamodb.conditions import Key, Attr
|
||||||
from jsonschema import validate
|
from jsonschema import validate
|
||||||
|
|
||||||
from freqtrade.aws.schemas import __SUBMIT_STRATEGY_SCHEMA__
|
from freqtrade.aws.schemas import __SUBMIT_STRATEGY_SCHEMA__
|
||||||
@ -51,12 +52,39 @@ def performance(event, context):
|
|||||||
|
|
||||||
def get(event, context):
|
def get(event, context):
|
||||||
"""
|
"""
|
||||||
loads a strategy
|
returns the code of the requested strategy, if it's public
|
||||||
:param event:
|
:param event:
|
||||||
:param context:
|
:param context:
|
||||||
:return:
|
: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):
|
def code(event, context):
|
||||||
"""
|
"""
|
||||||
@ -65,7 +93,39 @@ def code(event, context):
|
|||||||
:param context:
|
:param context:
|
||||||
:return:
|
: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):
|
def submit(event, context):
|
||||||
@ -76,11 +136,11 @@ def submit(event, context):
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
print(event)
|
||||||
# get data
|
# get data
|
||||||
data = json.loads(event['body'])
|
data = json.loads(event['body'])
|
||||||
|
|
||||||
# print("received data")
|
# print("received data")
|
||||||
# print(data)
|
|
||||||
|
|
||||||
# validate against schema
|
# validate against schema
|
||||||
result = validate(data, __SUBMIT_STRATEGY_SCHEMA__)
|
result = validate(data, __SUBMIT_STRATEGY_SCHEMA__)
|
||||||
@ -88,6 +148,9 @@ def submit(event, context):
|
|||||||
# print("data are validated");
|
# print("data are validated");
|
||||||
# print(result)
|
# print(result)
|
||||||
|
|
||||||
|
# validate that the user is an Isaac User
|
||||||
|
# ToDo
|
||||||
|
|
||||||
strategy = urlsafe_b64decode(data['content']).decode('utf-8')
|
strategy = urlsafe_b64decode(data['content']).decode('utf-8')
|
||||||
|
|
||||||
# print("loaded strategy")
|
# print("loaded strategy")
|
||||||
|
@ -4,6 +4,12 @@ import freqtrade.aws.strategy as aws
|
|||||||
|
|
||||||
|
|
||||||
def test_strategy(lambda_context):
|
def test_strategy(lambda_context):
|
||||||
|
"""
|
||||||
|
very uggly long test
|
||||||
|
|
||||||
|
:param lambda_context:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
content = """# --- Do not remove these libs ---
|
content = """# --- Do not remove these libs ---
|
||||||
from freqtrade.strategy.interface import IStrategy
|
from freqtrade.strategy.interface import IStrategy
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
@ -98,19 +104,37 @@ class TestStrategy(IStrategy):
|
|||||||
|
|
||||||
assert (len(json.loads(aws.names({}, {})['body'])) == 2)
|
assert (len(json.loads(aws.names({}, {})['body'])) == 2)
|
||||||
|
|
||||||
# we need to be able to get the code of the strategy
|
# we need to be able to get a strategy ( code cannot be included )
|
||||||
code = aws.code({'pathParameters': {
|
strategy = aws.get({'pathParameters': {
|
||||||
"name": "TestStrategy",
|
"name": "TestStrategy",
|
||||||
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH"
|
"user": "GCU4LW2XXZW3A3FM2XZJTEJHNWHTWDKY2DIJLCZJ5ULVZ4K7LZ7D23TH"
|
||||||
}}, {})
|
}}, {})
|
||||||
|
|
||||||
# code should equal our initial content
|
print(strategy)
|
||||||
assert code == content
|
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 "content" not in strategy
|
||||||
assert "user" in strategy
|
assert "user" in strategy
|
||||||
assert "name" in strategy
|
assert "name" in strategy
|
||||||
assert "description" in strategy
|
assert "description" in strategy
|
||||||
assert "public" 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"}
|
||||||
|
@ -132,6 +132,9 @@ functions:
|
|||||||
parameter:
|
parameter:
|
||||||
paths:
|
paths:
|
||||||
name: true
|
name: true
|
||||||
|
response:
|
||||||
|
headers:
|
||||||
|
Content-Type: "'text/plain'"
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
strategyTable: ${self:custom.strategyTable}
|
strategyTable: ${self:custom.strategyTable}
|
||||||
|
Loading…
Reference in New Issue
Block a user