Skip to content

Commit 43b6c9d

Browse files
committed
Refactored code after adding sage-utils package
1 parent c3bf3c5 commit 43b6c9d

File tree

10 files changed

+188
-162
lines changed

10 files changed

+188
-162
lines changed

auth/app/rabbitmq/workers/register_microservice.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from aioamqp import AmqpClosedConnection
44
from marshmallow import ValidationError
55
from sanic_amqp_ext import AmqpWorker
6-
7-
from app.generic.utils import CONTENT_FIELD_NAME, EVENT_FIELD_NAME, VALIDATION_ERROR, wrap_error
6+
from sage_utils.constants import VALIDATION_ERROR
7+
from sage_utils.wrappers import Response
88

99

1010
class RegisterMicroserviceWorker(AmqpWorker):
@@ -43,7 +43,7 @@ async def register_microservice(self, raw_data):
4343
try:
4444
data = await self.validate_data(raw_data)
4545
except ValidationError as exc:
46-
return wrap_error(VALIDATION_ERROR, exc.normalized_messages())
46+
return Response.from_error(VALIDATION_ERROR, exc.normalized_messages())
4747

4848
old_microservice = await self.microservice_document.find_one({'name': data['name']})
4949
old_permissions = [obj.pk for obj in old_microservice.permissions] if old_microservice else [] # NOQA
@@ -54,15 +54,15 @@ async def register_microservice(self, raw_data):
5454
)
5555

5656
self.app.loop.create_task(self.update_groups(old_permissions, new_permissions))
57-
return {CONTENT_FIELD_NAME: "OK"}
57+
return Response.with_content("OK")
5858

5959
async def process_request(self, channel, body, envelope, properties):
6060
response = await self.register_microservice(body)
61-
response[EVENT_FIELD_NAME] = properties.correlation_id
61+
response.data[Response.EVENT_FIELD_NAME] = properties.correlation_id
6262

