Skip to content

♻️ web-server: Refactor products domain #7263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 46 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
230d045
renames products modules to CSR layers
pcrespov Feb 21, 2025
95ae2cf
external service layer
pcrespov Feb 21, 2025
a23220d
models
pcrespov Feb 21, 2025
b7f5b1e
rename service
pcrespov Feb 21, 2025
b5eed4b
web helpers
pcrespov Feb 21, 2025
4b21cf3
decouples
pcrespov Feb 21, 2025
095a5bb
get_product_template_path
pcrespov Feb 21, 2025
18ed6c4
get_product_name
pcrespov Feb 21, 2025
a3feef6
web
pcrespov Feb 21, 2025
4ec9377
tests
pcrespov Feb 21, 2025
d28e2ec
setup
pcrespov Feb 21, 2025
0aa3dea
fixes mocks
pcrespov Feb 21, 2025
28b327d
cleanup
pcrespov Feb 24, 2025
1d9b789
helpers
pcrespov Feb 24, 2025
a476907
constants
pcrespov Feb 24, 2025
08259d0
updates logs
pcrespov Feb 24, 2025
51e2596
rename models
pcrespov Feb 24, 2025
5095594
pydantic modeling
pcrespov Feb 24, 2025
97a9ed4
annotations
pcrespov Feb 24, 2025
587a0f7
improving tests
pcrespov Feb 24, 2025
62ba967
full coverage models
pcrespov Feb 25, 2025
c5bfe4a
moving isolated tests
pcrespov Feb 25, 2025
dfa5349
improving tests
pcrespov Feb 25, 2025
0c38277
cleanup
pcrespov Feb 25, 2025
8aa93e9
draft tests
pcrespov Feb 25, 2025
ec59049
enh tools
pcrespov Feb 25, 2025
65bd2fb
enh tools
pcrespov Feb 25, 2025
b1b3e0a
tests repos
pcrespov Feb 25, 2025
e536aa3
fixing test
pcrespov Feb 25, 2025
4faeddb
tseting rest
pcrespov Feb 25, 2025
fe9f5ff
adds rest
pcrespov Feb 25, 2025
4895dde
adds rest
pcrespov Feb 25, 2025
93c196a
draft tests
pcrespov Feb 25, 2025
3b2d9fb
fixing test
pcrespov Feb 25, 2025
a173d26
drops unused entrypoint
pcrespov Feb 25, 2025
7980d57
fix rebase
pcrespov Feb 26, 2025
f072c21
fix tests
pcrespov Feb 26, 2025
e2982c5
fix tests
pcrespov Feb 26, 2025
cf4d2e5
fix tests
pcrespov Feb 26, 2025
2a0ca68
fix tests
pcrespov Feb 26, 2025
556427e
Merge branch 'master' into mai/refactor-products
pcrespov Feb 26, 2025
c76ce60
fix oas
pcrespov Feb 26, 2025
85f09d0
@sanderegg review: relative imports
pcrespov Feb 26, 2025
041f78e
@sanderegg review: doc
pcrespov Feb 26, 2025
694524e
Merge branch 'master' into mai/refactor-products
pcrespov Feb 26, 2025
40f7dbe
item missing
pcrespov Feb 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 7 additions & 24 deletions api/specs/web-server/_products.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,17 @@

from typing import Annotated

from fastapi import APIRouter, Depends, status
from fastapi import APIRouter, Depends
from models_library.api_schemas_webserver.product import (
GenerateInvitation,
GetCreditPrice,
CreditPriceGet,
InvitationGenerate,
InvitationGenerated,
ProductGet,
ProductUIGet,
UpdateProductTemplate,
)
from models_library.generics import Envelope
from simcore_service_webserver._meta import API_VTAG
from simcore_service_webserver.products._handlers import (
_ProductsRequestParams,
_ProductTemplateParams,
)
from simcore_service_webserver.products._rest_schemas import ProductsRequestParams

router = APIRouter(
prefix=f"/{API_VTAG}",
Expand All @@ -33,7 +29,7 @@

@router.get(
"/credits-price",
response_model=Envelope[GetCreditPrice],
response_model=Envelope[CreditPriceGet],
)
async def get_current_product_price():
...
Expand All @@ -47,7 +43,7 @@ async def get_current_product_price():
"po",
],
)
async def get_product(_params: Annotated[_ProductsRequestParams, Depends()]):
async def get_product(_params: Annotated[ProductsRequestParams, Depends()]):
...


Expand All @@ -59,25 +55,12 @@ async def get_current_product_ui():
...


@router.put(
"/products/{product_name}/templates/{template_id}",
status_code=status.HTTP_204_NO_CONTENT,
tags=[
"po",
],
)
async def update_product_template(
_params: Annotated[_ProductTemplateParams, Depends()], _body: UpdateProductTemplate
):
...


