Skip to content

Commit 758ae0c

Browse files
authored
Merge pull request #1 from keshrisohit/service_Changes
integrated service chnages with db changes
2 parents 6640991 + 7124217 commit 758ae0c

File tree

11 files changed

+244
-71
lines changed

11 files changed

+244
-71
lines changed

metering/adaptors.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def usage_entity_to_model():
2+
pass
3+
4+
def usage_model_to_entity():
5+
pass
6+
File renamed without changes.

metering/handler.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

metering/handlers/__init__.py

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import json
2+
3+
from services import UsageService
4+
from utils import make_response
5+
6+
usage_service = UsageService()
7+
8+
9+
def get_and_validate_requried_params(event):
10+
try:
11+
org_id = event['queryStringParameters']['org_id']
12+
service_id = event['queryStringParameters']['service_id']
13+
user_id = event['queryStringParameters']['service_id']
14+
except Exception as e:
15+
raise e
16+
17+
return org_id, service_id, user_id
18+
19+
20+
def main(event, context):
21+
org_id, service_id, user_id = get_and_validate_requried_params(event)
22+
free_call_details = usage_service.get_free_call_details(user_id, org_id, service_id)
23+
return make_response(200, json.dumps(free_call_details))

metering/handlers/usage_handler.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
3+
from services import UsageService
4+
from utils import make_response, check_given_key
5+
6+
usage_service = UsageService()
7+
8+
9+
def get_and_validate_requried_params(event):
10+
try:
11+
body = json.loads(event['body'])
12+
if not check_given_key('org_id'):
13+
raise Exception("Org id is compulsory parameter in body request")
14+
except Exception as e:
15+
raise e
16+
return body
17+
18+
19+
def main(event, context):
20+
usage_detail_dict = get_and_validate_requried_params(event)
21+
usage_service.save_usage_details(usage_detail_dict)
22+
23+
response = {
24+
"statusCode": 201,
25+
"body": json.dumps({"status": "successfull"})
26+
}
27+
28+
return response

metering/repository/base_repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def get_default_session(self, session=None):
1818

1919
return session
2020

21-
def add_item(self, item, session=None):
21+
def create_item(self, item, session=None):
2222
session = self.get_default_session(session)
2323
session.add(item)
2424
return item

