Skip to content

Commit 86f8293

Browse files
authored
Dev (#23)
Dev
2 parents 77904c8 + 0b1219b commit 86f8293

16 files changed

+343
-71
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""status added in calls tables
2+
3+
Revision ID: 9ecbd29ee907
4+
Revises: eeec29a1af7b
5+
Create Date: 2019-08-12 15:13:51.507698
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '9ecbd29ee907'
14+
down_revision = 'eeec29a1af7b'
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(
22+
'status', sa.VARCHAR(length=225), nullable=False))
23+
# ### end Alembic commands ###
24+
25+
26+
def downgrade():
27+
# ### commands auto generated by Alembic - please adjust! ###
28+
op.drop_column('usage_table', 'status')
29+
# ### end Alembic commands ###

metering/constants.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class StatusCode:
2+
BAD_PARAMETERS_CODE = 400
3+
SERVER_ERROR_CODE = 500
4+
SUCCESS_POST_CODE = 201
5+
SUCCESS_GET_CODE = 200
6+
7+
8+
HEADER_POST_RESPONSE = {
9+
"Content-Type": "application/json",
10+
"Access-Control-Allow-Origin": "*",
11+
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
12+
}
13+
14+
15+
class StatusMessage:
16+
BAD_PARAMETER = "Request validation failed"
17+
SERVER_ERROR_MSG = "failed"
18+
SUCCESS_POST_CODE = "successful"
Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,47 @@
11
import json
2+
import logging
23

4+
from constants import StatusCode, StatusMessage, HEADER_POST_RESPONSE
35
from services import UsageService
4-
from utils import make_response
6+
from logger import setup_logger
7+
from utils import validate_request, make_response
58

69
usage_service = UsageService()
710

11+
setup_logger()
12+
logger = logging.getLogger(__name__)
813

9-
def get_and_validate_requried_params(event):
10-
try:
11-
org_id = event['queryStringParameters']['organization_id']
12-
service_id = event['queryStringParameters']['service_id']
13-
user_id = event['queryStringParameters']['user_id']
14-
except Exception as e:
15-
raise e
16-
17-
return org_id, service_id, user_id
14+
required_keys = ['username', 'organization_id', 'service_id']
1815

1916

2017
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(
23-
user_id, org_id, service_id)
24-
25-
return_value = {
26-
"statusCode": 200,
27-
"headers": {
28-
"Content-Type": "application/json",
29-
"Access-Control-Allow-Origin": "*",
30-
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
31-
},
32-
"body": json.dumps(free_call_details)
33-
}
18+
if validate_request(required_keys, event['queryStringParameters']):
19+
try:
20+
org_id = event['queryStringParameters']['organization_id']
21+
service_id = event['queryStringParameters']['service_id']
22+
username = event['queryStringParameters']['username']
23+
free_call_details = usage_service.get_free_call_details(
24+
username, org_id, service_id)
25+
return_value = make_response(
26+
status_code=StatusCode.SUCCESS_GET_CODE,
27+
header=HEADER_POST_RESPONSE,
28+
body=json.dumps(free_call_details)
29+
)
30+
31+
except Exception as e:
32+
logger.error(e)
33+
return_value = make_response(
34+
status_code=StatusCode.SERVER_ERROR_CODE,
35+
header=HEADER_POST_RESPONSE,
36+
body=json.dumps({"error": StatusMessage.SERVER_ERROR_MSG})
37+
)
38+
39+
else:
40+
logger.error('Request validation failed')
41+
return_value = make_response(
42+
status_code=StatusCode.BAD_PARAMETERS_CODE,
43+
header=HEADER_POST_RESPONSE,
44+
body=json.dumps({"error": StatusMessage.BAD_PARAMETER})
45+
)
3446

3547
return return_value

metering/handlers/usage_handler.py

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
11
import json
2+
import logging
23

4+
from constants import StatusCode, StatusMessage
5+
from logger import setup_logger
36
from services import UsageService
4-
from utils import make_response, check_given_key
7+
from utils import validate_request, make_response
58

