add/remove to/from cart

This commit is contained in:
hlad 2022-08-01 14:01:44 +02:00
parent fe6246332f
commit d2a37d2f59
3 changed files with 110 additions and 2 deletions

View file

@ -1,15 +1,17 @@
from apiclient import APIClient, endpoint, JsonResponseHandler, HeaderAuthentication import uuid
from apiclient import APIClient, endpoint, JsonRequestFormatter, JsonResponseHandler, HeaderAuthentication
from apiclient_pydantic import serialize from apiclient_pydantic import serialize
from .models.order import Order, Orders from .models.order import Order, Orders
from .models.product import Product from .models.product import Product
from .models.recipe import Recipe from .models.recipe import Recipe
from .models.cart import Cart, AddItem, Add
from .endpoints import Endpoints from .endpoints import Endpoints
class Rohlik(APIClient): class Rohlik(APIClient):
def __init__(self, api_key: str): def __init__(self, api_key: str):
super().__init__(response_handler=JsonResponseHandler, authentication_method=HeaderAuthentication(token=api_key,parameter="x-api-authorization",scheme="token")) super().__init__(request_formatter=JsonRequestFormatter, response_handler=JsonResponseHandler, authentication_method=HeaderAuthentication(token=api_key,parameter="x-api-authorization",scheme="token"))
@serialize() @serialize()
def get_product(self, product_id: int) -> Product: def get_product(self, product_id: int) -> Product:
@ -32,3 +34,35 @@ class Rohlik(APIClient):
def get_recipe(self, recipe_id: int) -> Recipe: def get_recipe(self, recipe_id: int) -> Recipe:
recipe_response = self.get(Endpoints.recipe.format(recipe_id=recipe_id)) recipe_response = self.get(Endpoints.recipe.format(recipe_id=recipe_id))
return recipe_response['data'] return recipe_response['data']
@serialize()
def get_cart(self) -> Cart:
return self.get(Endpoints.cart)
@serialize()
def add_to_cart(self, product_id) -> Cart:
add = Add()
add_item=AddItem()
add_item.uuid=str(uuid.uuid4())
add_item.product_id = product_id
add_item.action_type = "modify"
add_item.amount = 1
add_item.source = "hp-v2"
add_item.sale_id = 0
add.items = []
add.items.append(add_item)
return self.patch(Endpoints.cart, add.dict(by_alias=True))
@serialize()
def remove_from_cart(self, product_id) -> Cart:
add = Add()
add_item=AddItem()
add_item.uuid=str(uuid.uuid4())
add_item.product_id = product_id
add_item.action_type = "modify"
add_item.amount = -1
add_item.source = "hp-v2"
add_item.sale_id = 0
add.items = []
add.items.append(add_item)
return self.patch(Endpoints.cart, add.dict(by_alias=True))

View file

@ -8,3 +8,4 @@ class Endpoints:
recipe: str = 'services/frontend-service/recipe/{recipe_id}' recipe: str = 'services/frontend-service/recipe/{recipe_id}'
prices: str = 'api/v1/products/{product_id}/prices' prices: str = 'api/v1/products/{product_id}/prices'
stock: str = 'api/v1/products/{product_id}/stock' stock: str = 'api/v1/products/{product_id}/stock'
cart: str = 'api/v2/cart'

73
pyrohlik/models/cart.py Normal file
View file

@ -0,0 +1,73 @@
from typing import Any, List, Optional
from pydantic import BaseModel, Field
class Store(BaseModel):
store_id: int = Field(..., alias='storeId')
zone_id: int = Field(..., alias='zoneId')
type: str
class FlatDetails(BaseModel):
entrance: Optional[str]
floor: Optional[str]
door: Optional[str]
block: Optional[str]
apartment: Optional[str]
staircase: Optional[str]
intercom: Optional[str]
additional_info: Optional[str] = Field(..., alias='additionalInfo')
class Address(BaseModel):
id: int
city: str
street: str
house_number: str = Field(..., alias='houseNumber')
orientation_number: str = Field(..., alias='orientationNumber')
latitude: float
longitude: float
postal_code: str = Field(..., alias='postalCode')
display: str
stores: List[Store]
flat_details: FlatDetails = Field(..., alias='flatDetails')
additional_address_details: List[str] = Field(..., alias='additionalAddressDetails')
class Destination(BaseModel):
id: int
name: str
type: str
access_type: str = Field(..., alias='accessType')
location_type: str = Field(..., alias='locationType')
delivery_point_provider: Optional[str] = Field(..., alias='deliveryPointProvider')
photos: Optional[str]
address: Address
class Item(BaseModel):
product_id: int = Field(..., alias='productId')
amount: int
sale_id: int = Field(..., alias='saleId')
result: str
class Cart(BaseModel):
status: str
cart_id: int = Field(..., alias='cartId')
store: Store
destination: Destination
items: List[Item]
class AddItem(BaseModel):
source: Optional[str]
product_id: Optional[int] = Field(alias='productId')
sale_id: Optional[int] = Field(alias='saleId')
action_type: Optional[str] = Field(alias='actionType')
amount: Optional[int]
uuid: Optional[str]
class Add(BaseModel):
items: Optional[List[AddItem]]