Skip to content

Commit c0c2b28

Browse files
committed
feat: TT-357 Docker and database configuration
1 parent 261e42c commit c0c2b28

File tree

10 files changed

+58
-28
lines changed

10 files changed

+58
-28
lines changed

V2/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ install:
44
pip install --upgrade pip
55
pip install -r requirements.txt
66
@echo "Completed! "
7-
7+
start-local:
8+
docker compose up

V2/docker-compose.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: '3.9'
2+
services:
3+
database:
4+
image: postgres:14
5+
ports:
6+
- "5433:5432"
7+
environment:
8+
- POSTGRES_USER=${DB_USER}
9+
- POSTGRES_PASSWORD=${DB_PASS}
10+
- POSTGRES_DB=${DB_NAME}

V2/tests/integration/daos/activities_sql_dao_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
@pytest.fixture(name='create_fake_database')
99
def _create_fake_database(with_data: bool) -> domain.ActivitiesDao:
10-
infrastructure.db.db_init('sqlite:///:memory:')
10+
db_fake = infrastructure.DB('sqlite:///:memory:')
1111
demo_data = [
1212
{
1313
'id': uuid.UUID('b4327ba6-9f96-49ee-a9ac-3c1edf525172'),
@@ -27,9 +27,9 @@ def _create_fake_database(with_data: bool) -> domain.ActivitiesDao:
2727
},
2828
]
2929
if with_data:
30-
query = infrastructure.db.activity.insert()
31-
infrastructure.db.connection.execute(query, demo_data)
32-
return infrastructure.db
30+
query = db_fake.activity.insert()
31+
db_fake.connection.execute(query, demo_data)
32+
return db_fake
3333

3434

3535
@pytest.mark.parametrize('with_data',[False])

V2/time_entries/_application/_activities/_delete_activity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from time_entries._infrastructure import ActivitiesJsonDao, ActivitiesSQLDao, db
1+
from time_entries._infrastructure import ActivitiesJsonDao, ActivitiesSQLDao, DB
22
from time_entries._domain import ActivityService, _use_cases
33

44
import azure.functions as func
@@ -8,7 +8,7 @@
88
JSON_PATH = (
99
'time_entries/_infrastructure/_data_persistence/activities_data.json'
1010
)
11-
DATABASE = db
11+
DATABASE = DB
1212

1313

1414
def delete_activity(req: func.HttpRequest) -> func.HttpResponse:

V2/time_entries/_application/_activities/_get_activities.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from time_entries._infrastructure import ActivitiesJsonDao, ActivitiesSQLDao, db
1+
from time_entries._infrastructure import ActivitiesJsonDao, ActivitiesSQLDao, DB
22
from time_entries._domain import ActivityService, _use_cases
33

44
import azure.functions as func
@@ -8,7 +8,7 @@
88
JSON_PATH = (
99
'time_entries/_infrastructure/_data_persistence/activities_data.json'
1010
)
11-
DATABASE = db
11+
DATABASE = DB
1212

1313

1414
def get_activities(req: func.HttpRequest) -> func.HttpResponse:
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from ._data_persistence import ActivitiesJsonDao
22
from ._data_persistence import ActivitiesSQLDao
3-
from ._data_persistence import db
4-
from ._data_persistence import DataAccessLayerSQL
3+
from ._data_persistence import DB
4+
from ._data_persistence import Config
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from ._activities_json_dao import ActivitiesJsonDao
22
from ._activities_sql_dao import ActivitiesSQLDao
3-
from ._data_access_layer_sql import db
4-
from ._data_access_layer_sql import DataAccessLayerSQL
5-
3+
from ._db import DB
4+
from ._config import Config

V2/time_entries/_infrastructure/_data_persistence/_activities_sql_dao.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ def __init__(self,database):
1414

1515
def get_by_id(self, activity_id: str) -> domain.Activity:
1616
query = sql.select(self.db.activity).where(self.db.activity.c.id == activity_id)
17-
activity = self.db.get_connection().execute(query).one_or_none()
17+
activity = self.db.get_session().execute(query).one_or_none()
1818
return self.__create_activity_dto(dict(activity)) if activity else None
1919

