Skip to content

Commit 575d309

Browse files
committed
feat: enable core app functionality and exception handling
1 parent 2dcc458 commit 575d309

File tree

6 files changed

+27
-18
lines changed

6 files changed

+27
-18
lines changed

app/core/factory.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from fastapi import FastAPI
44
from fastapi.middleware.cors import CORSMiddleware
55

6-
# from app.interface_adapters import api_router
7-
# from app.interface_adapters.exceptions import AppException
8-
# from app.interface_adapters.middleware.error_handler import app_exception_handler
6+
from app.interface_adapters import api_router
7+
from app.interface_adapters.exceptions import AppException
8+
from app.interface_adapters.middleware.error_handler import app_exception_handler
99
from config import Settings
1010
from app.resource_adapters.persistence.sqlmodel.database import get_engine
1111

@@ -31,10 +31,10 @@ async def default_lifespan(app: FastAPI):
3131
)
3232

3333
# Register global exception handler
34-
# app.add_exception_handler(AppException, app_exception_handler)
34+
app.add_exception_handler(AppException, app_exception_handler)
3535

3636
# Register routes
37-
# app.include_router(api_router, prefix="/v1")
37+
app.include_router(api_router, prefix="/v1")
3838

3939
# Configure CORS
4040
app.add_middleware(

app/domain/aggregate_root.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import abc
22
from datetime import datetime
33
from typing import Protocol
4+
from config import get_settings
45

56
from sqlmodel import SQLModel
67

@@ -10,7 +11,8 @@ class BaseCommand(Protocol):
1011
timestamp: datetime
1112

1213
# might need specification pattern here
13-
def validate(self) -> bool: ...
14+
def validate(self) -> bool:
15+
...
1416

1517

1618
class BaseEvent(Protocol):
@@ -26,6 +28,7 @@ class AggregateRoot(SQLModel, abc.ABC, table=False):
2628
Before using this class for database operations, ensure that set_metadata has been called.
2729
"""
2830

31+
__table_args__ = {"schema": get_settings().get_table_schema}
2932
version: int = 0
3033

3134
def __init__(self, **data):

app/resource_adapters/persistence/sqlmodel/database.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ def get_session(
4141
settings: Annotated[Settings, Depends(get_settings)],
4242
) -> Generator[Session, Settings, None]:
4343
with Session(_engine) as session:
44-
session.connection(
44+
""" session.connection(
4545
execution_options={
4646
"schema_translate_map": {None: settings.get_table_schema}
4747
}
48-
)
48+
) """
4949
yield session
5050

5151

@@ -85,9 +85,9 @@ def get_engine(_settings: Settings | None = None) -> Engine:
8585
if _settings.database_type == "sqlmodel":
8686
SQLModel.metadata.schema = _settings.get_table_schema
8787
with _engine.connect() as conn:
88-
conn.execution_options = {
88+
""" conn.execution_options = {
8989
"schema_translate_map": {None: _settings.get_table_schema}
90-
}
90+
} """
9191
if not _settings.database_url.startswith(
9292
"sqlite"
9393
) and not conn.dialect.has_schema(conn, _settings.get_table_schema):

app/tests/conftest.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010
from loguru import logger
1111
from sqlmodel import Session, delete
1212

13-
from app.core.factory import create_app
14-
from app.resource_adapters.persistence.sqlmodel.database import get_engine
15-
from app.resource_adapters.persistence.sqlmodel.issues import Issue
16-
from config import get_settings
1713

1814
# Specify the custom .env file
15+
# don't change ordering here, settings must be called prior to initialization of app.core.factory
1916
dotenv_path = Path(".env.testing")
2017
load_dotenv(dotenv_path=dotenv_path, override=True)
2118

19+
from app.core.factory import create_app # noqa: E402
20+
from app.resource_adapters.persistence.sqlmodel.database import get_engine # noqa: E402
21+
from app.resource_adapters.persistence.sqlmodel.issues import Issue # noqa: E402
22+
from config import get_settings # noqa: E402
23+
2224

2325
settings = get_settings()
2426

@@ -51,7 +53,7 @@ async def test_lifespan(app: FastAPI):
5153
@pytest.fixture(name="app")
5254
def test_app():
5355
"""Create test app instance only during test execution."""
54-
return create_app(settings, lifespan_handler=test_lifespan)
56+
return create_app(settings)
5557

5658

5759
@pytest.fixture(name="session")

config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from pydantic import AnyHttpUrl
44
from pydantic_settings import BaseSettings, SettingsConfigDict
5+
from functools import lru_cache
56

67

78
class Settings(BaseSettings):
@@ -55,6 +56,6 @@ def backend_cors_origins_list(self) -> List[AnyHttpUrl]:
5556

5657

5758
# Singleton pattern to ensure only one settings instance
58-
# @lru_cache()
59+
@lru_cache()
5960
def get_settings() -> "Settings":
6061
return Settings()

main.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
from loguru import logger
88
from pydantic import BaseModel, Field
99

10-
from app.core.factory import create_app
1110
from config import Settings, get_settings
1211

12+
# don't change ordering here, settings must be called prior to initialization of app.core.factory
13+
_settings = get_settings()
14+
15+
from app.core.factory import create_app # noqa: E402
1316

1417
# https://brandur.org/logfmt
1518
# https://github.com/Delgan/loguru
@@ -84,7 +87,7 @@ def create_health_response(is_healthy: bool, check_name: str) -> JSONResponse:
8487
)
8588

8689

87-
app = create_app(get_settings())
90+
app = create_app(_settings)
8891

8992
# middleware options
9093
# https://levelup.gitconnected.com/17-useful-middlewares-for-fastapi-that-you-should-know-about-951c2b0869c7

0 commit comments

Comments
 (0)