Skip to content

Commit e6b1c04

Browse files
pcrespovmrnicegyu11
authored andcommitted
♻️ web-server: Refactor products domain (ITISFoundation#7263)
1 parent 4f39eaf commit e6b1c04

File tree

159 files changed

+1833
-1312
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+1833
-1312
lines changed

api/specs/web-server/_products.py

+7-24
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,17 @@
77

88
from typing import Annotated
99

10-
from fastapi import APIRouter, Depends, status
10+
from fastapi import APIRouter, Depends
1111
from models_library.api_schemas_webserver.product import (
12-
GenerateInvitation,
13-
GetCreditPrice,
12+
CreditPriceGet,
13+
InvitationGenerate,
1414
InvitationGenerated,
1515
ProductGet,
1616
ProductUIGet,
17-
UpdateProductTemplate,
1817
)
1918
from models_library.generics import Envelope
2019
from simcore_service_webserver._meta import API_VTAG
21-
from simcore_service_webserver.products._handlers import (
22-
_ProductsRequestParams,
23-
_ProductTemplateParams,
24-
)
20+
from simcore_service_webserver.products._rest_schemas import ProductsRequestParams
2521

2622
router = APIRouter(
2723
prefix=f"/{API_VTAG}",
@@ -33,7 +29,7 @@
3329

3430
@router.get(
3531
"/credits-price",
36-
response_model=Envelope[GetCreditPrice],
32+
response_model=Envelope[CreditPriceGet],
3733
)
3834
async def get_current_product_price():
3935
...
@@ -47,7 +43,7 @@ async def get_current_product_price():
4743
"po",
4844
],
4945
)
50-
async def get_product(_params: Annotated[_ProductsRequestParams, Depends()]):
46+
async def get_product(_params: Annotated[ProductsRequestParams, Depends()]):
5147
...
5248

5349

@@ -59,25 +55,12 @@ async def get_current_product_ui():
5955
...
6056

6157

62-
@router.put(
63-
"/products/{product_name}/templates/{template_id}",
64-
status_code=status.HTTP_204_NO_CONTENT,
65-
tags=[
66-
"po",
67-
],
68-
)
69-
async def update_product_template(
70-
_params: Annotated[_ProductTemplateParams, Depends()], _body: UpdateProductTemplate
71-
):
72-
...
73-
74-
7558
@router.post(
7659
"/invitation:generate",
7760
response_model=Envelope[InvitationGenerated],
7861
tags=[
7962
"po",
8063
],
8164
)
82-
async def generate_invitation(_body: GenerateInvitation):
65+
async def generate_invitation(_body: InvitationGenerate):
8366
...

api/specs/web-server/_statics.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from fastapi import APIRouter
1010
from fastapi.responses import HTMLResponse
11-
from simcore_service_webserver._constants import INDEX_RESOURCE_NAME
11+
from simcore_service_webserver.constants import INDEX_RESOURCE_NAME
1212
from simcore_service_webserver.statics.settings import FrontEndInfoDict
1313

