Skip to content

Commit 4736eb9

Browse files
committed
orders component introduced and fixing apis
1 parent 87db17e commit 4736eb9

File tree

10 files changed

+139
-37
lines changed

10 files changed

+139
-37
lines changed

api/helpers/inventory_helper.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from helpers.db_helpers import DBHelper
66
from models.db import db_session
77
from models.entity.inventory_entity import Inventory, InventoryCategory
8+
from models.entity.store_entity import Store
89
from models.entity.user_entity import User
910

1011
logger = logging.getLogger()
@@ -23,6 +24,9 @@ def to_dict(self):
2324
class InventoryHelper(object):
2425
def __init__(self, user: User) -> None:
2526
self.user = user
27+
self.store = (
28+
db_session.query(Store).filter(Store.user_id == self.user.id).first()
29+
)
2630

2731
def add_inventory(
2832
self, name: str, quantity: int, category: Enum, notes: str = None
@@ -43,6 +47,7 @@ def add_inventory(
4347
category=InventoryCategory(category).name,
4448
user_id=self.user.id,
4549
notes=notes,
50+
store_id=self.store.id,
4651
)
4752
db_session.add(inventory_obj)
4853
db_session.commit()

api/inventory_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from helpers.jwt import auth_required
1313
from models.entity.user_entity import User
1414

15-
logger = logging.getLogger("groceror")
15+
logger = logging.getLogger(__name__)
1616
inventory_apis = APIRouter(prefix="/inventory", tags=["inventory"])
1717

1818

api/order_api.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import logging
2+
3+
from fastapi import APIRouter, Depends
4+
5+
from helpers.jwt import auth_required
6+
from api.validators.order_validation import Order
7+
from engine import publisher
8+
from models.entity.user_entity import User
9+
from models.service.orders_service import OrderService
10+
11+
logger = logging.getLogger(__name__)
12+
order_apis = APIRouter(prefix="/order", tags=["order"])
13+
14+
15+
@order_apis.post("/create-order", response_model=Order)
16+
async def create_order(order: Order, current_user: User = Depends(auth_required)):
17+
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
22+
23+
pdb.set_trace()
24+
return publisher.publish_message(
25+
queue_name="order_queue",
26+
routing_key="order_queue",
27+
event="order_created",
28+
order="Order placed",
29+
)
30+
# return order

api/user_api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ async def register(registration_payload: RegistrationPayload):
6161
)
6262
else:
6363
publisher.publish_message(
64-
event="user_registered", routing_key="email_queue", new_user=new_user
64+
queue_name="email_queue",
65+
routing_key="email_queue",
66+
event="user_registered",
67+
**new_user.dict(),
6568
)
6669
return {"id": new_user.id}
6770

api/validators/order_validation.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from datetime import datetime
2+
from pydantic import BaseModel, Field
3+
4+
from typing import List
5+
from uuid import UUID, uuid4
6+
7+
8+
class Order(BaseModel):
9+
items: List[UUID]
10+
total_price: float
11+
status: str
12+
created_at: datetime
13+
updated_at: datetime
14+
order_id: UUID = Field(default_factory=uuid4)
15+
order_date: datetime = Field(default_factory=datetime.utcnow)
16+
user_id: UUID

engine/publisher.py

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,33 @@
22
import logging
33
import pika
44

5-
from models.entity.user_entity import User
6-
75
logger = logging.getLogger(__name__)
86

9-
def publish_message(event: str, routing_key: str, new_user: User):
7+
8+
def publish_message(event: str, routing_key: str, queue_name: str, **kwargs):
109
# Publish registration event to email service
11-
try:
12-
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
13-
channel = connection.channel()
14-
15-
# Ensure exchange exists
16-
channel.queue_declare(queue='email_queue', durable=True)
17-
18-
# Create message payload
19-
message = {
20-
"event": event,
21-
"user_id": str(new_user.id),
22-
"email": new_user.email,
23-
"name": new_user.name
24-
}
25-
26-
# Publish message
27-
channel.basic_publish(
28-
exchange='',
29-
routing_key=routing_key,
30-
body=json.dumps(message),
31-
properties=pika.BasicProperties(
32-
delivery_mode=2, # make message persistent
33-
content_type='application/json'
34-
)
35-
)
36-
37-
connection.close()
38-
39-
except Exception as e:
40-
logger.error(f"Failed to publish registration event: {str(e)}")
41-
# Don't raise exception - registration succeeded even if notification fails
10+
try:
11+
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
12+
channel = connection.channel()
13+
14+
# Ensure exchange exists
15+
channel.queue_declare(queue=queue_name, durable=True)
16+
17+
# Create message payload
18+
message = {"event": event, **kwargs}
19+
# Publish message
20+
channel.basic_publish(
21+
exchange="",
22+
routing_key=routing_key,
23+
body=json.dumps(message),
24+
properties=pika.BasicProperties(
25+
delivery_mode=2, # make message persistent
26+
content_type="application/json",
27+
),
28+
)
29+
30+
connection.close()
31+
32+
except Exception as e:
33+
logger.error(f"Failed to publish registration event: {str(e)}")
34+
# Don't raise exception - registration succeeded even if notification fails

main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from api.cart_api import cart_apis
1313
from api.google_login import google_login_apis
1414
from api.inventory_api import inventory_apis
15+
from api.order_api import order_apis
1516
from api.store_api import store_apis
1617
from api.user_api import user_apis
1718
from models.db import create_db_and_tables
@@ -53,6 +54,7 @@ async def welcome():
5354
app.include_router(inventory_apis)
5455
app.include_router(store_apis)
5556
app.include_router(cart_apis)
57+
app.include_router(order_apis)
5658

5759
create_db_and_tables()
5860

models/entity/orders_entity.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from datetime import datetime
2+
from typing import Dict, List, Optional
3+
from uuid import UUID, uuid4
4+
from sqlmodel import Field, SQLModel
5+
6+
7+
class Order(SQLModel):
8+
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
9+
user_id: UUID = Field(foreign_key="user.id")
10+
total_price: float = Field(default=0.0)
11+
status: str = Field(default="pending")
12+
created_at: datetime = Field(default_factory=datetime.utcnow)
13+
updated_at: datetime = Field(default_factory=datetime.utcnow)
14+
items: List[UUID] = Field(default_factory=list)
15+
order_id: UUID = Field(default_factory=uuid4)
16+
order_date: datetime = Field(default_factory=datetime.utcnow)
17+
18+
class Config:
19+
orm_mode = True

models/service/orders_service.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from typing import List
2+
from uuid import UUID
3+
4+
from api.validators.order_validation import Order
5+
from models.db import db_session
6+
from models.entity.orders_entity import Order as OrderEntity
7+
8+
9+
class OrderService:
10+
def __init__(self):
11+
pass
12+
13+
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+
25+
def get_order_by_id(self, order_id: UUID) -> Order:
26+
order = (
27+
db_session.query(OrderEntity)
28+
.filter(OrderEntity.order_id == order_id)
29+
.first()
30+
)
31+
return order

models/service/store_service.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ def create_store(
3737
phone: str,
3838
email: str,
3939
website: str = None,
40+
latitude: float = None,
41+
longitude: float = None,
4042
) -> Store:
4143
try:
42-
latitude, longitude = get_coordinates(address)
44+
if latitude is None or longitude is None:
45+
latitude, longitude = get_coordinates(address)
4346
store = Store(
4447
name=name,
4548
user_id=user_id,

0 commit comments

Comments
 (0)