diff --git a/V2/local.settings.json b/V2/local.settings.json index 50965a73..3fea49b0 100644 --- a/V2/local.settings.json +++ b/V2/local.settings.json @@ -1 +1,10 @@ -{"IsEncrypted":false,"Values":{"AzureWebJobsStorage":"UseDevelopmentStorage=true","FUNCTIONS_WORKER_RUNTIME":"python"}} \ No newline at end of file +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "FUNCTIONS_WORKER_RUNTIME": "python" + }, + "Host": { + "CORS": "*" + } +} diff --git a/V2/tests/api/azure/activity_azure_endpoints_test.py b/V2/tests/api/azure/activity_azure_endpoints_test.py index 7c0de311..aa7e7b40 100644 --- a/V2/tests/api/azure/activity_azure_endpoints_test.py +++ b/V2/tests/api/azure/activity_azure_endpoints_test.py @@ -4,6 +4,8 @@ import azure.functions as func import time_tracker.activities._application._activities as azure_activities +from time_tracker.utils.parsers import parse_status_to_string_for_ui as parse_status +from time_tracker.utils.enums import StatusEnums ACTIVITY_URL = '/api/activities/' @@ -13,8 +15,8 @@ def test__activity_azure_endpoint__returns_all_activities( ): existent_activities = [activity_factory(), activity_factory()] inserted_activities = [ - insert_activity(existent_activities[0], test_db).__dict__, - insert_activity(existent_activities[1], test_db).__dict__ + parse_status(insert_activity(existent_activities[0], test_db).__dict__), + parse_status(insert_activity(existent_activities[1], test_db).__dict__) ] req = func.HttpRequest(method='GET', body=None, url=ACTIVITY_URL) @@ -29,7 +31,7 @@ def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_it test_db, activity_factory, insert_activity ): existent_activity = activity_factory() - inserted_activity = insert_activity(existent_activity, test_db).__dict__ + inserted_activity = parse_status(insert_activity(existent_activity, test_db).__dict__) req = func.HttpRequest( method='GET', @@ -62,7 +64,7 @@ def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__whe activity_json_data = json.loads(response.get_body().decode("utf-8")) assert response.status_code == 200 - assert activity_json_data['status'] == 0 + assert activity_json_data['status'] == StatusEnums(0).name assert activity_json_data['deleted'] is True @@ -70,7 +72,7 @@ def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_act test_db, activity_factory, insert_activity ): existent_activity = activity_factory() - inserted_activity = insert_activity(existent_activity, test_db).__dict__ + inserted_activity = parse_status(insert_activity(existent_activity, test_db).__dict__) activity_body = {"description": Faker().sentence()} req = func.HttpRequest( @@ -108,4 +110,4 @@ def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_at activity_body['id'] = activitiy_json_data['id'] assert response.status_code == 201 - assert activitiy_json_data == activity_body + assert activitiy_json_data == parse_status(activity_body) diff --git a/V2/time_tracker/activities/_application/_activities/_create_activity.py b/V2/time_tracker/activities/_application/_activities/_create_activity.py index 8d5b912d..81c0fd73 100644 --- a/V2/time_tracker/activities/_application/_activities/_create_activity.py +++ b/V2/time_tracker/activities/_application/_activities/_create_activity.py @@ -7,6 +7,7 @@ from ... import _domain from ... import _infrastructure from time_tracker._infrastructure import DB +from time_tracker.utils.parsers import parse_status_to_string_for_ui as parse_status def create_activity(req: func.HttpRequest) -> func.HttpResponse: @@ -27,8 +28,8 @@ def create_activity(req: func.HttpRequest) -> func.HttpResponse: id=None, name=activity_data['name'], description=activity_data['description'], - status=activity_data['status'], - deleted=activity_data['deleted'] + status=None, + deleted=None ) created_activity = use_case.create_activity(activity_to_create) @@ -39,15 +40,16 @@ def create_activity(req: func.HttpRequest) -> func.HttpResponse: mimetype="application/json", ) return func.HttpResponse( - body=json.dumps(created_activity.__dict__), + body=json.dumps(parse_status(created_activity.__dict__)), status_code=201, mimetype="application/json" ) def _validate_activity(activity_data: dict) -> typing.List[str]: - activity_fields = [field.name for field in dataclasses.fields(_domain.Activity)] - missing_keys = [field for field in activity_fields if field not in activity_data] + activity_fields = [field for field in dataclasses.fields(_domain.Activity)] + missing_keys = [field.name for field in activity_fields + if (field.name not in activity_data) and (field.type != typing.Optional[field.type])] return [ f'The {missing_key} key is missing in the input data' for missing_key in missing_keys diff --git a/V2/time_tracker/activities/_application/_activities/_delete_activity.py b/V2/time_tracker/activities/_application/_activities/_delete_activity.py index 746b1073..f8c01dc7 100644 --- a/V2/time_tracker/activities/_application/_activities/_delete_activity.py +++ b/V2/time_tracker/activities/_application/_activities/_delete_activity.py @@ -3,9 +3,11 @@ import azure.functions as func + from ... import _domain from ... import _infrastructure from time_tracker._infrastructure import DB +from time_tracker.utils.parsers import parse_status_to_string_for_ui as parse_status def delete_activity(req: func.HttpRequest) -> func.HttpResponse: @@ -32,7 +34,7 @@ def _delete(activity_id: int) -> str: _create_activity_service(database) ) activity = activity_use_case.delete_activity(activity_id) - return json.dumps(activity.__dict__) if activity else b'Not found' + return json.dumps(parse_status(activity.__dict__)) if activity else b'Not found' def _create_activity_service(db: DB) -> _domain.ActivityService: diff --git a/V2/time_tracker/activities/_application/_activities/_get_activities.py b/V2/time_tracker/activities/_application/_activities/_get_activities.py index dd6053b0..a4974b95 100644 --- a/V2/time_tracker/activities/_application/_activities/_get_activities.py +++ b/V2/time_tracker/activities/_application/_activities/_get_activities.py @@ -6,6 +6,7 @@ from ... import _domain from ... import _infrastructure from time_tracker._infrastructure import DB +from time_tracker.utils.parsers import parse_status_to_string_for_ui as parse_status def get_activities(req: func.HttpRequest) -> func.HttpResponse: @@ -39,7 +40,7 @@ def _get_by_id(activity_id: int, database: DB) -> str: ) activity = activity_use_case.get_activity_by_id(activity_id) - return json.dumps(activity.__dict__) if activity else b'Not Found' + return json.dumps(parse_status(activity.__dict__)) if activity else b'Not Found' def _get_all(database: DB) -> str: @@ -48,7 +49,7 @@ def _get_all(database: DB) -> str: ) return json.dumps( [ - activity.__dict__ + parse_status(activity.__dict__) for activity in activities_use_case.get_activities() ] ) diff --git a/V2/time_tracker/activities/_application/_activities/_update_activity.py b/V2/time_tracker/activities/_application/_activities/_update_activity.py index 4717042c..ba963982 100644 --- a/V2/time_tracker/activities/_application/_activities/_update_activity.py +++ b/V2/time_tracker/activities/_application/_activities/_update_activity.py @@ -7,6 +7,9 @@ from ... import _domain from ... import _infrastructure from time_tracker._infrastructure import DB +from time_tracker.utils.parsers import parse_status_to_string_for_ui as parse_status +from time_tracker.utils.parsers import parse_status_to_number +from time_tracker.utils.enums import StatusEnums def update_activity(req: func.HttpRequest) -> func.HttpResponse: @@ -39,13 +42,15 @@ def _update(activity_id: int, activity_data: dict) -> str: activity_use_case = _domain._use_cases.UpdateActivityUseCase( _create_activity_service(database) ) + status = parse_status_to_number(activity_data.get("status")) + deleted = status == StatusEnums.inactive.value activity = activity_use_case.update_activity( activity_id, activity_data.get("name"), activity_data.get("description"), - activity_data.get("status"), - activity_data.get("deleted") + status, + deleted, ) - return json.dumps(activity.__dict__) if activity else b'Not Found' + return json.dumps(parse_status(activity.__dict__)) if activity else b'Not Found' def _create_activity_service(db: DB) -> _domain.ActivityService: diff --git a/V2/time_tracker/activities/_domain/_entities/_activity.py b/V2/time_tracker/activities/_domain/_entities/_activity.py index cf574054..ec62cdb7 100644 --- a/V2/time_tracker/activities/_domain/_entities/_activity.py +++ b/V2/time_tracker/activities/_domain/_entities/_activity.py @@ -1,10 +1,12 @@ +import typing + from dataclasses import dataclass @dataclass(frozen=True) class Activity: - id: int + id: typing.Optional[int] name: str description: str - deleted: bool - status: int + deleted: typing.Optional[bool] + status: typing.Optional[int] diff --git a/V2/time_tracker/utils/enums/__init__.py b/V2/time_tracker/utils/enums/__init__.py index 317ca876..d42c8657 100644 --- a/V2/time_tracker/utils/enums/__init__.py +++ b/V2/time_tracker/utils/enums/__init__.py @@ -1,2 +1,3 @@ # flake8: noqa -from .response_enums import ResponseEnums \ No newline at end of file +from .response_enums import ResponseEnums +from .status_enums import StatusEnums \ No newline at end of file diff --git a/V2/time_tracker/utils/enums/status_enums.py b/V2/time_tracker/utils/enums/status_enums.py new file mode 100644 index 00000000..90c3576a --- /dev/null +++ b/V2/time_tracker/utils/enums/status_enums.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class StatusEnums(Enum): + inactive = 0 + active = 1 diff --git a/V2/time_tracker/utils/parsers/__init__.py b/V2/time_tracker/utils/parsers/__init__.py new file mode 100644 index 00000000..42182dd7 --- /dev/null +++ b/V2/time_tracker/utils/parsers/__init__.py @@ -0,0 +1,2 @@ +# flake8: noqa +from .activity_parser import parse_status_to_number, parse_status_to_string_for_ui \ No newline at end of file diff --git a/V2/time_tracker/utils/parsers/activity_parser.py b/V2/time_tracker/utils/parsers/activity_parser.py new file mode 100644 index 00000000..e9d46626 --- /dev/null +++ b/V2/time_tracker/utils/parsers/activity_parser.py @@ -0,0 +1,12 @@ +from time_tracker.utils.enums import StatusEnums + + +def parse_status_to_string_for_ui(activity: dict) -> dict: + activity['status'] = StatusEnums(activity['status']).name + return activity + + +def parse_status_to_number(status: str) -> int: + if(isinstance(status, str)): + return StatusEnums[status].value + return status