14 KiB
Ecommerce Backend API v2.1
A robust, production-ready FastAPI backend for ecommerce product catalog and inventory management with JWT authentication and advanced CSV import capabilities.
Key Features
Security & Authentication
- JWT Authentication: Secure token-based authentication with configurable expiration (30 minutes default)
- User Management: Registration, login, role-based access control (Admin/User roles)
- Password Security: Bcrypt hashing for secure password storage
- Protected Endpoints: All product management operations require authentication
- Default Admin Account: Auto-created admin user for immediate system access
Architecture Improvements
- Modular Design: Separated concerns into utility modules, middleware, and models
- Database Optimization: Added proper indexing strategy and foreign key relationships
- Connection Pooling: PostgreSQL support with connection pooling for production scalability
- Background Processing: Asynchronous CSV import with job tracking
Performance Optimizations
- Batch Processing: CSV imports processed in configurable batches
- Database Indexes: Strategic indexing for common query patterns
- Streaming Export: Memory-efficient CSV export for large datasets
- Rate Limiting: Sliding window rate limiter to prevent API abuse
Data Processing
- Robust GTIN Handling: Centralized GTIN normalization and validation
- Multi-currency Support: Advanced price parsing with currency extraction
- International Content: Multi-encoding CSV support for global data
Project Structure
ecommerce_api/
├── main.py # FastAPI application entry point with auth
├── models/
│ ├── database_models.py # SQLAlchemy ORM models (User, Product, Stock, ImportJob)
│ └── api_models.py # Pydantic API models with auth models
├── utils/
│ ├── data_processing.py # GTIN and price processing utilities
│ ├── csv_processor.py # CSV import/export handling
│ └── database.py # Database configuration
├── middleware/
│ ├── auth.py # JWT authentication with bcrypt
│ ├── rate_limiter.py # Rate limiting implementation
│ ├── error_handler.py # Centralized error handling
│ └── logging_middleware.py # Request/response logging
├── tests/
│ └── test_auth.py # Authentication tests
├── requirements.txt # Python dependencies with auth packages
└── README.md # This file
Quick Start
1. Installation
# Clone the repository
git clone <repository-url>
cd ecommerce-api
# Set up virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
2. Environment Configuration
Create a .env file in the project root:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/ecommerce_db
# For SQLite (development): DATABASE_URL=sqlite:///./ecommerce.db
# JWT Configuration
JWT_SECRET_KEY=your-super-secret-key-change-in-production-immediately
JWT_EXPIRE_MINUTES=30
# Server Configuration
API_HOST=0.0.0.0
API_PORT=8000
DEBUG=False
Important Security Note: Always change the JWT_SECRET_KEY in production!
3. Database Setup
For SQLite (Development):
# Run the application - it will create tables automatically
python main.py
For PostgreSQL (Production):
# Create PostgreSQL database
createdb ecommerce_db
# Run the application - it will create tables and indexes automatically
python main.py
4. Start the Server
# Development server
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# Production server
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
The API will be available at http://localhost:8000
5. Default Admin Access
The system automatically creates a default admin user:
- Username:
admin - Password:
admin123 - Email:
admin@example.com
Security Warning: Change the admin password immediately in production!
Authentication Flow
1. Register a New User
curl -X POST "http://localhost:8000/register" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "newuser",
"password": "securepassword123"
}'
2. Login and Get JWT Token
curl -X POST "http://localhost:8000/login" \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'
Response:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 1800,
"user": {
"id": 1,
"username": "admin",
"email": "admin@example.com",
"role": "admin",
"is_active": true
}
}
3. Use Token for Protected Endpoints
curl -X GET "http://localhost:8000/products" \
-H "Authorization: Bearer YOUR_JWT_TOKEN_HERE"
API Endpoints
Public Endpoints
GET /- API informationGET /health- Health checkPOST /register- Register new userPOST /login- Login and get JWT token
Protected Endpoints (Require Authentication)
User Management
GET /me- Get current user information
Products (All users)
GET /products- List products with filtering and searchPOST /products- Create new productGET /products/{product_id}- Get product with stock infoPUT /products/{product_id}- Update productDELETE /products/{product_id}- Delete product and associated stock
Stock Management (All users)
POST /stock- Set exact stock quantityGET /stock/{gtin}- Get stock summary by GTIN
CSV Operations (All users)
POST /import-csv- Start background CSV importGET /import-status/{job_id}- Check import job status (own jobs only)GET /export-csv- Export products as CSV (streaming)
Statistics (All users)
GET /stats- System statistics
Admin-Only Endpoints
GET /admin/users- List all usersPUT /admin/users/{user_id}/status- Activate/deactivate users
User Roles and Permissions
Regular Users
- Can register and login
- Access all product and stock management features
- Can import/export CSV files
- Can only view their own import jobs
- Cannot manage other users
Admin Users
- All regular user permissions
- Can view and manage all users
- Can view all import jobs from any user
- Can activate/deactivate user accounts
Security Features
Password Security
- Passwords hashed using bcrypt with salt
- Minimum password length: 6 characters
- No password storage in plaintext anywhere
JWT Token Security
- Tokens include expiration timestamp
- Tokens include user role and permissions
- Configurable expiration time (default: 30 minutes)
- Secure token validation on each request
Rate Limiting
- CSV imports: 10 requests per hour
- General API: 100 requests per hour per client
- Customizable per endpoint
Input Validation
- All inputs validated using Pydantic models
- Email format validation for registration
- Username alphanumeric validation
- GTIN format validation and normalization
Advanced Features
Background CSV Import
Import large CSV files asynchronously:
import requests
# Start import
response = requests.post(
'http://localhost:8000/import-csv',
headers={'Authorization': 'Bearer YOUR_TOKEN'},
json={
'url': 'https://example.com/products.csv',
'batch_size': 1000
}
)
job_id = response.json()['job_id']
# Check status
status_response = requests.get(
f'http://localhost:8000/import-status/{job_id}',
headers={'Authorization': 'Bearer YOUR_TOKEN'}
)
print(status_response.json())
Product Search and Filtering
# Search in title and description
GET /products?search=laptop
# Filter by brand and category
GET /products?brand=Apple&category=Electronics
# Combine filters with pagination
GET /products?brand=Samsung&availability=in%20stock&search=phone&skip=0&limit=50
Stock Management
# Set stock for a specific location
curl -X POST "http://localhost:8000/stock" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"gtin": "1234567890123",
"location": "WAREHOUSE_A",
"quantity": 100
}'
# Get stock summary
curl -X GET "http://localhost:8000/stock/1234567890123" \
-H "Authorization: Bearer YOUR_TOKEN"
Database Schema
Users Table
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR UNIQUE NOT NULL,
username VARCHAR UNIQUE NOT NULL,
hashed_password VARCHAR NOT NULL,
role VARCHAR DEFAULT 'user',
is_active BOOLEAN DEFAULT true,
last_login TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
Products Table
- Full product catalog with Google Shopping compatibility
- Indexed fields:
gtin,brand,google_product_category,availability - Supports all Google Shopping feed attributes
Stock Table
- Location-based inventory tracking
- GTIN-based product linking
- Unique constraint on GTIN+location combinations
Import Jobs Table
- Track background import operations
- User ownership and access control
- Status monitoring and error handling
Development
Running Tests
# Install test dependencies
pip install pytest pytest-asyncio httpx
# Run all tests
pytest
# Run with coverage
pytest --cov=. tests/
Development Server with Auto-reload
uvicorn main:app --reload --host 0.0.0.0 --port 8000
Production Deployment
Security Checklist
- Change default admin password immediately
- Set strong JWT_SECRET_KEY (32+ random characters)
- Configure JWT_EXPIRE_MINUTES appropriately
- Set up HTTPS/TLS termination
- Configure CORS for your frontend domains only
- Set up database connection limits and pooling
- Enable request logging and monitoring
- Configure rate limiting per your needs
- Set up user account monitoring and alerting
- Regular security audits of user accounts
Environment Variables for Production
# Security
JWT_SECRET_KEY=your-very-long-random-secret-key-at-least-32-characters
JWT_EXPIRE_MINUTES=30
# Database (use PostgreSQL in production)
DATABASE_URL=postgresql://user:password@db-host:5432/ecommerce_prod
# Server
DEBUG=False
API_HOST=0.0.0.0
API_PORT=8000
# Optional: External services
REDIS_URL=redis://redis-host:6379/0
Docker Deployment
# docker-compose.yml
version: '3.8'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: ecommerce
POSTGRES_USER: ecommerce_user
POSTGRES_PASSWORD: secure_password
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
api:
build: .
environment:
DATABASE_URL: postgresql://ecommerce_user:secure_password@db:5432/ecommerce
JWT_SECRET_KEY: your-production-secret-key
JWT_EXPIRE_MINUTES: 30
ports:
- "8000:8000"
depends_on:
- db
restart: unless-stopped
volumes:
postgres_data:
Nginx Configuration
server {
listen 80;
server_name your-api-domain.com;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Troubleshooting
Authentication Issues
Invalid Token Errors:
- Check token expiration (default 30 minutes)
- Verify JWT_SECRET_KEY is consistent
- Ensure Bearer token format:
Authorization: Bearer <token>
Login Failures:
- Verify username/email and password
- Check if user account is active (
is_active: true) - Review user registration process
Permission Denied:
- Confirm user role permissions
- Check endpoint access requirements
- Verify token contains correct role information
Database Issues
Connection Errors:
- Verify DATABASE_URL format and credentials
- Check database server accessibility
- Monitor connection pool limits
Migration Issues:
- Tables are created automatically on startup
- For schema changes, implement proper migrations
- Backup data before major updates
Common API Issues
CSV Import Failures:
- Check file URL accessibility
- Verify CSV format and encoding
- Monitor import job status for detailed errors
- Ensure proper authentication token
Rate Limiting:
- Default limits: 100 requests/hour, 10 CSV imports/hour
- Check rate limit headers in responses
- Implement proper retry logic with backoff
Logging and Monitoring
Application logs include:
- Authentication events (login, failed attempts)
- API request/response times
- Import job progress and errors
- Rate limiting events
- Database query performance
# View logs in development
python main.py # Logs to console
# Docker logs
docker-compose logs -f api
Migration from v2.0
If upgrading from v2.0 to v2.1:
-
Install new dependencies:
pip install -r requirements.txt -
Update environment variables:
echo "JWT_SECRET_KEY=your-secret-key" >> .env echo "JWT_EXPIRE_MINUTES=30" >> .env -
Database migration: The application will automatically create the new
userstable and update theimport_jobstable on startup. -
Update client code:
- Add authentication to all product management API calls
- Implement login flow in your frontend
- Handle JWT token refresh
Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make changes with proper tests
- Run security and quality checks
- Update documentation if needed
- Submit a pull request
Code Quality Standards
- All endpoints must have proper authentication
- Password handling must use bcrypt
- JWT tokens must have expiration
- Input validation using Pydantic models
- Comprehensive error handling
- Unit tests for authentication logic
License
This project is licensed under the MIT License - see the LICENSE file for details.
Security
For security issues, please email the maintainers directly instead of creating a public issue.
Support
For issues and questions:
- Check the troubleshooting section above
- Review existing GitHub issues
- Create a new issue with detailed information including:
- Authentication steps you've tried
- Error messages and logs
- API endpoint and request details
- Environment configuration (without secrets)