diff --git a/.env b/.env index b4e90386..657fa923 100644 --- a/.env +++ b/.env @@ -10,6 +10,14 @@ VERSION=0.0.1 # For development, you can use SQLite: DATABASE_URL=sqlite:///./ecommerce.db +# Documentation +# .env.development +DOCUMENTATION_URL=http://localhost:8001 +# .env.production +# DOCUMENTATION_URL=https://yourdomain.com/docs +# .env.staging +# DOCUMENTATION_URL=https://staging-docs.yourdomain.com + # JWT Configuration JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production JWT_EXPIRE_HOURS=24 diff --git a/TODO b/TODO deleted file mode 100644 index 9c592ce0..00000000 --- a/TODO +++ /dev/null @@ -1,29 +0,0 @@ -Best Practice Recommendation -For production applications, consider using database migrations (like Alembic) to manage schema changes including index -creation, rather than creating them programmatically at startup. This provides better control and tracking of database changes. - - -https://letzshop-google-shopping-product-exports-production.s3.eu-west-1.amazonaws.com/city_zones/strassen/vendors/wizard-cloud-marketing-s-a-r-l/google_shopping/products_fr.csv - -what are those? -INFO: ('192.168.1.125', 53912) - "WebSocket /" 403 -INFO: connection rejected (403 Forbidden) -INFO: connection closed -INFO: 192.168.1.125:53913 - "GET /loginMsg.js HTTP/1.1" 404 Not Found -INFO: 192.168.1.125:53914 - "GET /cgi/get.cgi?cmd=home_login HTTP/1.1" 404 Not Found -INFO: 192.168.1.125:53915 - "POST /boaform/admin/formTracert HTTP/1.1" 404 Not Found - - -when creating a stock the gtin has to exist inthe product table - - -FAILED tests\test_admin.py::TestAdminAPI::test_admin_endpoints_require_authentication - assert 403 == 401 -FAILED tests\test_background_tasks.py::TestBackgroundTasks::test_marketplace_import_success - AssertionError: assert 'pending' == 'completed' -FAILED tests\test_background_tasks.py::TestBackgroundTasks::test_marketplace_import_failure - AssertionError: assert 'pending' == 'failed' -FAILED tests\test_error_handling.py::TestErrorHandling::test_invalid_authentication - assert 401 == 403 -FAILED tests\test_error_handling.py::TestErrorHandling::test_duplicate_resource_creation - assert 500 == 400 -FAILED tests\test_marketplace.py::TestMarketplaceAPI::test_import_from_marketplace - sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 1 - probably unsupported type. -FAILED tests\test_product.py::TestProductsAPI::test_get_products_empty - assert 404 == 200 -FAILED tests\test_product.py::TestProductsAPI::test_create_product_duplicate_id - assert 500 == 400 -FAILED tests\test_security.py::TestSecurity::test_protected_endpoint_with_invalid_token - assert 401 == 403 -FAILED tests\test_security.py::TestSecurity::test_input_validation - assert '" diff --git a/app/api/v1/admin.py b/app/api/v1/admin.py index 0a461ec7..91b72863 100644 --- a/app/api/v1/admin.py +++ b/app/api/v1/admin.py @@ -16,9 +16,9 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_admin_user from app.core.database import get_db from app.services.admin_service import admin_service -from models.api.auth import UserResponse -from models.api.marketplace import MarketplaceImportJobResponse -from models.api.shop import ShopListResponse +from models.schemas.auth import UserResponse +from models.schemas.marketplace import MarketplaceImportJobResponse +from models.schemas.shop import ShopListResponse from models.database.user import User router = APIRouter() diff --git a/app/api/v1/auth.py b/app/api/v1/auth.py index 223d9ee1..0854e391 100644 --- a/app/api/v1/auth.py +++ b/app/api/v1/auth.py @@ -15,8 +15,8 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from app.services.auth_service import auth_service -from models.api.auth import (LoginResponse, UserLogin, UserRegister, - UserResponse) +from models.schemas.auth import (LoginResponse, UserLogin, UserRegister, + UserResponse) from models.database.user import User router = APIRouter() diff --git a/app/api/v1/marketplace.py b/app/api/v1/marketplace.py index f04ace87..66049833 100644 --- a/app/api/v1/marketplace.py +++ b/app/api/v1/marketplace.py @@ -18,8 +18,8 @@ from app.core.database import get_db from app.services.marketplace_service import marketplace_service from app.tasks.background_tasks import process_marketplace_import from middleware.decorators import rate_limit -from models.api.marketplace import (MarketplaceImportJobResponse, - MarketplaceImportRequest) +from models.schemas.marketplace import (MarketplaceImportJobResponse, + MarketplaceImportRequest) from models.database.user import User router = APIRouter() diff --git a/app/api/v1/product.py b/app/api/v1/product.py index 4361f8bf..447354ca 100644 --- a/app/api/v1/product.py +++ b/app/api/v1/product.py @@ -17,9 +17,9 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from app.services.product_service import product_service -from models.api.product import (ProductCreate, ProductDetailResponse, - ProductListResponse, ProductResponse, - ProductUpdate) +from models.schemas.product import (ProductCreate, ProductDetailResponse, + ProductListResponse, ProductResponse, + ProductUpdate) from models.database.user import User router = APIRouter() diff --git a/app/api/v1/shop.py b/app/api/v1/shop.py index 7a183e40..62f27dc3 100644 --- a/app/api/v1/shop.py +++ b/app/api/v1/shop.py @@ -15,8 +15,8 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_user, get_user_shop from app.core.database import get_db from app.services.shop_service import shop_service -from models.api.shop import (ShopCreate, ShopListResponse, ShopProductCreate, - ShopProductResponse, ShopResponse) +from models.schemas.shop import (ShopCreate, ShopListResponse, ShopProductCreate, + ShopProductResponse, ShopResponse) from models.database.user import User router = APIRouter() diff --git a/app/api/v1/stats.py b/app/api/v1/stats.py index 5486c3fa..361ba149 100644 --- a/app/api/v1/stats.py +++ b/app/api/v1/stats.py @@ -16,7 +16,7 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from app.services.stats_service import stats_service -from models.api.stats import MarketplaceStatsResponse, StatsResponse +from models.schemas.stats import MarketplaceStatsResponse, StatsResponse from models.database.user import User router = APIRouter() diff --git a/app/api/v1/stock.py b/app/api/v1/stock.py index b747949e..2619fe23 100644 --- a/app/api/v1/stock.py +++ b/app/api/v1/stock.py @@ -16,8 +16,8 @@ from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from app.services.stock_service import stock_service -from models.api.stock import (StockAdd, StockCreate, StockResponse, - StockSummaryResponse, StockUpdate) +from models.schemas.stock import (StockAdd, StockCreate, StockResponse, + StockSummaryResponse, StockUpdate) from models.database.user import User router = APIRouter() diff --git a/app/core/config.py b/app/core/config.py index 24876c20..8067a686 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -18,42 +18,21 @@ class Settings(BaseSettings): # Project information project_name: str = "Ecommerce Backend API with Marketplace Support" + # Documentation + documentation_url: str = "http://localhost:8001" # Development default + + # Clean description without HTML description: str = """ - ## ๐Ÿš€ Letzshop Import API - - Complete marketplace product import and management system built with FastAPI. - - ### ๐Ÿ“š Documentation Links - - - **[Complete Documentation Site](#)** - Full project documentation - - **[Getting Started Guide](#)** - Installation and setup - - **[User Guides](#)** - How-to guides and tutorials - - **[API Authentication Guide](#)** - Security and authentication - - **[Testing Documentation](#)** - Test suite and conventions - - ### ๐Ÿ”— Quick Links - - - **[Alternative API Docs](/redoc)** - ReDoc interface - - **[Health Check](/health)** - System status - - **[OpenAPI Spec](/openapi.json)** - Machine-readable API spec - - ### ๐Ÿ“– Key Features - - - **Product Management** - Complete CRUD operations with validation - - **Multi-Shop Support** - Independent shop configurations - - **CSV Import System** - Bulk import from various marketplace formats - - **Stock Management** - Inventory tracking across locations - - **User Management** - Role-based access control - - **Marketplace Integration** - Import from multiple platforms - - ### ๐Ÿ—๏ธ Architecture - - Built with modern Python stack: - - **FastAPI** - High-performance async API framework - - **SQLAlchemy** - Powerful ORM with PostgreSQL - - **Pydantic** - Data validation and serialization - - **JWT Authentication** - Secure token-based auth - - **pytest** - Comprehensive test suite + Marketplace product import and management system with multi-shop support. + + **Features:** + - JWT Authentication with role-based access + - Multi-marketplace product import (CSV processing) + - Inventory management across multiple locations + - Shop management with individual configurations + + **Documentation:** Visit /documentation for complete guides + **API Testing:** Use /docs for interactive API exploration """ version: str = "2.2.0" diff --git a/app/services/admin_service.py b/app/services/admin_service.py index 8934631a..22f9c2ab 100644 --- a/app/services/admin_service.py +++ b/app/services/admin_service.py @@ -14,7 +14,7 @@ from typing import List, Optional, Tuple from fastapi import HTTPException from sqlalchemy.orm import Session -from models.api.marketplace import MarketplaceImportJobResponse +from models.schemas.marketplace import MarketplaceImportJobResponse from models.database.marketplace import MarketplaceImportJob from models.database.shop import Shop from models.database.user import User diff --git a/app/services/auth_service.py b/app/services/auth_service.py index 44f8b8fc..8b14aa21 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -14,7 +14,7 @@ from fastapi import HTTPException from sqlalchemy.orm import Session from middleware.auth import AuthManager -from models.api.auth import UserLogin, UserRegister +from models.schemas.auth import UserLogin, UserRegister from models.database.user import User logger = logging.getLogger(__name__) diff --git a/app/services/marketplace_service.py b/app/services/marketplace_service.py index e312bfe7..3024080d 100644 --- a/app/services/marketplace_service.py +++ b/app/services/marketplace_service.py @@ -14,8 +14,8 @@ from typing import List, Optional from sqlalchemy import func from sqlalchemy.orm import Session -from models.api.marketplace import (MarketplaceImportJobResponse, - MarketplaceImportRequest) +from models.schemas.marketplace import (MarketplaceImportJobResponse, + MarketplaceImportRequest) from models.database.marketplace import MarketplaceImportJob from models.database.shop import Shop from models.database.user import User diff --git a/app/services/product_service.py b/app/services/product_service.py index 290485ab..0747d255 100644 --- a/app/services/product_service.py +++ b/app/services/product_service.py @@ -14,8 +14,8 @@ from typing import Generator, List, Optional from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session -from models.api.product import ProductCreate, ProductUpdate -from models.api.stock import StockLocationResponse, StockSummaryResponse +from models.schemas.product import ProductCreate, ProductUpdate +from models.schemas.stock import StockLocationResponse, StockSummaryResponse from models.database.product import Product from models.database.stock import Stock from utils.data_processing import GTINProcessor, PriceProcessor diff --git a/app/services/shop_service.py b/app/services/shop_service.py index 3f601853..a0a48b5a 100644 --- a/app/services/shop_service.py +++ b/app/services/shop_service.py @@ -14,7 +14,7 @@ from fastapi import HTTPException from sqlalchemy import func from sqlalchemy.orm import Session -from models.api.shop import ShopCreate, ShopProductCreate +from models.schemas.shop import ShopCreate, ShopProductCreate from models.database.product import Product from models.database.shop import Shop, ShopProduct from models.database.user import User diff --git a/app/services/stock_service.py b/app/services/stock_service.py index ed04bed7..53833b94 100644 --- a/app/services/stock_service.py +++ b/app/services/stock_service.py @@ -13,8 +13,8 @@ from typing import List, Optional from sqlalchemy.orm import Session -from models.api.stock import (StockAdd, StockCreate, StockLocationResponse, - StockSummaryResponse, StockUpdate) +from models.schemas.stock import (StockAdd, StockCreate, StockLocationResponse, + StockSummaryResponse, StockUpdate) from models.database.product import Product from models.database.stock import Stock from utils.data_processing import GTINProcessor diff --git a/main.py b/main.py index 4f01d278..4eb91027 100644 --- a/main.py +++ b/main.py @@ -57,7 +57,7 @@ def health_check(db: Session = Depends(get_db)): "swagger": "/docs", "redoc": "/redoc", "openapi": "/openapi.json", - "complete": "Documentation site URL here", + "complete": "/documentation", }, "features": [ "JWT Authentication", @@ -79,89 +79,13 @@ def health_check(db: Session = Depends(get_db)): # Documentation redirect endpoints @app.get("/documentation", response_class=HTMLResponse, include_in_schema=False) -async def documentation_page(): - """Enhanced documentation hub page""" - return """ - - - - Letzshop Import - Documentation - - - -
- -