6363
if properties.reply_to:
6464
await channel.publish(
65-
json.dumps(response),
65+
json.dumps(response.data),
6666
exchange_name=self.RESPONSE_EXCHANGE_NAME,
6767
routing_key=properties.reply_to,
6868
properties={

auth/app/token/api/views.py

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from collections import OrderedDict
22

33
from bson.objectid import ObjectId
4-
from sanic.response import json
54
from jwt import InvalidIssuedAtError, ExpiredSignatureError, InvalidTokenError
5+
from sage_utils.constants import VALIDATION_ERROR, NOT_FOUND_ERROR, TOKEN_ERROR
6+
from sage_utils.wrappers import Response
7+
from sanic.response import json
68

7-
from app.generic.utils import CONTENT_FIELD_NAME, TOKEN_ERROR, VALIDATION_ERROR, \
8-
NOT_FOUND_ERROR, wrap_error
99
from app.token.exceptions import MissingAuthorizationHeader, InvalidHeaderPrefix
1010
from app.token.json_web_token import build_payload, generate_token_pair, extract_token, \
1111
decode_token, extract_and_decode_token, get_redis_key_by_user, generate_access_token
@@ -16,19 +16,22 @@
1616
async def generate_tokens(request):
1717
credentials = LoginSchema().load(request.json or {})
1818
if credentials.errors:
19-
return json(wrap_error(VALIDATION_ERROR, credentials.errors), 400)
19+
response = Response.from_error(VALIDATION_ERROR, credentials.errors)
20+
response.data.pop(Response.EVENT_FIELD_NAME, None)
21+
return json(response.data, 400)
2022

2123
username = credentials.data["username"]
2224
password = credentials.data["password"]
2325

2426
user_document = request.app.config["LAZY_UMONGO"].User
2527
user = await user_document.find_one({"username": username})
2628
if not user or (user and not user.verify_password(password)):
27-
message = wrap_error(
29+
response = Response.from_error(
2830
NOT_FOUND_ERROR,
2931
"User wasn't found or specified an invalid password."
3032
)
31-
return json(message, 400)
33+
response.data.pop(Response.EVENT_FIELD_NAME, None)
34+
return json(response.data, 400)
3235

3336
payload = build_payload(request.app, extra_data={"user_id": str(user.pk)})
3437
response = await generate_token_pair(request, payload, user.username)
@@ -39,9 +42,11 @@ async def verify_token(request):
3942
try:
4043
raw_access_token = extract_token(request)
4144
except (MissingAuthorizationHeader, InvalidHeaderPrefix) as exc:
42-
result = OrderedDict({"is_valid": False})
43-
result.update(exc.details)
44-
return json(result, status=exc.status_code)
45+
error = exc.details
46+
error.pop(Response.EVENT_FIELD_NAME, None)
47+
response = OrderedDict({"is_valid": False})
48+
response.update(error)
49+
return json(response, status=exc.status_code)
4550

4651
secret = request.app.config["JWT_SECRET_KEY"]
4752
algorithm = request.app.config["JWT_ALGORITHM"]
@@ -54,16 +59,20 @@ async def verify_token(request):
5459
except (InvalidIssuedAtError, ExpiredSignatureError) as exc:
5560
is_valid = False
5661
status_code = 400
57-
error = wrap_error(TOKEN_ERROR, str(exc))
62+
error = Response.from_error(TOKEN_ERROR, str(exc))
5863
except InvalidTokenError as exc:
5964
is_valid = False
6065
status_code = 400
61-
error = wrap_error(TOKEN_ERROR, str(exc))
66+
error = Response.from_error(TOKEN_ERROR, str(exc))
6267

63-
response = OrderedDict({CONTENT_FIELD_NAME: "OK", "is_valid": is_valid})
68+
response = OrderedDict({
69+
Response.CONTENT_FIELD_NAME: "OK",
70+
"is_valid": is_valid
71+
})
6472
if error:
65-
response.pop(CONTENT_FIELD_NAME, None)
66-
response.update(error)
73+
error.data.pop(Response.EVENT_FIELD_NAME)
74+
response.pop(Response.CONTENT_FIELD_NAME, None)
75+
response.update(error.data)
6776

6877
return json(response, status=status_code)
6978

@@ -72,13 +81,19 @@ async def refresh_token_pairs(request):
7281
try:
7382
token = extract_and_decode_token(request)
7483
except (MissingAuthorizationHeader, InvalidHeaderPrefix) as exc:
75-
return json(exc.details, status=exc.status_code)
84+
response = exc.details
85+
response.pop(Response.EVENT_FIELD_NAME, None)
86+
return json(response, status=exc.status_code)
7687
except InvalidTokenError as exc:
77-
return json(wrap_error(TOKEN_ERROR, str(exc)), status=400)
88+
response = Response.from_error(TOKEN_ERROR, str(exc))
89+
response.data.pop(Response.EVENT_FIELD_NAME, None)
90+
return json(response.data, status=400)
7891

7992
request_body = RefreshTokenSchema().load(request.json or {})
8093
if request_body.errors:
81-
return json(wrap_error(TOKEN_ERROR, request_body.errors), 400)
94+
response = Response.from_error(TOKEN_ERROR, request_body.errors)
95+
response.data.pop(Response.EVENT_FIELD_NAME, None)
96+
return json(response.data, 400)
8297

8398
user_id = token.get('user_id', None)
8499
user_document = request.app.config["LAZY_UMONGO"].User
@@ -89,11 +104,12 @@ async def refresh_token_pairs(request):
89104
existing_refresh_token = await get_refresh_token_from_redis(request.app.redis, key)
90105

91106
if not user or (user and existing_refresh_token != refresh_token):
92-
message = wrap_error(
107+
response = Response.from_error(
93108
TOKEN_ERROR,
94109
"User wasn't found or specified an invalid `refresh_token`."
95110
)
96-
return json(message, 400)
111+
response.data.pop(Response.EVENT_FIELD_NAME, None)
112+
return json(response.data, 400)
97113

98114
secret = request.app.config["JWT_SECRET_KEY"]
99115
algorithm = request.app.config["JWT_ALGORITHM"]

auth/app/token/exceptions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from sanic.exceptions import SanicException
2-
3-
from app.generic.utils import TOKEN_ERROR, AUTHORIZATION_ERROR, HEADER_ERROR, wrap_error
2+
from sage_utils.constants import TOKEN_ERROR, AUTHORIZATION_ERROR, HEADER_ERROR
3+
from sage_utils.wrappers import Response
44

55

66
class BaseTokenException(SanicException):
@@ -13,7 +13,7 @@ def __init__(self, message=message):
1313

1414
@property
1515
def details(self):
16-
return wrap_error(self.error_type, self.message)
16+
return Response.from_error(self.error_type, self.message).data
1717

1818

1919
class MissingAuthorizationHeader(BaseTokenException):
@@ -33,4 +33,4 @@ def __init__(self, message=message, prefix=''):
3333
@property
3434
def details(self):
3535
message = self.message.format(prefix=self.prefix)
36-
return wrap_error(HEADER_ERROR, message)
36+
return Response.from_error(HEADER_ERROR, message).data

auth/app/users/api/v1/views.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from bson.objectid import ObjectId
22
from jwt import InvalidTokenError
33
from sanic.response import json
4+
from sage_utils.constants import VALIDATION_ERROR, NOT_FOUND_ERROR, TOKEN_ERROR
5+
from sage_utils.wrappers import Response
46
from marshmallow import ValidationError
57

68
from app.generic.views import APIView
7-
from app.generic.utils import VALIDATION_ERROR, NOT_FOUND_ERROR, TOKEN_ERROR, wrap_error
89
from app.token.exceptions import MissingAuthorizationHeader, InvalidHeaderPrefix
910
from app.token.json_web_token import extract_and_decode_token
1011

@@ -35,8 +36,9 @@ async def post(self, request):
3536
data = self.deserialize(request.json)
3637
await self.validate_username_for_uniqueness(data["username"])
3738
except ValidationError as exc:
38-
errors = exc.normalized_messages()
39-
return json(wrap_error(VALIDATION_ERROR, errors), status=400)
39+
response = Response.from_error(VALIDATION_ERROR, exc.normalized_messages())
40+
response.data.pop(Response.EVENT_FIELD_NAME, None)
41+
return json(response.data, status=400)
4042

4143
data['groups'] = await self.group_document\
4244
.find({"name": self.default_group_name})\
@@ -65,14 +67,20 @@ async def get(self, request):
6567
try:
6668
token = extract_and_decode_token(request)
6769
except (MissingAuthorizationHeader, InvalidHeaderPrefix) as exc:
68-
return json(exc.details, status=exc.status_code)
70+
response = exc.details
71+
response.pop(Response.EVENT_FIELD_NAME, None)
72+
return json(response, status=exc.status_code)
6973
except InvalidTokenError as exc:
70-
return json(wrap_error(TOKEN_ERROR, str(exc)), status=400)
74+
response = Response.from_error(TOKEN_ERROR, str(exc))
75+
response.data.pop(Response.EVENT_FIELD_NAME, None)
76+
return json(response.data, status=400)
7177

7278
user_id = token.get('user_id', None)
7379
user = await self.user_document.find_one({"_id": ObjectId(user_id)})
7480
if not user:
75-
return json(wrap_error(NOT_FOUND_ERROR, "User was not found."), status=400)
81+
response = Response.from_error(NOT_FOUND_ERROR, "User was not found.")
82+
response.data.pop(Response.EVENT_FIELD_NAME, None)
83+
return json(response.data, status=400)
7684

7785
pipeline = [
7886
{'$match': {'_id': {'$in': [obj.pk for obj in user.groups]}}},

auth/tests/test_generate_token.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import json
22

3-
from app.generic.utils import ERROR_FIELD_NAME, EVENT_FIELD_NAME, NOT_FOUND_ERROR, \
4-
VALIDATION_ERROR
3+
from sage_utils.constants import NOT_FOUND_ERROR, VALIDATION_ERROR
4+
from sage_utils.wrappers import Response
5+
56
from app.users.documents import User
67

78

@@ -39,9 +40,9 @@ async def test_generate_token_returns_error_for_an_invalid_username(sanic_server
3940
response_json = await response.json()
4041
assert response.status == 400
4142
assert len(response_json.keys()) == 1
42-
assert ERROR_FIELD_NAME in response_json.keys()
43-
assert EVENT_FIELD_NAME not in response_json.keys()
44-
error = response_json[ERROR_FIELD_NAME]
43+
assert Response.ERROR_FIELD_NAME in response_json.keys()
44+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
45+
error = response_json[Response.ERROR_FIELD_NAME]
4546

4647
assert 'type' in error.keys()
4748
assert error['type'] == NOT_FOUND_ERROR
@@ -65,9 +66,9 @@ async def test_generate_token_returns_error_for_an_invalid_password(sanic_server
6566
response_json = await response.json()
6667
assert response.status == 400
6768
assert len(response_json.keys()) == 1
68-
assert ERROR_FIELD_NAME in response_json.keys()
69-
assert EVENT_FIELD_NAME not in response_json.keys()
70-
error = response_json[ERROR_FIELD_NAME]
69+
assert Response.ERROR_FIELD_NAME in response_json.keys()
70+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
71+
error = response_json[Response.ERROR_FIELD_NAME]
7172

7273
assert 'type' in error.keys()
7374
assert error['type'] == NOT_FOUND_ERROR
@@ -84,9 +85,9 @@ async def test_generate_token_returns_validation_error_for_empty_body(sanic_serv
8485
response_json = await response.json()
8586
assert response.status == 400
8687
assert len(response_json.keys()) == 1
87-
assert ERROR_FIELD_NAME in response_json.keys()
88-
assert EVENT_FIELD_NAME not in response_json.keys()
89-
error = response_json[ERROR_FIELD_NAME]
88+
assert Response.ERROR_FIELD_NAME in response_json.keys()
89+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
90+
error = response_json[Response.ERROR_FIELD_NAME]
9091
assert len(error.keys()) == 2
9192

9293
assert 'type' in error.keys()

auth/tests/test_refresh_token.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import json
22

3-
from app.generic.utils import ERROR_FIELD_NAME, EVENT_FIELD_NAME, AUTHORIZATION_ERROR, \
4-
HEADER_ERROR, TOKEN_ERROR
3+
from sage_utils.constants import AUTHORIZATION_ERROR, HEADER_ERROR, TOKEN_ERROR
4+
from sage_utils.wrappers import Response
5+
56
from app.users.documents import User
67

78

@@ -46,9 +47,9 @@ async def test_refresh_token_returns_error_for_a_missing_authorization_header(sa
4647
response_json = await response.json()
4748
assert response.status == 400
4849
assert len(response_json.keys()) == 1
49-
assert ERROR_FIELD_NAME in response_json.keys()
50-
assert EVENT_FIELD_NAME not in response_json.keys()
51-
error = response_json[ERROR_FIELD_NAME]
50+
assert Response.ERROR_FIELD_NAME in response_json.keys()
51+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
52+
error = response_json[Response.ERROR_FIELD_NAME]
5253

5354
assert 'type' in error.keys()
5455
assert error['type'] == AUTHORIZATION_ERROR
@@ -84,9 +85,9 @@ async def test_refresh_token_return_error_for_a_missing_header_prefix(sanic_serv
8485
response_json = await response.json()
8586
assert response.status == 400
8687
assert len(response_json.keys()) == 1
87-
assert ERROR_FIELD_NAME in response_json.keys()
88-
assert EVENT_FIELD_NAME not in response_json.keys()
89-
error = response_json[ERROR_FIELD_NAME]
88+
assert Response.ERROR_FIELD_NAME in response_json.keys()
89+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
90+
error = response_json[Response.ERROR_FIELD_NAME]
9091

9192
assert 'type' in error.keys()
9293
assert error['type'] == HEADER_ERROR
@@ -125,9 +126,9 @@ async def test_refresh_token_return_error_for_an_invalid_header_prefix(sanic_ser
125126
response_json = await response.json()
126127
assert response.status == 400
127128
assert len(response_json.keys()) == 1
128-
assert ERROR_FIELD_NAME in response_json.keys()
129-
assert EVENT_FIELD_NAME not in response_json.keys()
130-
error = response_json[ERROR_FIELD_NAME]
129+
assert Response.ERROR_FIELD_NAME in response_json.keys()
130+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
131+
error = response_json[Response.ERROR_FIELD_NAME]
131132

132133
assert 'type' in error.keys()
133134
assert error['type'] == HEADER_ERROR
@@ -169,9 +170,9 @@ async def test_refresh_token_return_error_for_an_invalid_access_token(sanic_serv
169170
response_json = await response.json()
170171
assert response.status == 400
171172
assert len(response_json.keys()) == 1
172-
assert ERROR_FIELD_NAME in response_json.keys()
173-
assert EVENT_FIELD_NAME not in response_json.keys()
174-
error = response_json[ERROR_FIELD_NAME]
173+
assert Response.ERROR_FIELD_NAME in response_json.keys()
174+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
175+
error = response_json[Response.ERROR_FIELD_NAME]
175176

176177
assert 'type' in error.keys()
177178
assert error['type'] == TOKEN_ERROR
@@ -210,9 +211,9 @@ async def test_refresh_token_return_error_for_a_missing_refresh_token(sanic_serv
210211
response_json = await response.json()
211212
assert response.status == 400
212213
assert len(response_json.keys()) == 1
213-
assert ERROR_FIELD_NAME in response_json.keys()
214-
assert EVENT_FIELD_NAME not in response_json.keys()
215-
error = response_json[ERROR_FIELD_NAME]
214+
assert Response.ERROR_FIELD_NAME in response_json.keys()
215+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
216+
error = response_json[Response.ERROR_FIELD_NAME]
216217

217218
assert 'type' in error.keys()
218219
assert error['type'] == TOKEN_ERROR
@@ -257,9 +258,9 @@ async def test_refresh_token_return_error_for_an_refresh_token(sanic_server):
257258
response_json = await response.json()
258259
assert response.status == 400
259260
assert len(response_json.keys()) == 1
260-
assert ERROR_FIELD_NAME in response_json.keys()
261-
assert EVENT_FIELD_NAME not in response_json.keys()
262-
error = response_json[ERROR_FIELD_NAME]
261+
assert Response.ERROR_FIELD_NAME in response_json.keys()
262+
assert Response.EVENT_FIELD_NAME not in response_json.keys()
263+
error = response_json[Response.ERROR_FIELD_NAME]
263264

264265
assert 'type' in error.keys()
265266
assert error['type'] == TOKEN_ERROR

0 commit comments

Comments
 (0)