5.1 KiB
5.1 KiB
Models Restructure Plan
New Structure
models/
├── database/
│ ├── __init__.py # Import all models for easy access
│ ├── base.py # Base model class and mixins
│ ├── user.py # User model
│ ├── shop.py # Shop, ShopProduct models
│ ├── product.py # Product model
│ ├── stock.py # Stock model
│ └── marketplace.py # MarketplaceImportJob model
└── api/
├── __init__.py # Common imports
├── base.py # Base response models
├── auth.py # User auth models (register, login, response)
├── shop.py # Shop management models
├── product.py # Product CRUD models
├── stock.py # Stock operation models
├── marketplace.py # Marketplace import models
└── stats.py # Statistics response models
File Contents Breakdown
Database Models
models/database/base.py:
from datetime import datetime
from sqlalchemy import Column, DateTime
from app.core.database import Base
class TimestampMixin:
"""Mixin to add created_at and updated_at timestamps to models"""
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(
DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False
)
models/database/user.py:
Usermodel (lines 12-37 from your current file)
models/database/shop.py:
Shopmodel (lines 40-75)ShopProductmodel (lines 155-199)
models/database/product.py:
Productmodel (lines 78-152)
models/database/stock.py:
Stockmodel (lines 202-232)
models/database/marketplace.py:
MarketplaceImportJobmodel (lines 235-284)
API Models
models/api/base.py:
from typing import List, TypeVar, Generic
from pydantic import BaseModel
T = TypeVar('T')
class ListResponse(BaseModel, Generic[T]):
"""Generic list response model"""
items: List[T]
total: int
skip: int
limit: int
class StatusResponse(BaseModel):
"""Generic status response"""
success: bool
message: str
models/api/auth.py:
UserRegister(lines 12-34)UserLogin(lines 37-46)UserResponse(lines 49-61)LoginResponse(lines 64-69)
models/api/shop.py:
ShopCreate(lines 72-103)ShopUpdate(lines 106-122)ShopResponse(lines 125-145)ShopListResponse(lines 148-153)ShopProductCreate(lines 247-270)ShopProductResponse(lines 273-293)
models/api/product.py:
ProductBase(lines 156-193)ProductCreate(lines 196-206)ProductUpdate(lines 209-211)ProductResponse(lines 214-221)ProductListResponse(lines 408-413)ProductDetailResponse(lines 416-420)
models/api/stock.py:
StockBase(lines 296-300)StockCreate(lines 303-305)StockAdd(lines 308-310)StockUpdate(lines 313-315)StockResponse(lines 318-327)StockLocationResponse(lines 330-333)StockSummaryResponse(lines 336-342)
models/api/marketplace.py:
MarketplaceImportRequest(lines 345-381)MarketplaceImportJobResponse(lines 384-399)
models/api/stats.py:
StatsResponse(lines 423-431)MarketplaceStatsResponse(lines 434-439)
Migration Steps
Step 1: Create the new structure
- Create the new directories
- Create
__init__.pyfiles - Move the base classes first
Step 2: Database models migration
- Extract models one by one, starting with
User - Update imports in each file
- Test database connections after each model
Step 3: API models migration
- Extract API models by domain
- Update imports in route files
- Test API endpoints after each model group
Step 4: Update imports across the application
- Update all route files to use new import paths
- Update service files
- Update test files
Benefits of This Structure
- Domain separation: Related models are grouped together
- Easier maintenance: Smaller files are easier to navigate and modify
- Reduced conflicts: Multiple developers can work on different domains
- Better testability: Can test model groups independently
- Clear dependencies: Import relationships become more explicit
Import Examples After Restructure
# In route files
from models.database.user import User, Product, Stock
from models.api.auth import UserLogin, UserResponse
from models.api.product import ProductCreate, ProductListResponse
# Or specific imports
from models.database.product import Product
from models.api.product import ProductCreate, ProductResponse
Consideration for Relationships
When splitting database models, be careful with SQLAlchemy relationships:
- Keep related models in the same file if they have tight coupling
- Use string references for relationships across files:
relationship("User")instead ofrelationship(User) - Consider lazy imports in
__init__.pyfiles to avoid circular imports
This restructure will make your codebase much more maintainable as it grows!