1414
router = APIRouter(

packages/models-library/src/models_library/api_schemas_webserver/product.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,20 @@
1919
from ._base import InputSchema, OutputSchema
2020

2121

22-
class GetCreditPrice(OutputSchema):
22+
class CreditPriceGet(OutputSchema):
2323
product_name: str
2424
usd_per_credit: Annotated[
25-
NonNegativeDecimal,
26-
PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"),
27-
] | None = Field(
28-
...,
29-
description="Price of a credit in USD. "
30-
"If None, then this product's price is UNDEFINED",
31-
)
25+
Annotated[
26+
NonNegativeDecimal,
27+
PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"),
28+
]
29+
| None,
30+
Field(
31+
description="Price of a credit in USD. "
32+
"If None, then this product's price is UNDEFINED",
33+
),
34+
]
35+
3236
min_payment_amount_usd: Annotated[
3337
NonNegativeInt | None,
3438
Field(
@@ -61,15 +65,11 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
6165
)
6266

6367

64-
class GetProductTemplate(OutputSchema):
68+
class ProductTemplateGet(OutputSchema):
6569
id_: Annotated[IDStr, Field(alias="id")]
6670
content: str
6771

6872

69-
class UpdateProductTemplate(InputSchema):
70-
content: str
71-
72-
7373
class ProductGet(OutputSchema):
7474
name: ProductName
7575
display_name: str
@@ -92,7 +92,7 @@ class ProductGet(OutputSchema):
9292
credits_per_usd: NonNegativeDecimal | None
9393

9494
templates: Annotated[
95-
list[GetProductTemplate],
95+
list[ProductTemplateGet],
9696
Field(
9797
description="List of templates available to this product for communications (e.g. emails, sms, etc)",
9898
default_factory=list,
@@ -111,7 +111,7 @@ class ProductUIGet(OutputSchema):
111111
ExtraCreditsUsdRangeInt: TypeAlias = Annotated[int, Field(ge=0, lt=500)]
112112

113113

114-
class GenerateInvitation(InputSchema):
114+
class InvitationGenerate(InputSchema):
115115
guest: LowerCaseEmailStr
116116
trial_account_days: PositiveInt | None = None
117117
extra_credits_in_usd: ExtraCreditsUsdRangeInt | None = None

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async def get_product_latest_stripe_info(
5959
)
6060
).fetchone()
6161
if row is None:
62-
msg = "No product Stripe info defined in database"
62+
msg = f"Required Stripe information missing from product {product_name=}"
6363
raise ValueError(msg)
6464
return (row.stripe_price_id, row.stripe_tax_rate_id)
6565

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_login.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from simcore_service_webserver.login._constants import MSG_LOGGED_IN
1212
from simcore_service_webserver.login._registration import create_invitation_token
1313
from simcore_service_webserver.login.storage import AsyncpgStorage, get_plugin_storage
14-
from simcore_service_webserver.products.api import list_products
14+
from simcore_service_webserver.products.products_service import list_products
1515
from simcore_service_webserver.security.api import clean_auth_policy_cache
1616
from yarl import URL
1717

services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
LicensedItemCheckoutRpcGet as _LicensedItemCheckoutRpcGet,
1515
)
1616
from models_library.api_schemas_webserver.product import (
17-
GetCreditPrice as _GetCreditPrice,
17+
CreditPriceGet as _GetCreditPrice,
1818
)
1919
from models_library.api_schemas_webserver.resource_usage import (
2020
PricingUnitGet as _PricingUnitGet,

services/api-server/tests/unit/test_credits.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from fastapi import status
44
from httpx import AsyncClient, BasicAuth
5-
from models_library.api_schemas_webserver.product import GetCreditPrice
5+
from models_library.api_schemas_webserver.product import CreditPriceGet
66
from pytest_simcore.helpers.httpx_calls_capture_models import CreateRespxMockCallback
77
from simcore_service_api_server._meta import API_VTAG
88

@@ -23,4 +23,4 @@ async def test_get_credits_price(
2323

2424
response = await client.get(f"{API_VTAG}/credits/price", auth=auth)
2525
assert response.status_code == status.HTTP_200_OK
26-
_ = GetCreditPrice.model_validate(response.json())
26+
_ = CreditPriceGet.model_validate(response.json())

services/web/server/src/simcore_service_webserver/activity/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from aiohttp import web
22
from settings_library.prometheus import PrometheusSettings
33

4-
from .._constants import APP_SETTINGS_KEY
4+
from ..constants import APP_SETTINGS_KEY
55

66

77
def get_plugin_settings(app: web.Application) -> PrometheusSettings:

services/web/server/src/simcore_service_webserver/announcements/_handlers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from aiohttp import web
44

55
from .._meta import api_version_prefix
6-
from ..products.api import get_product_name
6+
from ..products import products_web
77
from ..utils_aiohttp import envelope_json_response
88
from . import _api
99
from ._models import Announcement
@@ -14,7 +14,7 @@
1414
@routes.get(f"/{api_version_prefix}/announcements", name="list_announcements")
1515
async def list_announcements(request: web.Request) -> web.Response:
1616
"""Returns non-expired announcements for current product"""
17-
product_name = get_product_name(request)
17+
product_name = products_web.get_product_name(request)
1818
announcements: list[Announcement] = await _api.list_announcements(
1919
request.app, product_name=product_name
2020
)

services/web/server/src/simcore_service_webserver/announcements/plugin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from aiohttp import web
88
from servicelib.aiohttp.application_setup import ModuleCategory, app_module_setup
99

10-
from .._constants import APP_SETTINGS_KEY
10+
from ..constants import APP_SETTINGS_KEY
1111
from ..products.plugin import setup_products
1212
from ..redis import setup_redis
1313
from . import _handlers

0 commit comments

Comments
 (0)