@router.post(
"/invitation:generate",
response_model=Envelope[InvitationGenerated],
tags=[
"po",
],
)
async def generate_invitation(_body: GenerateInvitation):
async def generate_invitation(_body: InvitationGenerate):
...
2 changes: 1 addition & 1 deletion api/specs/web-server/_statics.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from fastapi import APIRouter
from fastapi.responses import HTMLResponse
from simcore_service_webserver._constants import INDEX_RESOURCE_NAME
from simcore_service_webserver.constants import INDEX_RESOURCE_NAME
from simcore_service_webserver.statics.settings import FrontEndInfoDict

router = APIRouter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,20 @@
from ._base import InputSchema, OutputSchema


class GetCreditPrice(OutputSchema):
class CreditPriceGet(OutputSchema):
product_name: str
usd_per_credit: Annotated[
NonNegativeDecimal,
PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"),
] | None = Field(
...,
description="Price of a credit in USD. "
"If None, then this product's price is UNDEFINED",
)
Annotated[
NonNegativeDecimal,
PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"),
]
| None,
Field(
description="Price of a credit in USD. "
"If None, then this product's price is UNDEFINED",
),
]

min_payment_amount_usd: Annotated[
NonNegativeInt | None,
Field(
Expand Down Expand Up @@ -61,15 +65,11 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
)


class GetProductTemplate(OutputSchema):
class ProductTemplateGet(OutputSchema):
id_: Annotated[IDStr, Field(alias="id")]
content: str


class UpdateProductTemplate(InputSchema):
content: str


class ProductGet(OutputSchema):
name: ProductName
display_name: str
Expand All @@ -92,7 +92,7 @@ class ProductGet(OutputSchema):
credits_per_usd: NonNegativeDecimal | None

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


class GenerateInvitation(InputSchema):
class InvitationGenerate(InputSchema):
guest: LowerCaseEmailStr
trial_account_days: PositiveInt | None = None
extra_credits_in_usd: ExtraCreditsUsdRangeInt | None = None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ async def get_product_latest_stripe_info(
)
).fetchone()
if row is None:
msg = "No product Stripe info defined in database"
msg = f"Required Stripe information missing from product {product_name=}"
raise ValueError(msg)
return (row.stripe_price_id, row.stripe_tax_rate_id)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from simcore_service_webserver.login._constants import MSG_LOGGED_IN
from simcore_service_webserver.login._registration import create_invitation_token
from simcore_service_webserver.login.storage import AsyncpgStorage, get_plugin_storage
from simcore_service_webserver.products.api import list_products
from simcore_service_webserver.products.products_service import list_products
from simcore_service_webserver.security.api import clean_auth_policy_cache
from yarl import URL

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
LicensedItemCheckoutRpcGet as _LicensedItemCheckoutRpcGet,
)
from models_library.api_schemas_webserver.product import (
GetCreditPrice as _GetCreditPrice,
CreditPriceGet as _GetCreditPrice,
)
from models_library.api_schemas_webserver.resource_usage import (
PricingUnitGet as _PricingUnitGet,
Expand Down
4 changes: 2 additions & 2 deletions services/api-server/tests/unit/test_credits.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from fastapi import status
from httpx import AsyncClient, BasicAuth
from models_library.api_schemas_webserver.product import GetCreditPrice
from models_library.api_schemas_webserver.product import CreditPriceGet
from pytest_simcore.helpers.httpx_calls_capture_models import CreateRespxMockCallback
from simcore_service_api_server._meta import API_VTAG

Expand All @@ -23,4 +23,4 @@ async def test_get_credits_price(

response = await client.get(f"{API_VTAG}/credits/price", auth=auth)
assert response.status_code == status.HTTP_200_OK
_ = GetCreditPrice.model_validate(response.json())
_ = CreditPriceGet.model_validate(response.json())
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from aiohttp import web
from settings_library.prometheus import PrometheusSettings

from .._constants import APP_SETTINGS_KEY
from ..constants import APP_SETTINGS_KEY


def get_plugin_settings(app: web.Application) -> PrometheusSettings:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from aiohttp import web

from .._meta import api_version_prefix
from ..products.api import get_product_name
from ..products import products_web
from ..utils_aiohttp import envelope_json_response
from . import _api
from ._models import Announcement
Expand All @@ -14,7 +14,7 @@
@routes.get(f"/{api_version_prefix}/announcements", name="list_announcements")
async def list_announcements(request: web.Request) -> web.Response:
"""Returns non-expired announcements for current product"""
product_name = get_product_name(request)
product_name = products_web.get_product_name(request)
announcements: list[Announcement] = await _api.list_announcements(
request.app, product_name=product_name
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from aiohttp import web
from servicelib.aiohttp.application_setup import ModuleCategory, app_module_setup

from .._constants import APP_SETTINGS_KEY
from ..constants import APP_SETTINGS_KEY
from ..products.plugin import setup_products
from ..redis import setup_redis
from . import _handlers
Expand Down
Loading
Loading