2020
def get_all(self) -> typing.List[domain.Activity]:
2121
query = sql.select(self.db.activity)
22-
result = self.db.get_connection().execute(query)
22+
result = self.db.get_session().execute(query)
2323
return [
2424
self.__create_activity_dto(dict(activity))
2525
for activity in result
@@ -28,18 +28,18 @@ def get_all(self) -> typing.List[domain.Activity]:
2828
def create_activity(self, activity_data: dict) -> domain.Activity:
2929
activity_data.pop('id', None)
3030
query = self.db.activity.insert().values(activity_data)
31-
activity = self.db.get_connection().execute(query)
31+
activity = self.db.get_session().execute(query)
3232
return self.__create_activity_dto(activity.last_inserted_params())
3333

3434
def delete(self, activity_id: str) -> domain.Activity:
3535
query = self.db.activity.update().where(self.db.activity.c.id == activity_id).values(status = 'inactive')
36-
self.db.get_connection().execute(query)
36+
self.db.get_session().execute(query)
3737
return self.get_by_id(activity_id);
3838

3939
def update(self, activity_id: str, new_activity: dict) -> domain.Activity:
4040
new_activity.pop('id', None)
4141
query = self.db.activity.update().where(self.db.activity.c.id==activity_id).values(new_activity)
42-
self.db.get_connection().execute(query)
42+
self.db.get_session().execute(query)
4343
return self.get_by_id(activity_id)
4444

4545
def __create_activity_dto(self, activity: dict) -> domain.Activity:
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import typing
2+
3+
_CONFIG_FILE = '.env'
4+
5+
6+
class Config(typing.NamedTuple):
7+
DB_CONNECTION_STRING: str
8+
DB_USER: str
9+
DB_PASS: str
10+
DB_NAME: str
11+
12+
13+
def load_config():
14+
with open(_CONFIG_FILE, 'r') as config_file:
15+
configs = {
16+
config.split('=')[0]: config.split('=')[1].replace('\n', '')
17+
for config in config_file.readlines()
18+
}
19+
return Config(**configs)

V2/time_entries/_infrastructure/_data_persistence/_data_access_layer_sql.py renamed to V2/time_entries/_infrastructure/_data_persistence/_db.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import sqlalchemy.types as types
44
import sqlalchemy.dialects.postgresql as postgresql
55
import sqlalchemy
6+
7+
from ._config import load_config
8+
9+
610
class GUID(types.TypeDecorator):
711
"""Platform-independent GUID type.
812
Uses PostgreSQL's UUID type, otherwise uses
@@ -36,10 +40,11 @@ def process_result_value(self, value, dialect):
3640
value = uuid.UUID(value)
3741
return value
3842

39-
class DataAccessLayerSQL:
43+
class DB():
44+
config = load_config()
4045
connection = None
4146
engine = None
42-
conn_string = 'postgresql://postgres:root@localhost/time-tracker'
47+
conn_string = config.DB_CONNECTION_STRING
4348
metadata = sqlalchemy.MetaData()
4449
activity = sqlalchemy.Table('activity', metadata,
4550
sqlalchemy.Column('id',GUID() , primary_key=True,default= uuid.uuid4),
@@ -50,14 +55,10 @@ class DataAccessLayerSQL:
5055
sqlalchemy.Column('tenant_id', sqlalchemy.String),
5156
)
5257

53-
def db_init(self, conn_string: str = conn_string):
58+
def __init__(self, conn_string: str = conn_string):
5459
self.engine = sqlalchemy.create_engine(conn_string)
5560
self.metadata.create_all(self.engine)
5661
self.connection = self.engine.connect()
5762

58-
def get_connection(self):
59-
if self.connection == None:
60-
self.db_init()
61-
return self.connection
62-
63-
db = DataAccessLayerSQL()
63+
def get_session(self):
64+
return self.connection

0 commit comments

Comments
 (0)