Skip to content

Commit 62cd5dd

Browse files
committed
2 parents f94809f + 13f4421 commit 62cd5dd

12 files changed

+234
-38
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""usage table update
2+
3+
Revision ID: 66d97ed3bdc5
4+
Revises: 9ecbd29ee907
5+
Create Date: 2019-08-20 16:00:09.306326
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
# revision identifiers, used by Alembic.
12+
revision = '66d97ed3bdc5'
13+
down_revision = '9ecbd29ee907'
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
# ### commands auto generated by Alembic - please adjust! ###
20+
op.add_column('usage_table', sa.Column('channel_id', sa.VARCHAR(length=225), nullable=True))
21+
op.add_column('usage_table', sa.Column('client_type', sa.VARCHAR(length=225), nullable=True))
22+
op.add_column('usage_table', sa.Column('error_message', sa.VARCHAR(length=225), nullable=True))
23+
op.add_column('usage_table', sa.Column('ethereum_json_rpc_endpoint', sa.VARCHAR(length=225), nullable=True))
24+
op.add_column('usage_table', sa.Column('group_id', sa.VARCHAR(length=225), nullable=True))
25+
op.add_column('usage_table', sa.Column('operation', sa.VARCHAR(length=225), nullable=True))
26+
op.add_column('usage_table', sa.Column('org_id', sa.VARCHAR(length=225), nullable=True))
27+
op.add_column('usage_table', sa.Column('registry_address_key', sa.VARCHAR(length=225), nullable=True))
28+
op.add_column('usage_table', sa.Column('request_id', sa.VARCHAR(length=225), nullable=True))
29+
op.add_column('usage_table', sa.Column('resource', sa.VARCHAR(length=225), nullable=True))
30+
op.add_column('usage_table', sa.Column('response_code', sa.VARCHAR(length=225), nullable=True))
31+
op.add_column('usage_table', sa.Column('response_time', sa.FLOAT(), nullable=True))
32+
op.add_column('usage_table', sa.Column('user_address', sa.VARCHAR(length=225), nullable=True))
33+
op.add_column('usage_table', sa.Column('user_details', sa.VARCHAR(length=225), nullable=True))
34+
op.add_column('usage_table', sa.Column('username', sa.VARCHAR(length=225), nullable=True))
35+
op.add_column('usage_table', sa.Column('version', sa.VARCHAR(length=225), nullable=True))
36+
# ### end Alembic commands ###
37+
38+
39+
def downgrade():
40+
# ### commands auto generated by Alembic - please adjust! ###
41+
op.drop_column('usage_table', 'version')
42+
op.drop_column('usage_table', 'username')
43+
op.drop_column('usage_table', 'user_details')
44+
op.drop_column('usage_table', 'user_address')
45+
op.drop_column('usage_table', 'response_time')
46+
op.drop_column('usage_table', 'response_code')
47+
op.drop_column('usage_table', 'resource')
48+
op.drop_column('usage_table', 'request_id')
49+
op.drop_column('usage_table', 'registry_address_key')
50+
op.drop_column('usage_table', 'org_id')
51+
op.drop_column('usage_table', 'operation')
52+
op.drop_column('usage_table', 'group_id')
53+
op.drop_column('usage_table', 'ethereum_json_rpc_endpoint')
54+
op.drop_column('usage_table', 'error_message')
55+
op.drop_column('usage_table', 'client_type')
56+
op.drop_column('usage_table', 'channel_id')
57+
# ### end Alembic commands ###
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""user address added
2+
3+
Revision ID: b0f9443a30de
4+
Revises: 66d97ed3bdc5
5+
Create Date: 2019-08-23 18:32:06.447515
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from sqlalchemy.dialects import mysql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = 'b0f9443a30de'
14+
down_revision = '66d97ed3bdc5'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('usage_table', sa.Column('payment_mode', sa.VARCHAR(length=225), nullable=True))
22+
op.add_column('usage_table', sa.Column('service_id', sa.VARCHAR(length=225), nullable=True))
23+
op.add_column('user_org_group', sa.Column('user_address', sa.VARCHAR(length=225), nullable=True))
24+
op.alter_column('user_org_group', 'user_name',
25+
existing_type=mysql.VARCHAR(length=225),
26+
nullable=True)
27+
# ### end Alembic commands ###
28+
29+
30+
def downgrade():
31+
# ### commands auto generated by Alembic - please adjust! ###
32+
op.alter_column('user_org_group', 'user_name',
33+
existing_type=mysql.VARCHAR(length=225),
34+
nullable=False)
35+
op.drop_column('user_org_group', 'user_address')
36+
op.drop_column('usage_table', 'service_id')
37+
op.drop_column('usage_table', 'payment_mode')
38+
# ### end Alembic commands ###

