From 9587691759578ccbfc76665e0c187c45f88b8bf7 Mon Sep 17 00:00:00 2001
From: duyanhehe <duyanhex@gmail.com>
Date: Fri, 7 Mar 2025 22:56:59 +0700
Subject: [PATCH] finished database models

---
 app/backend/models/models.py  | 79 +++++++++++++++++++++++++++++++++++
 app/backend/models/product.py | 11 -----
 app/backend/models/user.py    | 11 -----
 app/backend/routes/auth.py    |  2 +-
 4 files changed, 80 insertions(+), 23 deletions(-)
 create mode 100644 app/backend/models/models.py
 delete mode 100644 app/backend/models/product.py
 delete mode 100644 app/backend/models/user.py

diff --git a/app/backend/models/models.py b/app/backend/models/models.py
new file mode 100644
index 0000000..8397f9f
--- /dev/null
+++ b/app/backend/models/models.py
@@ -0,0 +1,79 @@
+from sqlmodel import SQLModel, Field, Relationship
+from typing import Optional, List
+from datetime import datetime
+
+
+class User(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    username: str
+    email: str = Field(unique=True, index=True)
+    password: str
+    role: str = Field(default="customer")  # Roles: customer, shop_owner, admin
+    created_at: datetime = Field(default_factory=datetime.utcnow)
+
+    shops: List["Shop"] = Relationship(back_populates="owner")
+    orders: List["Order"] = Relationship(back_populates="user")
+
+
+class Shop(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    owner_id: int = Field(foreign_key="user.id")
+    name: str = Field(unique=True, index=True)
+    description: Optional[str] = None
+    image_url: Optional[str] = None  # Image URL for shop
+    created_at: datetime = Field(default_factory=datetime.utcnow)
+
+    owner: User = Relationship(back_populates="shops")
+    products: List["Product"] = Relationship(back_populates="shop")
+
+
+class Category(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    name: str = Field(unique=True, index=True)
+
+    products: List["Product"] = Relationship(back_populates="category")
+
+
+class Product(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    shop_id: int = Field(foreign_key="shop.id")
+    category_id: int = Field(foreign_key="category.id", nullable=True)
+    name: str
+    description: Optional[str] = None
+    price: float
+    stock: int
+    created_at: datetime = Field(default_factory=datetime.utcnow)
+
+    shop: "Shop" = Relationship(back_populates="products")
+    category: Optional["Category"] = Relationship(back_populates="products")
+    images: List["ProductImage"] = Relationship(back_populates="product")
+
+
+class ProductImage(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    product_id: int = Field(foreign_key="product.id")
+    image_url: str = Field(nullable=False)  # Store each image URL separately
+
+    product: Product = Relationship(back_populates="images")
+
+
+class Order(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    user_id: int = Field(foreign_key="user.id")
+    shop_id: int = Field(foreign_key="shop.id")
+    total_price: float
+    status: str = Field(default="pending")
+    created_at: datetime = Field(default_factory=datetime.utcnow)
+
+    user: User = Relationship(back_populates="orders")
+    order_items: List["OrderItem"] = Relationship(back_populates="order")
+
+
+class OrderItem(SQLModel, table=True):
+    id: Optional[int] = Field(default=None, primary_key=True)
+    order_id: int = Field(foreign_key="order.id")
+    product_id: int = Field(foreign_key="product.id")
+    quantity: int
+    price: float
+
+    order: Order = Relationship(back_populates="order_items")
diff --git a/app/backend/models/product.py b/app/backend/models/product.py
deleted file mode 100644
index 96a79bd..0000000
--- a/app/backend/models/product.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from sqlmodel import SQLModel, Field
-from typing import Optional
-
-
-class Product(SQLModel, table=True):
-    id: Optional[int] = Field(default=None, primary_key=True)
-    name: str
-    description: str
-    price: float
-    stock: int
-    image_url: Optional[str] = None
diff --git a/app/backend/models/user.py b/app/backend/models/user.py
deleted file mode 100644
index 34945af..0000000
--- a/app/backend/models/user.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from sqlmodel import SQLModel, Field
-from typing import Optional
-
-
-class User(SQLModel, table=True):
-    id: Optional[int] = Field(default=None, primary_key=True)
-    username: str
-    email: str = Field(unique=True, index=True)
-    phone_number: str
-    password: str
-    role: str  # "buyer" or "shop_owner"
diff --git a/app/backend/routes/auth.py b/app/backend/routes/auth.py
index 2d835ce..c073e7c 100644
--- a/app/backend/routes/auth.py
+++ b/app/backend/routes/auth.py
@@ -1,5 +1,5 @@
 from fastapi import APIRouter, Depends, HTTPException
-from backend.models.user import User
+from backend.models.models import User
 from backend.schemas.user import UserCreate, UserLogin
 from backend.database import get_session
 from sqlmodel import Session, select
-- 
GitLab