Skip to content

Commit 3a46de6

Browse files
committed
fix: TT-402 refactor azure update endpoint
1 parent 972cdaa commit 3a46de6

File tree

3 files changed

+68
-45
lines changed

3 files changed

+68
-45
lines changed

V2/tests/api/azure/time_entry_azure_endpoints_test.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def test__update_time_entry_azure_endpoint__returns_an_time_entry__when_found_an
103103
assert activitiy_json_data == json.dumps(inserted_time_entries)
104104

105105

106-
def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_time_entry_recive_invalid_id():
106+
def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_format_id():
107107
time_entry_body = {"description": Faker().sentence()}
108108

109109
req = func.HttpRequest(
@@ -115,10 +115,26 @@ def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_ti
115115

116116
response = azure_time_entries._update_time_entry.update_time_entry(req)
117117

118-
assert response.status_code == 404
118+
assert response.status_code == 400
119119
assert response.get_body() == b'Invalid Format ID'
120120

121121

122+
def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_time_entry_recive_invalid_id():
123+
time_entry_body = {"description": Faker().sentence()}
124+
125+
req = func.HttpRequest(
126+
method="PUT",
127+
body=json.dumps(time_entry_body).encode("utf-8"),
128+
url=TIME_ENTRY_URL,
129+
route_params={"id": Faker().pyint()},
130+
)
131+
132+
response = azure_time_entries._update_time_entry.update_time_entry(req)
133+
134+
assert response.status_code == 404
135+
assert response.get_body() == b'Not found'
136+
137+
122138
def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_body():
123139

124140
time_entry_body = Faker().pydict(5, True, str)
Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,49 @@
11
import dataclasses
22
import json
3-
import logging
43

54
import azure.functions as func
65

7-
from time_tracker.time_entries._infrastructure import TimeEntriesSQLDao
8-
from time_tracker.time_entries._domain import TimeEntryService, TimeEntry, _use_cases
6+
from ... import _domain
7+
from ... import _infrastructure
98
from time_tracker._infrastructure import DB
109

1110

1211
def update_time_entry(req: func.HttpRequest) -> func.HttpResponse:
13-
logging.info(
14-
'Python HTTP trigger function processed a request to update an time entry.'
15-
)
16-
time_entry_id = req.route_params.get('id')
17-
time_entry_data = req.get_json() if req.get_body() else {}
18-
time_entry_keys = [field.name for field in dataclasses.fields(TimeEntry)]
19-
20-
if all(key in time_entry_keys for key in time_entry_data.keys()):
21-
try:
22-
response = _update(int(time_entry_id), time_entry_data)
23-
status_code = 200
24-
except ValueError:
25-
response = b'Invalid Format ID'
26-
status_code = 404
27-
else:
28-
response = b'Incorrect time entry body'
29-
status_code = 400
30-
31-
return func.HttpResponse(
32-
body=response, status_code=status_code, mimetype="application/json"
33-
)
34-
35-
36-
def _update(time_entry_id: int, time_entry_data: dict) -> str:
3712
database = DB()
38-
time_entry_use_case = _use_cases.UpdateTimeEntryUseCase(
39-
_create_time_entry_service(database)
40-
)
41-
time_entry = time_entry_use_case.update_time_entry(time_entry_id, time_entry_data)
42-
return json.dumps(time_entry.__dict__) if time_entry else b'Not Found'
43-
44-
45-
def _create_time_entry_service(db: DB):
46-
time_entry_dao = TimeEntriesSQLDao(db)
47-
return TimeEntryService(time_entry_dao)
13+
time_entry_dao = _infrastructure.TimeEntriesSQLDao(database)
14+
time_entry_service = _domain.TimeEntryService(time_entry_dao)
15+
use_case = _domain._use_cases.UpdateTimeEntryUseCase(time_entry_service)
16+
17+
try:
18+
time_entry_id = int(req.route_params.get("id"))
19+
time_entry_data = req.get_json()
20+
status_code = 200
21+
22+
if not _validate_time_entry(time_entry_data):
23+
status_code = 400
24+
response = b"Incorrect time entry body"
25+
else:
26+
response = use_case.update_time_entry(time_entry_id, time_entry_data)
27+
if not response:
28+
status_code = 404
29+
response = b"Not found"
30+
else:
31+
response = json.dumps(response.__dict__)
32+
33+
return func.HttpResponse(
34+
body=response,
35+
status_code=status_code,
36+
mimetype="application/json",
37+
)
38+
39+
except ValueError:
40+
return func.HttpResponse(
41+
body=b"Invalid Format ID",
42+
status_code=400,
43+
mimetype="application/json"
44+
)
45+
46+
47+
def _validate_time_entry(time_entry_data: dict) -> bool:
48+
time_entry_keys = [field.name for field in dataclasses.fields(_domain.TimeEntry)]
49+
return all(key in time_entry_keys for key in time_entry_data.keys())

V2/time_tracker/time_entries/_infrastructure/_data_persistence/_time_entries_dao.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,18 @@ def create(self, time_entry_data: domain.TimeEntry) -> domain.TimeEntry:
4545
return None
4646

4747
def update(self, time_entry_id: int, time_entry_data: dict) -> domain.TimeEntry:
48+
try:
49+
query = self.time_entry.update().where(self.time_entry.c.id == time_entry_id).values(time_entry_data)
50+
self.db.get_session().execute(query)
51+
query_updated_time_entry = (
52+
sqlalchemy.sql.select(self.time_entry)
53+
.where(self.time_entry.c.id == time_entry_id)
54+
)
55+
time_entry = self.db.get_session().execute(query_updated_time_entry).one_or_none()
4856

49-
query = self.time_entry.update().where(self.time_entry.c.id == time_entry_id).values(time_entry_data)
50-
self.db.get_session().execute(query)
51-
query_updated_time_entry = sqlalchemy.sql.select(self.time_entry).where(self.time_entry.c.id == time_entry_id)
52-
time_entry = self.db.get_session().execute(query_updated_time_entry).one_or_none()
53-
54-
return self.__create_time_entry_dto(dict(time_entry)) if time_entry else None
57+
return self.__create_time_entry_dto(dict(time_entry)) if time_entry else None
58+
except sqlalchemy.exc.SQLAlchemyError:
59+
return None
5560

5661
def delete(self, time_entry_id: int) -> domain.TimeEntry:
5762
query = (

0 commit comments

Comments
 (0)