Skip to content

Commit e1df7c5

Browse files
authored
♻️ Minor refactor of RUT API (#4803)
1 parent cf8ae1c commit e1df7c5

File tree

5 files changed

+72
-59
lines changed

5 files changed

+72
-59
lines changed

packages/models-library/src/models_library/api_schemas_resource_usage_tracker/credit_transactions.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
from datetime import datetime
12
from decimal import Decimal
23

4+
from models_library.products import ProductName
5+
from models_library.resource_tracker import CreditTransactionId
6+
from models_library.users import UserID
7+
from models_library.wallets import WalletID
38
from pydantic import BaseModel, validator
49

510
from ..wallets import WalletID
@@ -13,3 +18,20 @@ class WalletTotalCredits(BaseModel):
1318
@classmethod
1419
def ensure_rounded(cls, v):
1520
return round(v, 2)
21+
22+
23+
class CreditTransactionCreateBody(BaseModel):
24+
product_name: ProductName
25+
wallet_id: WalletID
26+
wallet_name: str
27+
user_id: UserID
28+
user_email: str
29+
osparc_credits: Decimal
30+
payment_transaction_id: str
31+
created_at: datetime
32+
33+
34+
class CreditTransactionCreated(BaseModel):
35+
"""Response Create Credit Transaction V1 Credit Transactions Post"""
36+
37+
credit_transaction_id: CreditTransactionId

packages/service-library/src/servicelib/db_async_engine.py

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,44 @@
99
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
1010
from tenacity import retry
1111

12+
from .logging_utils import log_context
1213
from .retry_policies import PostgresRetryPolicyUponInitialization
1314

14-
logger = logging.getLogger(__name__)
15+
_logger = logging.getLogger(__name__)
1516

1617

17-
@retry(**PostgresRetryPolicyUponInitialization(logger).kwargs)
18+
@retry(**PostgresRetryPolicyUponInitialization(_logger).kwargs)
1819
async def connect_to_db(app: FastAPI, cfg: PostgresSettings) -> None:
19-
logger.debug("Connecting db ...")
20-
21-
engine: AsyncEngine = create_async_engine(
22-
cfg.dsn_with_async_sqlalchemy,
23-
pool_size=cfg.POSTGRES_MINSIZE,
24-
max_overflow=cfg.POSTGRES_MAXSIZE - cfg.POSTGRES_MINSIZE,
25-
connect_args={
26-
"server_settings": {"application_name": cfg.POSTGRES_CLIENT_NAME}
27-
},
28-
pool_pre_ping=True, # https://docs.sqlalchemy.org/en/14/core/pooling.html#dealing-with-disconnects
29-
future=True, # this uses sqlalchemy 2.0 API, shall be removed when sqlalchemy 2.0 is released
30-
)
31-
32-
logger.debug("Connected to %s", engine.url) # pylint: disable=no-member
33-
34-
logger.debug("Checking db migration...")
35-
try:
36-
await raise_if_migration_not_ready(engine)
37-
except Exception:
38-
# NOTE: engine must be closed because retry will create a new engine
39-
await engine.dispose()
40-
raise
41-
42-
logger.debug("Migration up-to-date")
20+
with log_context(
21+
_logger, logging.DEBUG, f"connection to db {cfg.dsn_with_async_sqlalchemy}"
22+
):
23+
engine: AsyncEngine = create_async_engine(
24+
cfg.dsn_with_async_sqlalchemy,
25+
pool_size=cfg.POSTGRES_MINSIZE,
26+
max_overflow=cfg.POSTGRES_MAXSIZE - cfg.POSTGRES_MINSIZE,
27+
connect_args={
28+
"server_settings": {"application_name": cfg.POSTGRES_CLIENT_NAME}
29+
},
30+
pool_pre_ping=True, # https://docs.sqlalchemy.org/en/14/core/pooling.html#dealing-with-disconnects
31+
future=True, # this uses sqlalchemy 2.0 API, shall be removed when sqlalchemy 2.0 is released
32+
)
33+
34+
with log_context(_logger, logging.DEBUG, "migration"):
35+
try:
36+
await raise_if_migration_not_ready(engine)
37+
except Exception:
38+
# NOTE: engine must be closed because retry will create a new engine
39+
await engine.dispose()
40+
raise
4341

4442
app.state.engine = engine
45-
46-
logger.debug(
43+
_logger.debug(
4744
"Setup engine: %s",
4845
await get_pg_engine_stateinfo(engine),
4946
)
5047

5148

5249
async def close_db_connection(app: FastAPI) -> None:
53-
logger.debug("Disconnecting db ...")
54-
55-
if engine := app.state.engine:
56-
await engine.dispose()
57-
58-
logger.debug("Disconnected from %s", engine.url) # pylint: disable=no-member
50+
with log_context(_logger, logging.DEBUG, f"db disconnect of {app.state.engine}"):
51+
if engine := app.state.engine:
52+
await engine.dispose()

services/resource-usage-tracker/openapi.json

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,7 @@
218218
"content": {
219219
"application/json": {
220220
"schema": {
221-
"title": "Response Create Credit Transaction V1 Credit Transactions Post",
222-
"type": "object",
223-
"additionalProperties": {
224-
"exclusiveMinimum": true,
225-
"type": "integer",
226-
"minimum": 0
227-
}
221+
"$ref": "#/components/schemas/CreditTransactionCreated"
228222
}
229223
}
230224
}
@@ -364,6 +358,22 @@
364358
}
365359
}
366360
},
361+
"CreditTransactionCreated": {
362+
"title": "CreditTransactionCreated",
363+
"required": [
364+
"credit_transaction_id"
365+
],
366+
"type": "object",
367+
"properties": {
368+
"credit_transaction_id": {
369+
"title": "Credit Transaction Id",
370+
"exclusiveMinimum": true,
371+
"type": "integer",
372+
"minimum": 0
373+
}
374+
},
375+
"description": "Response Create Credit Transaction V1 Credit Transactions Post"
376+
},
367377
"HTTPValidationError": {
368378
"title": "HTTPValidationError",
369379
"type": "object",

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/api/_resource_tracker.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import logging
2-
from typing import Annotated, Literal
2+
from typing import Annotated
33

44
from fastapi import APIRouter, Depends, status
55
from fastapi_pagination.api import create_page
66
from models_library.api_schemas_resource_usage_tracker.credit_transactions import (
7+
CreditTransactionCreated,
78
WalletTotalCredits,
89
)
910
from models_library.api_schemas_webserver.resource_usage import (
@@ -20,7 +21,7 @@
2021
resource_tracker_service_runs,
2122
)
2223

23-
logger = logging.getLogger(__name__)
24+
_logger = logging.getLogger(__name__)
2425

2526

2627
router = APIRouter()
@@ -74,7 +75,7 @@ async def get_credit_transactions_sum(
7475

7576
@router.post(
7677
"/credit-transactions",
77-
response_model=dict[Literal["credit_transaction_id"], CreditTransactionId],
78+
response_model=CreditTransactionCreated,
7879
summary="Top up credits for specific wallet",
7980
status_code=status.HTTP_201_CREATED,
8081
)
@@ -103,5 +104,4 @@ async def get_pricing_plans(
103104
Depends(resource_tracker_pricing_plans.list_pricing_plans),
104105
],
105106
):
106-
107107
return pricing_plans

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/resource_tracker_credit_transactions.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from datetime import datetime, timezone
2-
from decimal import Decimal
32
from typing import Annotated
43

54
from fastapi import Depends
65
from models_library.api_schemas_resource_usage_tracker.credit_transactions import (
6+
CreditTransactionCreateBody,
77
WalletTotalCredits,
88
)
99
from models_library.products import ProductName
@@ -13,9 +13,7 @@
1313
CreditTransactionId,
1414
CreditTransactionStatus,
1515
)
16-
from models_library.users import UserID
1716
from models_library.wallets import WalletID
18-
from pydantic import BaseModel
1917
from servicelib.rabbitmq import RabbitMQClient
2018

2119
from ..api.dependencies import get_repository
@@ -24,17 +22,6 @@
2422
from ..modules.rabbitmq import get_rabbitmq_client_from_request
2523

2624

27-
class CreditTransactionCreateBody(BaseModel):
28-
product_name: ProductName
29-
wallet_id: WalletID
30-
wallet_name: str
31-
user_id: UserID
32-
user_email: str
33-
osparc_credits: Decimal
34-
payment_transaction_id: str
35-
created_at: datetime
36-
37-
3825
async def _sum_credit_transactions_and_publish_to_rabbitmq(
3926
resource_tracker_repo: ResourceTrackerRepository,
4027
credit_transaction_create_body: CreditTransactionCreateBody,

0 commit comments

Comments
 (0)