Skip to content

Commit 7afe712

Browse files
authored
Added wrapper function for demon request checks (#31)
Added wrapper function for demon request checks
2 parents 48c0c76 + 6626699 commit 7afe712

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

metering/handlers/usage_handler.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,31 @@
1515
'service_method', 'group_id', 'status', 'start_time', 'end_time']
1616

1717

18+
def add_verify_fields(usage_detail_dict):
19+
new_requred_keys = {
20+
'usage_type', 'status', 'usage_value', 'start_time', 'end_time',
21+
'created_at', 'payment_mode', 'group_id', 'registry_address_key',
22+
'ethereum_json_rpc_endpoint', 'response_time', 'response_code', 'error_message',
23+
'version', 'client_type', 'user_details', 'channel_id', 'operation', 'user_address',
24+
'username', 'org_id', 'service_id', 'resource', 'request_id'
25+
}
26+
for key in new_requred_keys:
27+
if key not in usage_detail_dict:
28+
usage_detail_dict[key] = None
29+
30+
if usage_detail_dict['username'] is not None and usage_detail_dict['user_address'] is None:
31+
usage_detail_dict['payment_mode'] = 'freecall'
32+
else:
33+
usage_detail_dict['payment_mode'] = 'paid'
34+
return usage_detail_dict
35+
36+
1837
def main(event, context):
1938
usage_detail_dict = json.loads(event['body'])
2039

2140
try:
2241
if validate_request(required_keys, usage_detail_dict):
42+
usage_detail_dict = add_verify_fields(usage_detail_dict)
2343
usage_service.save_usage_details(usage_detail_dict)
2444
response = make_response(
2545
StatusCode.SUCCESS_GET_CODE,

metering/services.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1+
import json
12
import logging
23

4+
import boto3 as boto3
5+
import requests
6+
7+
from settings import MARKETPLACE_CHANNEL_USER_URL, CONTRACT_API_ARN, CONTRACT_API_STAGE
38
from storage import DatabaseStorage
9+
from utils import is_free_call
410

511
logger = logging.getLogger(__name__)
612

@@ -25,5 +31,34 @@ def get_free_call_details(self, username, org_id, service_id, group_id=None):
2531

2632
def save_usage_details(self, usage_details_dict):
2733
# nedd to introduce entities when we enhance feature to this service right now directly using dicts
34+
if is_free_call(usage_details_dict):
35+
channel_id = usage_details_dict['channel_id']
36+
group_id = usage_details_dict['group_id']
37+
user_address = APIUtilityService().get_user_address(group_id, channel_id)
38+
usage_details_dict['user_address'] = user_address
2839
self.storage_service.add_usage_data(usage_details_dict)
2940
return
41+
42+
43+
class APIUtilityService:
44+
lambda_client = boto3.client('lambda')
45+
46+
def get_user_address(self, group_id, channel_id):
47+
lambda_payload = {
48+
"httpMethod": "GET",
49+
"requestContext": {"stage": CONTRACT_API_STAGE},
50+
"path": f"/contract-api/group/{group_id}/channel/{channel_id}"
51+
}
52+
response = self.lambda_client.invoke(
53+
FunctionName=CONTRACT_API_ARN,
54+
Payload=json.dumps(lambda_payload)
55+
)
56+
response_body_raw = json.loads(
57+
response.get('Payload').read())['body']
58+
response_body = json.loads(response_body_raw)
59+
try:
60+
user_address = response_body['data'][0]['sender']
61+
except Exception as e:
62+
print(e)
63+
raise Exception("Failed to get user address from marketplace")
64+
return user_address
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import unittest
2+
3+
from services import APIUtilityService
4+
5+
6+
class TestContractAPI(unittest.TestCase):
7+
def test_contract_api(self):
8+
self.assertEqual(
9+
APIUtilityService().get_user_address('m5FKWq4hW0foGW5qSbzGSjgZRuKs7A1ZwbIrJ9e96rc=', 0),
10+
'0xabd2cCb3828b4428bBde6C2031A865b0fb272a5A'
11+
)

0 commit comments

Comments
 (0)