metering/alembic/versions/eeec29a1af7b_added_tables.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def upgrade():
2727
sa.Column('free_calls', sa.Integer(), nullable=False),
2828
sa.Column('effective_start_date', sa.TIMESTAMP(
2929
timezone=True), nullable=True),
30-
sa.Column('effective_end_date', sa.TIMESTAMP(timezone=True),
31-
server_default=sa.text('CURRENT_TIMESTAMP'), nullable=True),
30+
sa.Column('effective_end_date', sa.TIMESTAMP(
31+
timezone=True), nullable=True),
3232
sa.Column('created_at', sa.TIMESTAMP(
3333
timezone=True), nullable=True),
3434
sa.PrimaryKeyConstraint('id')

metering/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class StatusCode:
1010
"Access-Control-Allow-Origin": "*",
1111
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
1212
}
13+
PAYMENT_MODE_FREE_CALL = 'freecall'
1314

1415

1516
class StatusMessage:

metering/handlers/freecall_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def main(event, context):
1919
try:
2020
org_id = event['queryStringParameters']['organization_id']
2121
service_id = event['queryStringParameters']['service_id']
22-
username = event['queryStringParameters']['username']
22+
username = event['requestContext']['authorizer']['claims']['email']
2323
free_call_details = usage_service.get_free_call_details(
2424
username, org_id, service_id)
2525
return_value = make_response(
@@ -37,7 +37,7 @@ def main(event, context):
3737
)
3838

