Skip to content

Commit c1e8fea

Browse files
sandereggpcrespov
andauthored
♻️Storage: use transactions helpers (#7343)
Co-authored-by: Pedro Crespo-Valero <[email protected]>
1 parent 189df7a commit c1e8fea

File tree

14 files changed

+970
-844
lines changed

14 files changed

+970
-844
lines changed

packages/postgres-database/src/simcore_postgres_database/utils_repos.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async def pass_or_acquire_connection(
4242
@asynccontextmanager
4343
async def transaction_context(
4444
engine: AsyncEngine, connection: AsyncConnection | None = None
45-
):
45+
) -> AsyncIterator[AsyncConnection]:
4646
"""
4747
When to use: For WRITE operations!
4848
This function manages the database connection and ensures that a transaction context is established for write operations.

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/credit_transactions_db.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
resource_tracker_service_runs,
1818
)
1919
from simcore_postgres_database.utils_repos import transaction_context
20+
from sqlalchemy.engine import CursorResult
2021
from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine
2122

2223
from ....exceptions.errors import CreditTransactionNotCreatedDBError
@@ -165,6 +166,8 @@ async def batch_update_credit_transaction_status_for_in_debt_transactions(
165166
)
166167
async with transaction_context(engine, connection) as conn:
167168
result = await conn.execute(update_stmt)
169+
# NOTE: see https://docs.sqlalchemy.org/en/20/tutorial/data_update.html#getting-affected-row-count-from-update-delete
170+
assert isinstance(result, CursorResult) # nosec
168171
if result.rowcount:
169172
_logger.info(
170173
"Wallet %s and project %s transactions in DEBT were changed to BILLED. Num. of transaction %s",

services/storage/src/simcore_service_storage/datcore_dsm.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
from .modules.datcore_adapter.datcore_adapter_exceptions import (
3434
DatcoreAdapterMultipleFilesError,
3535
)
36-
from .modules.db.tokens import get_api_token_and_secret
36+
from .modules.db import get_db_engine
37+
from .modules.db.tokens import TokenRepository
3738

3839

3940
def _check_api_credentials(
@@ -60,7 +61,9 @@ class DatCoreDataManager(BaseDataManager):
6061
async def _get_datcore_tokens(
6162
self, user_id: UserID
6263
) -> tuple[str | None, str | None]:
63-
return await get_api_token_and_secret(self.app, user_id)
64+
return await TokenRepository.instance(
65+
get_db_engine(self.app)
66+
).get_api_token_and_secret(user_id=user_id)
6467

6568
@classmethod
6669
def get_location_id(cls) -> LocationID:
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from dataclasses import dataclass
2+
from typing import TypeVar
3+
4+
from sqlalchemy.ext.asyncio import AsyncEngine
5+
6+
RepositoryType = TypeVar("RepositoryType", bound="BaseRepository")
7+
8+
9+
@dataclass
10+
class BaseRepository:
11+
db_engine: AsyncEngine
12+
13+
@classmethod
14+
def instance(cls: type[RepositoryType], db_engine: AsyncEngine) -> RepositoryType:
15+
return cls(db_engine=db_engine)

0 commit comments

Comments
 (0)