Skip to content

Commit d4098cc

Browse files
scastillo-jpJobzi
authored andcommitted
feat: TT-404 get time entries
1 parent 3a99add commit d4098cc

File tree

20 files changed

+326
-0
lines changed

20 files changed

+326
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._time_entries import create_time_entry
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._create_time_entry import create_time_entry
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import dataclasses
2+
import json
3+
import typing
4+
5+
import azure.functions as func
6+
7+
from ... import _domain
8+
from ... import _infrastructure
9+
10+
_JSON_PATH = (
11+
'time_entries/_infrastructure/_data_persistence/time_entries_data.json'
12+
)
13+
14+
def create_time_entry(req: func.HttpRequest) -> func.HttpResponse:
15+
16+
time_entry_dao = _infrastructure.TimeEntriesJsonDao(_JSON_PATH)
17+
time_entry_service = _domain.TimeEntryService(time_entry_dao)
18+
use_case = _domain._use_cases.CreateTimeEntryUseCase(time_entry_service)
19+
20+
time_entry_data = req.get_json()
21+
22+
time_entry_to_create = _domain.TimeEntry(
23+
id=None,
24+
start_date=time_entry_data["start_date"],
25+
owner_id=time_entry_data["owner_id"],
26+
description=time_entry_data["description"],
27+
activity_id=time_entry_data["activity_id"],
28+
uri=time_entry_data["uri"],
29+
technologies=time_entry_data["technologies"],
30+
end_date=time_entry_data["end_date"],
31+
deleted=time_entry_data["deleted"],
32+
timezone_offset=time_entry_data["timezone_offset"],
33+
project_id=time_entry_data["project_id"]
34+
)
35+
36+
created_time_entry = use_case.create_time_entry(time_entry_to_create.__dict__)
37+
38+
if not created_time_entry:
39+
return func.HttpResponse(
40+
body=json.dumps({'error': 'time_entry could not be created'}),
41+
status_code=500,
42+
mimetype="application/json"
43+
)
44+
45+
return func.HttpResponse(
46+
body=json.dumps(created_time_entry.__dict__),
47+
status_code=201,
48+
mimetype="application/json"
49+
)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from time_entries._infrastructure import TimeEntriesJsonDao
2+
from time_entries._domain import TimeEntryService, _use_cases
3+
4+
import azure.functions as func
5+
import json
6+
import logging
7+
8+
JSON_PATH = (
9+
'time_entries/_infrastructure/_data_persistence/time_entries_data.json'
10+
)
11+
12+
def get_time_entries(req: func.HttpRequest) -> func.HttpResponse:
13+
logging.info(
14+
'Python HTTP trigger function processed a request to get an activity.'
15+
)
16+
# WIP
17+
time_entry_id = req.route_params.get('id')
18+
status_code = 200
19+
20+
if activity_id:
21+
response = _get_by_id(activity_id)
22+
if response == b'Not Found':
23+
status_code = 404
24+
else:
25+
response = _get_all()
26+
27+
return func.HttpResponse(
28+
body=response, status_code=status_code, mimetype="application/json"
29+
)
30+
31+
32+
def _get_by_id(activity_id: str) -> str:
33+
activity_use_case = _use_cases.GetActivityUseCase(
34+
_create_activity_service(JSON_PATH)
35+
)
36+
activity = activity_use_case.get_activity_by_id(activity_id)
37+
38+
return json.dumps(activity.__dict__) if activity else b'Not Found'
39+
40+
41+
def _get_all() -> str:
42+
activities_use_case = _use_cases.GetActivitiesUseCase(
43+
_create_activity_service(JSON_PATH)
44+
)
45+
return json.dumps(
46+
[
47+
activity.__dict__
48+
for activity in activities_use_case.get_activities()
49+
]
50+
)
51+
52+
53+
def _create_activity_service(path: str):
54+
activity_json = ActivitiesJsonDao(path)
55+
return ActivityService(activity_json)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from ._entities import TimeEntry
2+
from ._persistence_contracts import TimeEntriesDao
3+
from ._services import TimeEntryService
4+
from ._use_cases import (
5+
CreateTimeEntryUseCase,
6+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._time_entry import TimeEntry
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from dataclasses import dataclass
2+
from typing import List
3+
4+
@dataclass(frozen=True)
5+
class TimeEntry:
6+
id: int
7+
start_date: str
8+
owner_id: int
9+
description: str
10+
activity_id: int
11+
uri: str
12+
technologies: List[str]
13+
end_date: str
14+
deleted: str
15+
timezone_offset: str
16+
project_id: int
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._time_entries_dao import TimeEntriesDao
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import abc
2+
import typing
3+
4+
from time_entries._domain import TimeEntry
5+
6+
class TimeEntriesDao(abc.ABC):
7+
@abc.abstractmethod
8+
def get_by_id(self, id: str) -> TimeEntry:
9+
pass
10+
11+
@abc.abstractmethod
12+
def get_all(self) -> typing.List[TimeEntry]:
13+
pass
14+
15+
def create(self, time_entry_data: dict) -> TimeEntry:
16+
pass
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._time_entry import TimeEntryService

0 commit comments

Comments
 (0)