File tree Expand file tree Collapse file tree 8 files changed +90
-0
lines changed
workflows/products/discontinue_product Expand file tree Collapse file tree 8 files changed +90
-0
lines changed Original file line number Diff line number Diff line change 11from azure .cosmos import CosmosClient , PartitionKey
22
33from api .application_settings import ApplicationSettings
4+ from api .workflows .products .discontinue_product .discontinue_product_workflow import (
5+ DiscontinueProductWorkflow ,
6+ )
47from 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+ )
Original file line number Diff line number Diff line change 1+ from pydantic import BaseModel
2+
3+
4+ class DiscontinueProductRequest (BaseModel ):
5+ id : str
6+ discontinuation_reason : str | None = None
Original file line number Diff line number Diff line change 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 ())
Original file line number Diff line number Diff line change 11from fastapi import APIRouter
22
33from api .dependency_container import DependencyContainer
4+ from api .workflows .products .discontinue_product .discontinue_product_request import (
5+ DiscontinueProductRequest ,
6+ )
47from api .workflows .products .publish_product .publish_product_request import (
58 PublishProductRequest ,
69)
1720@router .post ("" )
1821async 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 )
Original file line number Diff line number Diff line change 1+ from collections .abc import AsyncGenerator
2+
13import pytest
4+ from azure .cosmos .aio import CosmosClient , DatabaseProxy
25
36from api .dependency_container import DependencyContainer
47
58
69@pytest .fixture (autouse = True )
710def 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
Original file line number Diff line number Diff line change 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 )
You can’t perform that action at this time.
0 commit comments