69
usage_service = UsageService()
710

11+
setup_logger()
12+
logger = logging.getLogger(__name__)
813

9-
def get_and_validate_requried_params(event):
10-
try:
11-
body = json.loads(event['body'])
12-
if not check_given_key('organization_id', body):
13-
raise Exception("Org id is compulsory parameter in body request")
14-
except Exception as e:
15-
raise e
16-
return body
14+
required_keys = ["organization_id", "service_id", "username", 'usage_value', 'usage_type',
15+
'service_method', 'group_id', 'status', 'start_time', 'end_time']
1716

1817

1918
def main(event, context):
20-
usage_detail_dict = get_and_validate_requried_params(event)
21-
usage_service.save_usage_details(usage_detail_dict)
19+
usage_detail_dict = json.loads(event['body'])
2220

23-
response = {
24-
"statusCode": 201,
25-
"body": json.dumps({"status": "successfull"})
26-
}
21+
try:
22+
if validate_request(required_keys, usage_detail_dict):
23+
usage_service.save_usage_details(usage_detail_dict)
24+
response = make_response(
25+
StatusCode.SUCCESS_GET_CODE,
26+
json.dumps({"status": StatusMessage.SUCCESS_POST_CODE})
27+
)
28+
else:
29+
logger.error(f'Request validation failed {usage_detail_dict}')
30+
response = make_response(
31+
StatusCode.BAD_PARAMETERS_CODE,
32+
json.dumps({"status": StatusMessage.BAD_PARAMETER})
33+
)
34+
except Exception as e:
35+
logger.error(e)
36+
logger.error(f'failed for request {usage_detail_dict}')
37+
response = make_response(
38+
StatusCode.SERVER_ERROR_CODE,
39+
json.dumps({"status": StatusMessage.SERVER_ERROR_MSG})
40+
)
2741

2842
return response

metering/logger.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import logging.config
2+
3+
4+
def setup_logger():
5+
logging.config.dictConfig({
6+
"version": 1,
7+
"disable_existing_loggers": False,
8+
"formatters": {
9+
"simple": {
10+
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
11+
}
12+
},
13+
14+
"handlers": {
15+
"console": {
16+
"class": "logging.StreamHandler",
17+
"level": "DEBUG",
18+
"formatter": "simple",
19+
"stream": "ext://sys.stdout"
20+
}
21+
22+
# "info_file_handler": {
23+
# "class": "logging.handlers.RotatingFileHandler",
24+
# "level": "INFO",
25+
# "formatter": "simple",
26+
# "filename": "info.log",
27+
# },
28+
#
29+
# "error_file_handler": {
30+
# "class": "logging.handlers.RotatingFileHandler",
31+
# "level": "ERROR",
32+
# "formatter": "simple",
33+
# "filename": "error.log",
34+
# "encoding": "utf8"
35+
# }
36+
},
37+
38+
"loggers": {
39+
"sqlalchemy": {
40+
"level": "ERROR",
41+
"handlers": ["console"],
42+
"propagate": "no"
43+
},
44+
"freecall_handler": {
45+
"level": "ERROR",
46+
"handlers": ["console"],
47+
"propagate": "no"
48+
},
49+
"": {
50+
"level": "ERROR",
51+
"handlers": ["console"],
52+
"propagate": "no"
53+
}
54+
},
55+
56+
"root": {
57+
"level": "ERROR",
58+
"handlers": ["console"]
59+
}
60+
})

