Skip to content

Commit 3bc79db

Browse files
committed
publishing order messages
1 parent 4736eb9 commit 3bc79db

File tree

5 files changed

+60
-29
lines changed

5 files changed

+60
-29
lines changed

api/order_api.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import uuid
23

34
from fastapi import APIRouter, Depends
45

@@ -12,19 +13,36 @@
1213
order_apis = APIRouter(prefix="/order", tags=["order"])
1314

1415

16+
def serialize_for_json(obj):
17+
"""Recursively serialize objects for JSON"""
18+
if isinstance(obj, uuid.UUID):
19+
return str(obj)
20+
elif isinstance(obj, list):
21+
return [serialize_for_json(item) for item in obj]
22+
elif isinstance(obj, dict):
23+
return {key: serialize_for_json(value) for key, value in obj.items()}
24+
elif hasattr(obj, "isoformat"): # datetime objects
25+
return obj.isoformat()
26+
else:
27+
return obj
28+
29+
1530
@order_apis.post("/create-order", response_model=Order)
1631
async def create_order(order: Order, current_user: User = Depends(auth_required)):
1732
logger.info(f"Creating order for user {current_user.id}")
18-
# import pdb; pdb.set_trace()
19-
# order_service = OrderService()
20-
# order_service.create_order(order, current_user)
21-
import pdb
2233

23-
pdb.set_trace()
24-
return publisher.publish_message(
34+
order_service = OrderService()
35+
order_service.create_order(order, current_user)
36+
37+
order_dict = serialize_for_json(order.dict())
38+
order_dict["user_id"] = str(current_user.id)
39+
order_dict["order_date"] = order.order_date.isoformat()
40+
logger.info(f"Order dict: {order_dict}")
41+
42+
publisher.publish_message(
2543
queue_name="order_queue",
2644
routing_key="order_queue",
2745
event="order_created",
28-
order="Order placed",
46+
**order_dict,
2947
)
30-
# return order
48+
return order

api/validators/order_validation.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,4 @@ class Order(BaseModel):
99
items: List[UUID]
1010
total_price: float
1111
status: str
12-
created_at: datetime
13-
updated_at: datetime
14-
order_id: UUID = Field(default_factory=uuid4)
1512
order_date: datetime = Field(default_factory=datetime.utcnow)
16-
user_id: UUID

engine/publisher.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def publish_message(event: str, routing_key: str, queue_name: str, **kwargs):
1717
# Create message payload
1818
message = {"event": event, **kwargs}
1919
# Publish message
20+
2021
channel.basic_publish(
2122
exchange="",
2223
routing_key=routing_key,

models/entity/orders_entity.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
from datetime import datetime
22
from typing import Dict, List, Optional
33
from uuid import UUID, uuid4
4-
from sqlmodel import Field, SQLModel
4+
from sqlalchemy import ARRAY, JSON, Column
5+
from sqlmodel import Field, SQLModel, table
56

67

7-
class Order(SQLModel):
8+
class Order(SQLModel, table=True):
89
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
910
user_id: UUID = Field(foreign_key="user.id")
1011
total_price: float = Field(default=0.0)
1112
status: str = Field(default="pending")
1213
created_at: datetime = Field(default_factory=datetime.utcnow)
1314
updated_at: datetime = Field(default_factory=datetime.utcnow)
14-
items: List[UUID] = Field(default_factory=list)
15+
items: List[str] = Field(
16+
sa_column=Field(default_factory=list, sa_column_kwargs={"type_": ARRAY(str)})
17+
)
1518
order_id: UUID = Field(default_factory=uuid4)
1619
order_date: datetime = Field(default_factory=datetime.utcnow)
17-
18-
class Config:
19-
orm_mode = True

models/service/orders_service.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,42 @@
1-
from typing import List
1+
import json
2+
import logging
23
from uuid import UUID
34

45
from api.validators.order_validation import Order
56
from models.db import db_session
67
from models.entity.orders_entity import Order as OrderEntity
78

9+
logger = logging.getLogger(__name__)
10+
11+
12+
class UUIDEncoder(json.JSONEncoder):
13+
def default(self, obj):
14+
if isinstance(obj, UUID):
15+
return str(obj)
16+
return super().default(obj)
17+
818

919
class OrderService:
1020
def __init__(self):
1121
pass
1222

1323
def create_order(self, order: Order, current_user: str):
14-
order_entity = OrderEntity(
15-
order_id=order.order_id,
16-
order_date=order.order_date,
17-
user_id=current_user.id,
18-
items=order.items,
19-
total_price=order.total_price,
20-
status=order.status,
21-
)
22-
db_session.add(order_entity)
23-
db_session.commit()
24+
try:
25+
order_entity = OrderEntity(
26+
order_date=order.order_date,
27+
user_id=current_user.id,
28+
items=json.loads(json.dumps(order.items, cls=UUIDEncoder))
29+
if order.items
30+
else [],
31+
total_price=order.total_price,
32+
status=order.status,
33+
)
34+
db_session.add(order_entity)
35+
db_session.commit()
36+
except Exception as e:
37+
logger.error(f"Error creating order: {e}")
38+
db_session.rollback()
39+
raise e
2440

2541
def get_order_by_id(self, order_id: UUID) -> Order:
2642
order = (

0 commit comments

Comments
 (0)