3939
else:
40-
logger.error('Request validation failed')
40+
logger.error(f"Request validation failed for {event['queryStringParameters']}")
4141
return_value = make_response(
4242
status_code=StatusCode.BAD_PARAMETERS_CODE,
4343
header=HEADER_POST_RESPONSE,

metering/models.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, TIMESTAMP, func
1+
from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, TIMESTAMP, func, FLOAT, String
22

33
from sqlalchemy.ext.declarative import declarative_base
44
from sqlalchemy.orm import relationship
@@ -24,7 +24,8 @@ class UserOrgGroupModel(Base):
2424
id = Column('id', Integer, primary_key=True)
2525
payment_group_id = Column('group', VARCHAR(225))
2626
org_id = Column('org_id', VARCHAR(225), nullable=False)
27-
user_name = Column('user_name', VARCHAR(225), nullable=False)
27+
user_name = Column('user_name', VARCHAR(225))
28+
user_address = Column('user_address', VARCHAR(225))
2829
created_at = Column('created_at', TIMESTAMP(
2930
timezone=True), nullable=False, server_default=func.current_timestamp())
3031
service_id = Column('service_id', VARCHAR(225), nullable=False)
@@ -43,3 +44,21 @@ class UsageModel(Base):
4344
end_time = Column('end_time', TIMESTAMP(timezone=True))
4445
created_at = Column('created_at', TIMESTAMP(
4546
timezone=True), nullable=False, server_default=func.current_timestamp())
47+
payment_mode = Column('payment_mode', VARCHAR(225))
48+
group_id = Column('group_id', VARCHAR(225))
49+
registry_address_key = Column('registry_address_key', VARCHAR(225))
50+
ethereum_json_rpc_endpoint = Column('ethereum_json_rpc_endpoint', VARCHAR(225))
51+
response_time = Column('response_time', FLOAT)
52+
response_code = Column('response_code', VARCHAR(225))
53+
error_message = Column('error_message', VARCHAR(225))
54+
version = Column('version', VARCHAR(225))
55+
client_type = Column('client_type', VARCHAR(225))
56+
user_details = Column('user_details', VARCHAR(225))
57+
channel_id = Column('channel_id', VARCHAR(225))
58+
operation = Column('operation', VARCHAR(225))
59+
user_address = Column('user_address', VARCHAR(225))
60+
user_name = Column('username', VARCHAR(225))
61+
org_id = Column('org_id', VARCHAR(225))
62+
service_id = Column('service_id', VARCHAR(225))
63+
resource = Column('resource', VARCHAR(225))
64+
request_id = Column('request_id', VARCHAR(225))

metering/repository/user_org_group_repository.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33

44

55
class UserOrgGroupRepository(BaseRepository):
6-
def get_user_org_group_data(self, payment_group_id, org_id, user_name, service_id, resource):
6+
7+
def get_user_org_group_id_by_username(self, username, org_id, service_id, resource):
78
session = self.get_default_session()
8-
user_org_query = session.query(UserOrgGroupModel) \
9-
.filter(UserOrgGroupModel.resource == resource) \
9+
user_org_query = session.query(UserOrgGroupModel).filter(UserOrgGroupModel.user_name == username) \
1010
.filter(UserOrgGroupModel.service_id == service_id) \
11-
.filter(UserOrgGroupModel.user_name == user_name) \
11+
.filter(UserOrgGroupModel.resource == resource) \
1212
.filter(UserOrgGroupModel.org_id == org_id)
1313

14-
if payment_group_id is not None:
15-
user_org_query = user_org_query.filter(
16-
UserOrgGroupModel.payment_group_id == payment_group_id)
14+
user_org_group_data = user_org_query.first()
15+
session.commit()
16+
session.flush()
17+
return user_org_group_data
1718

19+
def get_user_org_group_id_by_user_address(self, user_address, org_id, service_id, resource, payment_group_id):
20+
session = self.get_default_session()
21+
user_org_query = session.query(UserOrgGroupModel).filter(UserOrgGroupModel.user_address == user_address) \
22+
.filter(UserOrgGroupModel.service_id == service_id) \
23+
.filter(UserOrgGroupModel.resource == resource) \
24+
.filter(UserOrgGroupModel.org_id == org_id) \
25+
.filter(UserOrgGroupModel.payment_group_id == payment_group_id)
1826
user_org_group_data = user_org_query.first()
1927
session.commit()
2028
session.flush()

metering/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ PyMySQL==0.9.3
55
python-dateutil==2.8.0
66
python-editor==1.0.4
77
six==1.12.0
8-
SQLAlchemy==1.3.6
8+
SQLAlchemy==1.3.6
9+
requests==2.22.0

metering/services.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import logging
2+
13
from storage import DatabaseStorage
24

5+
logger = logging.getLogger(__name__)
6+
37

48
class UsageService(object):
59
storage_service = DatabaseStorage()
@@ -13,8 +17,11 @@ def get_free_call_details(self, username, org_id, service_id, group_id=None):
1317
if not total_calls:
1418
total_calls = 0
1519

16-
return {"username": username, "org_id": org_id, "service_id": service_id, "total_calls_made": total_calls,
17-
"free_calls_allowed": free_calls}
20+
response = {"username": username, "org_id": org_id, "service_id": service_id, "total_calls_made": total_calls,
21+
"free_calls_allowed": free_calls}
22+
23+
logger.info(response)
24+
return response
1825

1926
def save_usage_details(self, usage_details_dict):
2027
# nedd to introduce entities when we enhance feature to this service right now directly using dicts

metering/storage.py

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import logging
2+
3+
from constants import PAYMENT_MODE_FREE_CALL
14
from models import UserOrgGroupModel, UsageModel
25
from repository.org_service_config_repository import OrgServiceRepo
36
from repository.usage_repository import UsageRepository
47
from repository.user_org_group_repository import UserOrgGroupRepository
58

9+
logger = logging.getLogger(__name__)
10+
611

712
class Storage(object):
813

@@ -16,47 +21,90 @@ def get_usage_details(self, username, org_id, service_id, group_id=None):
1621

1722

1823
class DatabaseStorage(Storage):
19-
usage_repo = UsageRepository()
20-
org_service_config_repo = OrgServiceRepo()
21-
user_org_group_repo = UserOrgGroupRepository()
2224

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["group_id"],
26-
org_id=usage_details["organization_id"],
27-
user_name=usage_details["username"],
28-
service_id=usage_details["service_id"],
29-
resource=usage_details["service_method"]
30-
)
25+
def __init__(self):
26+
self.usage_repo = UsageRepository()
27+
self.org_service_config_repo = OrgServiceRepo()
28+
self.user_org_group_repo = UserOrgGroupRepository()
3129

