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