Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
coverage report -m
mkdir ../test-reports
coverage html -d ../test-reports
# COVERALLS_REPO_TOKEN=${COVERALLS_REPO_TOKEN} coveralls
COVERALLS_REPO_TOKEN=${COVERALLS_REPO_TOKEN} coveralls
- store_test_results:
path: test-reports
- store_artifacts:
Expand Down
58 changes: 26 additions & 32 deletions metering/handlers/freecall_handler.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,41 @@
import json
import logging

from constants import StatusCode, StatusMessage, HEADER_POST_RESPONSE
from services import UsageService
from logger import setup_logger
from utils import validate_request, make_response
from logger import get_logger
from utils import validate_request, generate_lambda_response

usage_service = UsageService()

setup_logger()
logger = logging.getLogger(__name__)
logger = get_logger(__name__)

required_keys = ['organization_id', 'service_id']


def main(event, context):
if validate_request(required_keys, event['queryStringParameters']):
try:
logger.info("Free call request received")
try:
if validate_request(required_keys, event['queryStringParameters']):
org_id = event['queryStringParameters']['organization_id']
service_id = event['queryStringParameters']['service_id']
username = event['queryStringParameters']['username']

logger.info(f"Fetched values from request \n"
f"username: {username} \n"
f"org_id: {org_id} \n"
f"service_id: {service_id} \n")

free_call_details = usage_service.get_free_call_details(
username, org_id, service_id)
return_value = make_response(
status_code=StatusCode.SUCCESS_GET_CODE,
header=HEADER_POST_RESPONSE,
body=json.dumps(free_call_details)
)

except Exception as e:
logger.error(e)
return_value = make_response(
status_code=StatusCode.SERVER_ERROR_CODE,
header=HEADER_POST_RESPONSE,
body=json.dumps({"error": StatusMessage.SERVER_ERROR_MSG})
)

else:
logger.error(f"Request validation failed for {event['queryStringParameters']}")
return_value = make_response(
status_code=StatusCode.BAD_PARAMETERS_CODE,
header=HEADER_POST_RESPONSE,
body=json.dumps({"error": StatusMessage.BAD_PARAMETER})
)

return return_value
response = free_call_details
status_code = StatusCode.SUCCESS_GET_CODE
else:
logger.error(f"Request validation failed")
logger.info(event)
response = StatusMessage.BAD_PARAMETER
status_code = StatusCode.BAD_PARAMETERS_CODE
except Exception as e:
logger.error("Failed to get free call details")
logger.info(event)
status_code = StatusCode.SERVER_ERROR_CODE,
response = StatusMessage.SERVER_ERROR_MSG

return generate_lambda_response(status_code, response)
40 changes: 17 additions & 23 deletions metering/handlers/usage_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,37 @@
import logging

from constants import StatusCode, StatusMessage
from logger import setup_logger
from logger import get_logger
from services import UsageService
from utils import validate_request, make_response, usage_record_add_verify_fields
from utils import validate_request, usage_record_add_verify_fields, generate_lambda_response

usage_service = UsageService()

setup_logger()
logger = logging.getLogger(__name__)
logger = get_logger(__name__)

required_keys = ["organization_id", "service_id", "username", 'usage_value', 'usage_type',
'service_method', 'group_id', 'status', 'start_time', 'end_time']


def main(event, context):
request_dict = json.loads(event['body'])

logger.info("Usage record request received")
try:
request_dict = json.loads(event['body'])
if validate_request(required_keys, request_dict):
usage_detail_dict = usage_record_add_verify_fields(request_dict)
print(f"usage record after modification: {usage_detail_dict}")
logging.info(f"usage record after modification: {usage_detail_dict}")
usage_service.save_usage_details(usage_detail_dict)
response = make_response(
StatusCode.SUCCESS_GET_CODE,
json.dumps({"status": StatusMessage.SUCCESS_POST_CODE})
)
response = "success"
status_code = StatusCode.SUCCESS_GET_CODE
else:
logger.error(f'Request validation failed {request_dict}')
response = make_response(
StatusCode.BAD_PARAMETERS_CODE,
json.dumps({"status": StatusMessage.BAD_PARAMETER})
)
logger.error(f"Request validation failed")
logger.info(event)
response = StatusMessage.BAD_PARAMETER
status_code = StatusCode.BAD_PARAMETERS_CODE
except Exception as e:
logger.error(e)
logger.error(f'failed for request {request_dict}')
response = make_response(
StatusCode.SERVER_ERROR_CODE,
json.dumps({"status": StatusMessage.SERVER_ERROR_MSG})
)
logger.error("Failed to get free call details")
logger.info(event)
status_code = StatusCode.SERVER_ERROR_CODE,
response = StatusMessage.SERVER_ERROR_MSG

return response
return generate_lambda_response(status_code, response)
21 changes: 13 additions & 8 deletions metering/logger.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import logging.config
import logging
import sys
FORMATTER = logging.Formatter("%(asctime)s %(levelname)s %(name)s %(message)s")