Choose your documentation experience

-
- -
- -

๐Ÿ”ง Interactive API Docs LIVE

-

Swagger UI interface for testing API endpoints directly in your browser. Perfect for development and API exploration.

-
- - -

๐Ÿ“– API Reference

-

Clean, readable API documentation with ReDoc. Great for understanding API structure and parameters.

-
- - -

๐Ÿ“š Complete Documentation

-

Comprehensive project documentation with guides, tutorials, architecture, and development info.

-
- - -

๐Ÿš€ Getting Started

-

Step-by-step installation and setup guide to get you up and running quickly.

-
- - -

๐Ÿงช Testing Guide

-

Testing conventions, how to run tests, and contribute to the test suite.

-
- - -

๐Ÿ’š System Health

-

Check the current status and health of the API and its dependencies.

-
-
- -
-

Need help? Check our GitHub Issues

-
- - - """ +async def documentation(): + """Redirect to MkDocs documentation""" + # Development + if settings.debug: + return RedirectResponse(url="http://localhost:8001") + # Production + return RedirectResponse(url=settings.documentation_url) if __name__ == "__main__": diff --git a/models/__init__.py b/models/__init__.py index 5f904bd3..d0d1346f 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -10,7 +10,7 @@ from .database.shop import Shop, ShopProduct from .database.marketplace import MarketplaceImportJob # API models (Pydantic) - import the modules, not all classes -from . import api +from . import schemas # Export database models for Alembic __all__ = [ diff --git a/models/api/__init__.py b/models/schemas/__init__.py similarity index 100% rename from models/api/__init__.py rename to models/schemas/__init__.py diff --git a/models/api/auth.py b/models/schemas/auth.py similarity index 100% rename from models/api/auth.py rename to models/schemas/auth.py diff --git a/models/api/base.py b/models/schemas/base.py similarity index 100% rename from models/api/base.py rename to models/schemas/base.py diff --git a/models/api/marketplace.py b/models/schemas/marketplace.py similarity index 100% rename from models/api/marketplace.py rename to models/schemas/marketplace.py diff --git a/models/api/product.py b/models/schemas/product.py similarity index 97% rename from models/api/product.py rename to models/schemas/product.py index 68ddb07c..ee92eb1b 100644 --- a/models/api/product.py +++ b/models/schemas/product.py @@ -4,7 +4,7 @@ from typing import List, Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator -from models.api.stock import StockSummaryResponse +from models.schemas.stock import StockSummaryResponse class ProductBase(BaseModel): diff --git a/models/api/shop.py b/models/schemas/shop.py similarity index 98% rename from models/api/shop.py rename to models/schemas/shop.py index 149ebdbe..4e308ba1 100644 --- a/models/api/shop.py +++ b/models/schemas/shop.py @@ -4,7 +4,7 @@ from typing import List, Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator -from models.api.product import ProductResponse +from models.schemas.product import ProductResponse class ShopCreate(BaseModel): diff --git a/models/api/stats.py b/models/schemas/stats.py similarity index 100% rename from models/api/stats.py rename to models/schemas/stats.py diff --git a/models/api/stock.py b/models/schemas/stock.py similarity index 100% rename from models/api/stock.py rename to models/schemas/stock.py diff --git a/scripts/verify_setup.py b/scripts/verify_setup.py index eb68ee97..87a2b6e8 100644 --- a/scripts/verify_setup.py +++ b/scripts/verify_setup.py @@ -144,7 +144,7 @@ def verify_model_structure(): # Test API models try: - import models.api + import models.schemas print("[OK] API models package imported") # Test specific API model imports diff --git a/tests/unit/services/test_auth_service.py b/tests/unit/services/test_auth_service.py index b7a9d1cf..357be74f 100644 --- a/tests/unit/services/test_auth_service.py +++ b/tests/unit/services/test_auth_service.py @@ -3,7 +3,7 @@ import pytest from fastapi import HTTPException from app.services.auth_service import AuthService -from models.api.auth import UserLogin, UserRegister +from models.schemas.auth import UserLogin, UserRegister from models.database.user import User diff --git a/tests/unit/services/test_marketplace_service.py b/tests/unit/services/test_marketplace_service.py index da14c4d9..4e14d78e 100644 --- a/tests/unit/services/test_marketplace_service.py +++ b/tests/unit/services/test_marketplace_service.py @@ -5,7 +5,7 @@ from datetime import datetime import pytest from app.services.marketplace_service import MarketplaceService -from models.api.marketplace import MarketplaceImportRequest +from models.schemas.marketplace import MarketplaceImportRequest from models.database.marketplace import MarketplaceImportJob from models.database.shop import Shop from models.database.user import User diff --git a/tests/unit/services/test_product_service.py b/tests/unit/services/test_product_service.py index fe7000e4..d94a755d 100644 --- a/tests/unit/services/test_product_service.py +++ b/tests/unit/services/test_product_service.py @@ -2,7 +2,7 @@ import pytest from app.services.product_service import ProductService -from models.api.product import ProductCreate +from models.schemas.product import ProductCreate from models.database.product import Product diff --git a/tests/unit/services/test_shop_service.py b/tests/unit/services/test_shop_service.py index 7a89da05..41855eb4 100644 --- a/tests/unit/services/test_shop_service.py +++ b/tests/unit/services/test_shop_service.py @@ -3,7 +3,7 @@ import pytest from fastapi import HTTPException from app.services.shop_service import ShopService -from models.api.shop import ShopCreate, ShopProductCreate +from models.schemas.shop import ShopCreate, ShopProductCreate @pytest.mark.unit diff --git a/tests/unit/services/test_stock_service.py b/tests/unit/services/test_stock_service.py index 7699590f..e8fc449e 100644 --- a/tests/unit/services/test_stock_service.py +++ b/tests/unit/services/test_stock_service.py @@ -4,7 +4,7 @@ import uuid import pytest from app.services.stock_service import StockService -from models.api.stock import StockAdd, StockCreate, StockUpdate +from models.schemas.stock import StockAdd, StockCreate, StockUpdate from models.database.product import Product from models.database.stock import Stock