Skip to content

Commit 7b479c5

Browse files
committed
Add discontinue product workflow
1 parent 1043442 commit 7b479c5

File tree

8 files changed

+90
-0
lines changed

8 files changed

+90
-0
lines changed

api/src/api/dependency_container.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from azure.cosmos import CosmosClient, PartitionKey
22

33
from api.application_settings import ApplicationSettings
4+
from api.workflows.products.discontinue_product.discontinue_product_workflow import (
5+
DiscontinueProductWorkflow,
6+
)
47
from api.workflows.products.publish_product.publish_product_workflow import (
58
PublishProductWorkflow,
69
)
@@ -46,3 +49,9 @@ def get_publish_product_workflow(cls) -> PublishProductWorkflow:
4649
return PublishProductWorkflow(
4750
application_settings=cls.get_application_settings()
4851
)
52+
53+
@classmethod
54+
def get_discontinue_product_workflow(cls) -> DiscontinueProductWorkflow:
55+
return DiscontinueProductWorkflow(
56+
application_settings=cls.get_application_settings()
57+
)

api/src/api/workflows/products/discontinue_product/__init__.py

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from pydantic import BaseModel
2+
3+
4+
class DiscontinueProductRequest(BaseModel):
5+
id: str
6+
discontinuation_reason: str | None = None
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from azure.cosmos.aio import CosmosClient
2+
3+
from api.application_settings import ApplicationSettings
4+
from api.workflows.products.discontinue_product.discontinue_product_request import (
5+
DiscontinueProductRequest,
6+
)
7+
from domain.entities.product import Product
8+
9+
10+
class DiscontinueProductWorkflow:
11+
def __init__(self, application_settings: ApplicationSettings) -> None:
12+
self.application_settings = application_settings
13+
14+
async def execute(self, request: DiscontinueProductRequest) -> None:
15+
async with CosmosClient(
16+
self.application_settings.cosmos_db_no_sql_url,
17+
self.application_settings.cosmos_db_no_sql_key.get_secret_value(),
18+
) as cosmosdb_client:
19+
cosmosdb_database = cosmosdb_client.get_database_client(
20+
self.application_settings.cosmos_db_no_sql_database
21+
)
22+
product_container = cosmosdb_database.get_container_client(Product.__name__)
23+
product = await product_container.read_item(
24+
item=request.id, partition_key=request.id
25+
)
26+
product = Product.model_validate(product)
27+
product.discontinue(request.discontinuation_reason)
28+
await product_container.replace_item(product.id, product.model_dump())

api/src/api/workflows/products/product_router.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from fastapi import APIRouter
22

33
from api.dependency_container import DependencyContainer
4+
from api.workflows.products.discontinue_product.discontinue_product_request import (
5+
DiscontinueProductRequest,
6+
)
47
from api.workflows.products.publish_product.publish_product_request import (
58
PublishProductRequest,
69
)
@@ -17,3 +20,8 @@
1720
@router.post("")
1821
async def publish_product(request: PublishProductRequest) -> PublishProductResponse:
1922
return await DependencyContainer.get_publish_product_workflow().execute(request)
23+
24+
25+
@router.post("/discontinue")
26+
async def discontinue_product(request: DiscontinueProductRequest) -> None:
27+
return await DependencyContainer.get_discontinue_product_workflow().execute(request)

api/tests/integration/conftest.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1+
from collections.abc import AsyncGenerator
2+
13
import pytest
4+
from azure.cosmos.aio import CosmosClient, DatabaseProxy
25

36
from api.dependency_container import DependencyContainer
47

58

69
@pytest.fixture(autouse=True)
710
def initialize_dependency_container() -> None:
811
DependencyContainer.initialize()
12+
13+
14+
@pytest.fixture
15+
async def cosmosdb_database() -> AsyncGenerator[DatabaseProxy, None]:
16+
application_settings = DependencyContainer.get_application_settings()
17+
18+
async with CosmosClient(
19+
application_settings.cosmos_db_no_sql_url,
20+
application_settings.cosmos_db_no_sql_key.get_secret_value(),
21+
) as cosmosdb_client:
22+
cosmosdb_database = cosmosdb_client.get_database_client(
23+
application_settings.cosmos_db_no_sql_database
24+
)
25+
yield cosmosdb_database

api/tests/integration/workflows/products/discontinue_product/__init__.py

Whitespace-only changes.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import pytest
2+
from azure.cosmos.aio import DatabaseProxy
3+
4+
from api.dependency_container import DependencyContainer
5+
from api.workflows.products.discontinue_product.discontinue_product_request import (
6+
DiscontinueProductRequest,
7+
)
8+
from domain.entities.product import Product
9+
from test_utils.builders.domain.entities.product_builder import ProductBuilder
10+
11+
12+
@pytest.mark.integration
13+
class TestDiscontinueProductWorkflow:
14+
async def test_discontinue_product(self, cosmosdb_database: DatabaseProxy) -> None:
15+
product = ProductBuilder().build()
16+
await cosmosdb_database.get_container_client(Product.__name__).create_item(
17+
product.model_dump()
18+
)
19+
request = DiscontinueProductRequest(id=product.id)
20+
workflow = DependencyContainer.get_discontinue_product_workflow()
21+
22+
await workflow.execute(request)

0 commit comments

Comments
 (0)