metering/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ class OrgServiceConfigModel(Base):
1414
free_calls = Column('free_calls', Integer, nullable=False)
1515
effective_start_date = Column(
1616
'effective_start_date', TIMESTAMP(timezone=True))
17-
effective_end_date = Column('effective_end_date', TIMESTAMP(
17+
effective_end_date = Column('effective_end_date', TIMESTAMP(timezone=True))
18+
created_at = Column('created_at', TIMESTAMP(
1819
timezone=True), server_default=func.current_timestamp())
19-
created_at = Column('created_at', TIMESTAMP(timezone=True))
2020

2121

2222
class UserOrgGroupModel(Base):
@@ -37,6 +37,7 @@ class UsageModel(Base):
3737
user_org_group_id = Column('user_org_group_id', Integer, ForeignKey(
3838
'user_org_group.id'), nullable=False)
3939
usage_type = Column('usage_type', VARCHAR(225), nullable=False)
40+
status = Column('status', VARCHAR(225), nullable=False)
4041
usage_value = Column('usage_value', Integer, nullable=False)
4142
start_time = Column('start_time', TIMESTAMP(timezone=True))
4243
end_time = Column('end_time', TIMESTAMP(timezone=True))

metering/repository/base_repository.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,16 @@ def create_item(self, item, session=None):
2222
session = self.get_default_session(session)
2323
session.add(item)
2424
session.commit()
25+
session.flush()
2526
return item
2627

28+
def create_all_items(self, items, session=None):
29+
session = self.get_default_session(session)
30+
session.add_all(items)
31+
session.commit()
32+
session.flush()
33+
return items
34+
2735
def remove_item(self, item, session=None):
2836
pass
2937

metering/repository/org_service_config_repository.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ def get_service_config(self, org_id, service_id, optin_time):
1111
.filter(OrgServiceConfigModel.org_id == org_id) \
1212
.filter(OrgServiceConfigModel.service_id == service_id) \
1313
.filter(OrgServiceConfigModel.effective_start_date <= optin_time) \
14-
.filter(OrgServiceConfigModel.effective_end_date >= optin_time).first()
14+
.filter(OrgServiceConfigModel.effective_end_date >= optin_time).all()
1515
else:
1616
service_config = session.query(OrgServiceConfigModel.free_calls.label('free_calls')) \
1717
.filter(OrgServiceConfigModel.org_id == org_id) \
18-
.filter(OrgServiceConfigModel.service_id == service_id)\
19-
.order_by(OrgServiceConfigModel.created_at.desc()).first()
20-
return service_config
18+
.filter(OrgServiceConfigModel.service_id == service_id) \
19+
.order_by(OrgServiceConfigModel.created_at.desc()).all()
20+
session.commit()
21+
session.flush()
22+
if len(service_config) == 0:
23+
return None
24+
return service_config[0].free_calls

metering/repository/usage_repository.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ def get_total_calls(self, user_name, org_id, service_id):
1010
query_data = session.query(func.count(UsageModel.id).label('total_calls')).join(UserOrgGroupModel) \
1111
.filter(UserOrgGroupModel.user_name == user_name)\
1212
.filter(UserOrgGroupModel.org_id == org_id) \
13-
.filter(UserOrgGroupModel.service_id == service_id).all()
13+
.filter(UserOrgGroupModel.service_id == service_id)\
14+
.filter(UsageModel.status == 'success').all()
15+
session.commit()
16+
session.flush()
1417
return query_data[0].total_calls
1518

1619
def get_optin_time(self, user_name, org_id, service_id):
1720
session = self.get_default_session()
1821
query_data = session.query(func.min(UsageModel.created_at).label('opt_time')).join(UserOrgGroupModel).filter(
1922
UserOrgGroupModel.user_name == user_name).filter(UserOrgGroupModel.org_id == org_id).filter(
2023
UserOrgGroupModel.service_id == service_id).all()
24+
session.commit()
25+
session.flush()
2126
return query_data[0].opt_time

metering/repository/user_org_group_repository.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def get_user_org_group_data(self, payment_group_id, org_id, user_name, service_i
1616
UserOrgGroupModel.payment_group_id == payment_group_id)
1717

1818
user_org_group_data = user_org_query.first()
19+
session.commit()
20+
session.flush()
1921
return user_org_group_data
2022

2123
def get_free_calls(self, org_id, service_id, optin_time):

0 commit comments

Comments
 (0)