metering/serverless.yml

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
2+
plugins:
3+
- serverless-offline
4+
5+
service: metering
6+
7+
provider:
8+
name: aws
9+
runtime: python3.7
10+
stage: ${opt:stage,'dev'}
11+
timeout: 30
12+
description: Metering service entrypoints # optional, Description to publish to AWS
13+
memorySize: 128
14+
deploymentBucket:
15+
name: snet-serverless-artifacts # Deployment bucket name. Default is generated by the framework
16+
serverSideEncryption: AES256 # when using server-side encryption
17+
tags: # Tags that will be added to each of the deployment resources
18+
key1: metering
19+
deploymentPrefix: serverless # The S3 prefix under which deployed artifacts should be stored. Default is serverless
20+
21+
custom:
22+
stages:
23+
- dev
24+
- ropsten
25+
- mainnet
26+
origin:
27+
local: localhost
28+
ropsten: '*'
29+
mainnet: 'snet.com'
30+
31+
32+
package:
33+
include:
34+
exclude:
35+
- tests/**
36+
- .gitignore
37+
38+
functions:
39+
get-freecalls:
40+
handler: handlers/freecall_handler.main
41+
42+
# The following are a few example events you can configure
43+
# NOTE: Please make sure to change your handler code to work with those events
44+
# Check the event documentation for details
45+
events:
46+
- http:
47+
path: /usage/freecalls
48+
method: get
49+
authorizer:
50+
name: user-authorizer
51+
type: COGNITO_USER_POOLS
52+
arn: ${file(./config.${self:provider.stage}.json):AUTHORIZER}
53+
identitySource: method.request.header.Authorization
54+
cors:
55+
origin: ${self:custom.origin.${self:provider.stage}}
56+
headers:
57+
- Content-Type
58+
- X-Amz-Date
59+
- Authorization
60+
- X-Api-Key
61+
- X-Amz-Security-Token
62+
- X-Amz-User-Agent
63+
- x-requested-with
64+
create-usage:
65+
handler: handlers.usage_handler.main
66+
67+
# The following are a few example events you can configure
68+
# NOTE: Please make sure to change your handler code to work with those events
69+
# Check the event documentation for details
70+
events:
71+
- http:
72+
path: /usage
73+
method: post
74+
# authorizer:
75+
# name: user-authorizer
76+
# type: COGNITO_USER_POOLS
77+
# arn: ${file(./config.${self:provider.stage}.json):AUTHORIZER}
78+
# identitySource: method.request.header.Authorization
79+
cors:
80+
origin: ${self:custom.origin.${self:provider.stage}}
81+
headers:
82+
- Content-Type
83+
- X-Amz-Date
84+
- Authorization
85+
- X-Api-Key
86+
- X-Amz-Security-Token
87+
- X-Amz-User-Agent
88+
- x-requested-with

metering/services.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from metering.storage import DatabaseStorage
2+
3+
4+
class UsageService(object):
5+
storage_service = DatabaseStorage()
6+
7+
def get_free_call_details(self, user_name, org_id, service_id, group_id=None):
8+
free_calls, total_calls = self.storage_service.get_usage_details(user_name, org_id, service_id, group_id)
9+
return {"username": user_name, "org_id": org_id, "service_id": service_id, "total_calls": total_calls,
10+
"free_calls": free_calls}
11+
12+
13+
14+
def save_usage_details(self, usage_details_dict):
15+
# nedd to introduce entities when we enhance feature to this service right now directly using dicts
16+
self.storage_service.add_usage_data(usage_details_dict)
17+
return

metering/storage.py

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,56 +4,65 @@
44
from repository.user_org_group_repository import UserOrgGroupRepository
55

66

7-
def add_usage_data(usage_details):
8-
user_org_group_repo = UserOrgGroupRepository()
9-
user_org_group_repo_data = user_org_group_repo.get_user_org_group_data(
10-
payment_group_id=usage_details.payment_group_id,
11-
org_id=usage_details.org_id,
12-
user_name=usage_details.user_name,
13-
user_id=usage_details.user_id,
14-
service_id=usage_details.service_id,
15-
resource=add_usage_data.resource
16-
)
17-
18-
if user_org_group_repo_data is None:
19-
new_user_org_record = UserOrgGroupModel(
20-
payment_group_id=usage_details.payment_group_id,
21-
org_id=usage_details.org_id,
22-
user_name=usage_details.user_name,
23-
user_id=usage_details.user_id,
24-
service_id=usage_details.service_id,
25-
resource=add_usage_data.resource
26-
)
27-
user_org_group_repo.add_item(new_user_org_record)
28-
user_org_group_repo_data = user_org_group_repo.get_user_org_group_data(
29-
payment_group_id=usage_details.payment_group_id,
30-
org_id=usage_details.org_id,
31-
user_name=usage_details.user_name,
32-
user_id=usage_details.user_id,
33-
service_id=usage_details.service_id,
34-
resource=add_usage_data.resource
35-
)
7+
class Storage(object):
368

37-
user_org_group_id = user_org_group_repo_data.id
38-
usage_record = UsageModel(
39-
user_org_group_id=user_org_group_id,
40-
usage_type=usage_details.usage_type,
41-
usage_value=usage_details.usage_type,
42-
start_time=usage_details.start_time,
43-
end_time=usage_details.start_time
44-
)
45-
usage_repo = UsageRepository()
46-
usage_repo.add_item(usage_record)
9+
# Interface to raad write data fom cache or database
4710

11+
def add_usage_data(self, usage_detail):
12+
pass
4813

49-
def get_usage_details(user_name, org_id, service_id):
14+
def get_usage_details(self, username, org_id, service_id, group_id=None):
15+
pass
16+
17+
18+
class DatabaseStorage(Storage):
5019
usage_repo = UsageRepository()
5120
org_service_config_repo = OrgServiceRepo()
52-
optin_time = usage_repo.get_optin_time(user_name, org_id, service_id)
53-
free_calls = org_service_config_repo.get_service_config(org_id, service_id, optin_time)
54-
total_calls = usage_repo.get_total_calls(user_name, org_id, service_id)
55-
return total_calls, free_calls
21+
user_org_group_repo = UserOrgGroupRepository()
22+
23+
def get_user_org_group(self, usage_details):
24+
user_org_group_repo_data = self.user_org_group_repo.get_user_org_group_data(
25+
payment_group_id=usage_details["payment_group_id"],
26+
org_id=usage_details["org_id"],
27+
user_name=usage_details["user_name"],
28+
user_id=usage_details["user_id"],
29+
service_id=usage_details["service_id"],
30+
resource=usage_details["resource"]
31+
)
32+
33+
return user_org_group_repo_data
34+
35+
def add_usage_data(self, usage_details):
36+
existing_user_org_group_repo_data = self.get_user_org_group(usage_details)
37+
38+
if existing_user_org_group_repo_data is None:
39+
new_user_org_record = UserOrgGroupModel(
40+
payment_group_id=usage_details["payment_group_id"],
41+
org_id=usage_details["org_id"],
42+
user_name=usage_details["user_name"],
43+
user_id=usage_details["user_id"],
44+
service_id=usage_details["service_id"],
45+
resource=usage_details["resource"]
46+
)
47+
self.user_org_group_repo.create_item(new_user_org_record)
48+
49+
user_org_group_repo_data = self.get_user_org_group(usage_details)
50+
user_org_group_id = user_org_group_repo_data.id
51+
usage_record = UsageModel(
52+
user_org_group_id=user_org_group_id,
53+
usage_type=usage_details.usage_type,
54+
usage_value=usage_details.usage_type,
55+
start_time=usage_details.start_time,
56+
end_time=usage_details.start_time
57+
)
58+
self.usage_repo.create_item(usage_record)
59+
60+
def get_usage_details(self, user_name, org_id, service_id, group_id=None):
61+
optin_time = self.usage_repo.get_optin_time(user_name, org_id, service_id)
62+
free_calls = self.org_service_config_repo.get_service_config(org_id, service_id, optin_time)
63+
total_calls = self.usage_repo.get_total_calls(user_name, org_id, service_id)
64+
return total_calls, free_calls
5665

5766

5867
if __name__ == '__main__':
59-
get_usage_details('1', '1', '2')
68+
DatabaseStorage().get_usage_details('1', '1', '2')

0 commit comments

Comments
 (0)