32-
return user_org_group_repo_data
30+
def get_user_org_group_id(self, usage_details):
31+
32+
if usage_details['payment_mode'] == PAYMENT_MODE_FREE_CALL:
33+
user_org_group_id = self.user_org_group_repo.get_user_org_group_id_by_username(
34+
usage_details['username'],
35+
usage_details['organization_id'],
36+
usage_details['service_id'],
37+
usage_details['service_method']
38+
)
39+
elif usage_details['user_address'] is None:
40+
user_org_group_id = self.user_org_group_repo.get_user_org_group_id_by_user_address(
41+
usage_details['user_address'],
42+
usage_details['organization_id'],
43+
usage_details['service_id'],
44+
usage_details['service_method'],
45+
usage_details['group_id']
46+
)
47+
else:
48+
raise Exception('Unknown user request error')
49+
50+
if user_org_group_id is not None:
51+
return user_org_group_id.id
52+
return user_org_group_id
3353

3454
def add_usage_data(self, usage_details):
35-
existing_user_org_group_repo_data = self.get_user_org_group(
36-
usage_details)
55+
user_org_group_id = self.get_user_org_group_id(usage_details)
3756

38-
if existing_user_org_group_repo_data is None:
39-
print("existing_user_org_group_repo_data is None")
57+
if user_org_group_id is None:
58+
logger.info(f"No user org group data found for "
59+
f"group_id: {usage_details['group_id']}, "
60+
f"org_id: {usage_details['organization_id']}, "
61+
f"user_name: {usage_details['username']}, "
62+
f"user_address: {usage_details['user_address']}, "
63+
f"service_id: {usage_details['service_id']}, "
64+
f"resource {usage_details['service_method']}")
4065
new_user_org_record = UserOrgGroupModel(
4166
payment_group_id=usage_details["group_id"],
4267
org_id=usage_details["organization_id"],
4368
user_name=usage_details["username"],
69+
user_address=usage_details["user_address"],
4470
service_id=usage_details["service_id"],
4571
resource=usage_details["service_method"]
4672
)
4773
self.user_org_group_repo.create_item(new_user_org_record)
74+
logger.info(f"Added user org group data\ngroup_id: {usage_details['group_id']}, "
75+
f"org_id: {usage_details['organization_id']}, "
76+
f"user_name: {usage_details['username']}, "
77+
f"user_address: {usage_details['user_address']}, "
78+
f"service_id: {usage_details['service_id']}, "
79+
f"resource {usage_details['service_method']}")
80+
user_org_group_id = self.get_user_org_group_id(usage_details)
4881

49-
user_org_group_repo_data = self.get_user_org_group(usage_details)
50-
user_org_group_id = user_org_group_repo_data.id
5182
usage_record = UsageModel(
83+
client_type=usage_details['client_type'],
84+
ethereum_json_rpc_endpoint=usage_details['ethereum_json_rpc_endpoint'],
85+
registry_address_key=usage_details['registry_address_key'],
5286
user_org_group_id=user_org_group_id,
5387
status=usage_details['status'],
88+
start_time=usage_details['start_time'],
89+
end_time=usage_details['end_time'],
90+
response_time=usage_details['response_time'],
91+
response_code=usage_details['response_code'],
92+
error_message=usage_details['error_message'],
93+
version=usage_details['version'],
94+
channel_id=usage_details['channel_id'],
95+
operation=usage_details['operation'],
96+
group_id=usage_details["group_id"],
97+
org_id=usage_details["organization_id"],
5498
usage_type=usage_details['usage_type'],
5599
usage_value=usage_details['usage_value'],
56-
start_time=usage_details['start_time'],
57-
end_time=usage_details['end_time']
100+
user_details=usage_details['user_details'],
101+
user_name=usage_details["username"],
102+
service_id=usage_details["service_id"],
103+
resource=usage_details["service_method"],
104+
request_id=usage_details["request_id"]
58105
)
59106
self.usage_repo.create_item(usage_record)
107+
logger.info(f"added usage data for {usage_details}")
60108

61109
def get_usage_details(self, user_name, org_id, service_id, group_id=None):
62110
optin_time = self.usage_repo.get_optin_time(

0 commit comments

Comments
 (0)