def setup_logger():
logging.basicConfig(
level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
def get_console_handler():
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(FORMATTER)
return console_handler


if __name__ == '__main__':
setup_logger()
logger = logging.getLogger()
logger.info("hi, it is test")
def get_logger(logger_name):
logger = logging.getLogger(logger_name)
logger.setLevel(logging.INFO)
logger.addHandler(get_console_handler())
logger.propagate = False
return logger
2 changes: 1 addition & 1 deletion metering/repository/base_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sqlalchemy.orm import sessionmaker
from settings import DB_URL

engine = create_engine(DB_URL, echo=True)
engine = create_engine(DB_URL, echo=False)

Session = sessionmaker(bind=engine)
default_session = Session()
Expand Down
6 changes: 0 additions & 6 deletions metering/serverless.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,6 @@ functions:
subnetIds:
- ${file(./config.${self:provider.stage}.json):VPC1}
- ${file(./config.${self:provider.stage}.json):VPC2}
# The following are a few example events you can configure
# NOTE: Please make sure to change your handler code to work with those events
# Check the event documentation for details
events:
- http:
path: /usage/freecalls
Expand Down Expand Up @@ -110,9 +107,6 @@ functions:
subnetIds:
- ${file(./config.${self:provider.stage}.json):VPC1}
- ${file(./config.${self:provider.stage}.json):VPC2}
# The following are a few example events you can configure
# NOTE: Please make sure to change your handler code to work with those events
# Check the event documentation for details
events:
- http:
path: /usage
Expand Down
10 changes: 8 additions & 2 deletions metering/services.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import json
import logging

import boto3 as boto3

from logger import get_logger
from settings import CONTRACT_API_ARN, CONTRACT_API_STAGE
from storage import DatabaseStorage
from utils import is_free_call

logger = logging.getLogger(__name__)
logger = get_logger(__name__)


class UsageService(object):
Expand All @@ -17,6 +17,7 @@ def get_free_call_details(self, username, org_id, service_id, group_id=None):
total_calls, free_calls = self.storage_service.get_usage_details(
username, org_id, service_id, group_id)

logger.info(f"Free calls allowed: {free_calls}, Total calls made: {total_calls}")
if not free_calls:
free_calls = 0
if not total_calls:
Expand All @@ -31,10 +32,14 @@ def get_free_call_details(self, username, org_id, service_id, group_id=None):
def save_usage_details(self, usage_details_dict):
# nedd to introduce entities when we enhance feature to this service right now directly using dicts
if not is_free_call(usage_details_dict):
logger.info("Received usage record request for paid call")
channel_id = usage_details_dict['channel_id']
group_id = usage_details_dict['group_id']

user_address = APIUtilityService().get_user_address(group_id, channel_id)
usage_details_dict['user_address'] = user_address
logger.info(f"fetched user address from contract api: {user_address}")

self.storage_service.add_usage_data(usage_details_dict)
return

Expand All @@ -52,6 +57,7 @@ def get_user_address(self, group_id, channel_id):
}

try:
logger.info(f"Calling contract api for user_address")
response = self.lambda_client.invoke(
FunctionName=CONTRACT_API_ARN,
Payload=json.dumps(lambda_payload)
Expand Down
9 changes: 8 additions & 1 deletion metering/storage.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import logging

from logger import get_logger
from models import UserOrgGroupModel, UsageModel
from repository.org_service_config_repository import OrgServiceRepo
from repository.usage_repository import UsageRepository
from repository.user_org_group_repository import UserOrgGroupRepository
from constants import PAYMENT_MODE_FREECALL_VALUE, PAYMENT_MODE_ESCROW_VALUE

logger = logging.getLogger(__name__)
logger = get_logger(__name__)


class Storage(object):
Expand Down Expand Up @@ -110,8 +111,14 @@ def add_usage_data(self, usage_details):
def get_usage_details(self, user_name, org_id, service_id, group_id=None):
optin_time = self.usage_repo.get_optin_time(
user_name, org_id, service_id)
logger.info(f"opt in for the user{user_name}, \n"
f"org_id: {org_id}, service_id: {service_id} \n"
f"{optin_time.strftime('%Y-%m-%d %H:%M:%S')}")

free_calls = self.org_service_config_repo.get_service_config(
org_id, service_id, optin_time)

total_calls = self.usage_repo.get_total_calls(
user_name, org_id, service_id)

return total_calls, free_calls
35 changes: 16 additions & 19 deletions metering/utils.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
import json
import logging

from constants import PAYMENT_MODE_FREECALL_VALUE


def make_response(status_code, body, header=None):
return {
"statusCode": status_code,
"headers": header,
"body": body
def generate_lambda_response(status_code, message, headers=None):
response = {
'statusCode': status_code,
'body': json.dumps(message),
'headers': {
'Content-Type': 'application/json',
"X-Requested-With": '*',
"Access-Control-Allow-Headers": 'Access-Control-Allow-Origin, Content-Type,X-Amz-Date,Authorization,'
'X-Api-Key,x-requested-with',
"Access-Control-Allow-Origin": '*',
"Access-Control-Allow-Methods": 'GET,OPTIONS,POST'
}
}


def configure_log(logger):
logger.setLevel(logging.INFO)

# create a file handler
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
# create a logging format
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(handler)
if headers is not None:
response["headers"].update(headers)
return response


def validate_request(required_keys, request_body):
Expand Down