|
1 | 1 | import uuid |
2 | 2 | from typing import Any |
3 | 3 |
|
4 | | -from sqlmodel import Session, select |
| 4 | +from sqlmodel import Session, func, select |
5 | 5 |
|
6 | 6 | from app.core.security import get_password_hash, verify_password |
7 | | -from app.models import Item, ItemCreate, User, UserCreate, UserUpdate |
| 7 | +from app.models import ( |
| 8 | + Item, |
| 9 | + ItemCreate, |
| 10 | + Order, |
| 11 | + OrderCreate, |
| 12 | + Payment, |
| 13 | + PaymentCreate, |
| 14 | + User, |
| 15 | + UserCreate, |
| 16 | + UserUpdate, |
| 17 | +) |
8 | 18 |
|
9 | 19 |
|
10 | 20 | def create_user(*, session: Session, user_create: UserCreate) -> User: |
@@ -52,3 +62,149 @@ def create_item(*, session: Session, item_in: ItemCreate, owner_id: uuid.UUID) - |
52 | 62 | session.commit() |
53 | 63 | session.refresh(db_item) |
54 | 64 | return db_item |
| 65 | + |
| 66 | + |
| 67 | +# Payment CRUD functions |
| 68 | +def create_order( |
| 69 | + *, session: Session, order_in: OrderCreate, user_id: uuid.UUID, razorpay_order_id: str |
| 70 | +) -> Order: |
| 71 | + """ |
| 72 | + Create an order in the database. |
| 73 | +
|
| 74 | + Args: |
| 75 | + session: Database session |
| 76 | + order_in: Order creation data |
| 77 | + user_id: User ID who created the order |
| 78 | + razorpay_order_id: Razorpay order ID |
| 79 | +
|
| 80 | + Returns: |
| 81 | + Created Order object |
| 82 | + """ |
| 83 | + db_order = Order.model_validate( |
| 84 | + order_in, update={"user_id": user_id, "razorpay_order_id": razorpay_order_id, "status": "created"} |
| 85 | + ) |
| 86 | + session.add(db_order) |
| 87 | + session.commit() |
| 88 | + session.refresh(db_order) |
| 89 | + return db_order |
| 90 | + |
| 91 | + |
| 92 | +def get_order_by_id(*, session: Session, order_id: uuid.UUID) -> Order | None: |
| 93 | + """ |
| 94 | + Get order by UUID. |
| 95 | +
|
| 96 | + Args: |
| 97 | + session: Database session |
| 98 | + order_id: Order UUID |
| 99 | +
|
| 100 | + Returns: |
| 101 | + Order object or None if not found |
| 102 | + """ |
| 103 | + return session.get(Order, order_id) |
| 104 | + |
| 105 | + |
| 106 | +def get_order_by_razorpay_id( |
| 107 | + *, session: Session, razorpay_order_id: str |
| 108 | +) -> Order | None: |
| 109 | + """ |
| 110 | + Get order by Razorpay order ID. |
| 111 | +
|
| 112 | + Args: |
| 113 | + session: Database session |
| 114 | + razorpay_order_id: Razorpay order ID |
| 115 | +
|
| 116 | + Returns: |
| 117 | + Order object or None if not found |
| 118 | + """ |
| 119 | + statement = select(Order).where(Order.razorpay_order_id == razorpay_order_id) |
| 120 | + return session.exec(statement).first() |
| 121 | + |
| 122 | + |
| 123 | +def update_order_status( |
| 124 | + *, session: Session, order: Order, status: str |
| 125 | +) -> Order: |
| 126 | + """ |
| 127 | + Update order status. |
| 128 | +
|
| 129 | + Args: |
| 130 | + session: Database session |
| 131 | + order: Order object to update |
| 132 | + status: New status |
| 133 | +
|
| 134 | + Returns: |
| 135 | + Updated Order object |
| 136 | + """ |
| 137 | + from datetime import datetime |
| 138 | + order.status = status |
| 139 | + order.updated_at = datetime.utcnow() |
| 140 | + session.add(order) |
| 141 | + session.commit() |
| 142 | + session.refresh(order) |
| 143 | + return order |
| 144 | + |
| 145 | + |
| 146 | +def create_payment(*, session: Session, payment_in: PaymentCreate) -> Payment: |
| 147 | + """ |
| 148 | + Create a payment record in the database. |
| 149 | +
|
| 150 | + Args: |
| 151 | + session: Database session |
| 152 | + payment_in: Payment creation data |
| 153 | +
|
| 154 | + Returns: |
| 155 | + Created Payment object |
| 156 | + """ |
| 157 | + db_payment = Payment.model_validate(payment_in) |
| 158 | + session.add(db_payment) |
| 159 | + session.commit() |
| 160 | + session.refresh(db_payment) |
| 161 | + return db_payment |
| 162 | + |
| 163 | + |
| 164 | +def get_payments_by_order(*, session: Session, order_id: uuid.UUID) -> list[Payment]: |
| 165 | + """ |
| 166 | + Get all payments for an order. |
| 167 | +
|
| 168 | + Args: |
| 169 | + session: Database session |
| 170 | + order_id: Order UUID |
| 171 | +
|
| 172 | + Returns: |
| 173 | + List of Payment objects |
| 174 | + """ |
| 175 | + statement = select(Payment).where(Payment.order_id == order_id) |
| 176 | + return list(session.exec(statement).all()) |
| 177 | + |
| 178 | + |
| 179 | +def get_user_orders( |
| 180 | + *, session: Session, user_id: uuid.UUID, skip: int = 0, limit: int = 100 |
| 181 | +) -> tuple[list[Order], int]: |
| 182 | + """ |
| 183 | + Get paginated list of orders for a user. |
| 184 | +
|
| 185 | + Args: |
| 186 | + session: Database session |
| 187 | + user_id: User UUID |
| 188 | + skip: Number of records to skip |
| 189 | + limit: Maximum number of records to return |
| 190 | +
|
| 191 | + Returns: |
| 192 | + Tuple of (list of Order objects, total count) |
| 193 | + """ |
| 194 | + count_statement = ( |
| 195 | + select(func.count()) |
| 196 | + .select_from(Order) |
| 197 | + .where(Order.user_id == user_id) |
| 198 | + ) |
| 199 | + count = session.exec(count_statement).one() |
| 200 | + |
| 201 | + statement = ( |
| 202 | + select(Order) |
| 203 | + .where(Order.user_id == user_id) |
| 204 | + .order_by(Order.created_at.desc()) |
| 205 | + .offset(skip) |
| 206 | + .limit(limit) |
| 207 | + ) |
| 208 | + orders = list(session.exec(statement).all()) |
| 209 | + |
| 210 | + return orders, count |
0 commit comments