This is a FastAPI-based REST API application for managing customers and their addresses using Azure Cosmos DB. The project demonstrates spec-driven development using Visual Studio Code and various LLMs.
- Customer Management: Complete CRUD operations for customer records
- Address Management: Complete CRUD operations for customer addresses
- Azure Cosmos DB Integration: Leveraging Azure Cosmos DB for data persistence
- Data Validation: Comprehensive input validation using Pydantic models
- Comprehensive Testing: Unit tests with pytest
- API Documentation: Auto-generated OpenAPI/Swagger documentation
The application follows a clean architecture pattern with:
- FastAPI: Modern, fast web framework for building APIs
- Pydantic: Data validation and serialization using Python type annotations
- Azure Cosmos DB: NoSQL database for scalable data storage
- Pytest: Testing framework with comprehensive test coverage
POST /api/customers- Create a new customerGET /api/customers- List customers with paginationGET /api/customers/{customerId}- Get a specific customerPUT /api/customers/{customerId}- Update a customerDELETE /api/customers/{customerId}- Delete a customer
POST /api/customers/addresses- Create a new customer addressGET /api/customers/{customerId}/addresses- List addresses for a customerGET /api/customers/{customerId}/addresses/{addressId}- Get a specific addressPUT /api/customers/{customerId}/addresses/{addressId}- Update an addressDELETE /api/customers/{customerId}/addresses/{addressId}- Delete an address
- Python 3.12 or higher
- Azure Cosmos DB account and connection string
- uv package manager
git clone <repository-url>
cd spec-driven-dev-backend-apisUsing uv (recommended):
uv syncOr using pip:
pip install -r requirements.txtCopy the example environment file and configure your settings:
cp .env.example .envEdit .env file with your Azure Cosmos DB configuration:
COSMOS_CONNECTION_STRING=AccountEndpoint=https://your-cosmos-account.documents.azure.com:443/;AccountKey=your-primary-key;
COSMOS_DATABASE_NAME=contoso_customer_dbThe application will automatically create the database and containers on first run. Ensure your Cosmos DB account has sufficient permissions.
# Using uv
uv run python main.py
# Or using python directly
python main.pyThe API will be available at:
- API Base URL: http://localhost:8000
- Interactive Docs: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
# Using uvicorn directly
uvicorn main:app --host 0.0.0.0 --port 8000
# With multiple workers
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4Run the comprehensive test suite:
# Run all tests
uv run pytest
# Run with coverage
uv run pytest --cov=contoso_api_backend
# Example to Run specific test files
uv run pytest tests/test_customers.py
uv run pytest tests/test_addresses.py
uv run pytest tests/test_models.py{
"id": "string (UUID)",
"firstName": "string",
"lastName": "string",
"accountCategory": "Free | Standard | Premium"
}{
"id": "string (UUID)",
"customerId": "string (UUID)",
"address": "string",
"address2": "string (optional)",
"city": "string",
"state": "string (2-letter code)",
"zipCode": "string (12345 or 12345-6789)",
"addressType": "shipping | billing"
}You can test the API using the humao.rest-client VSCode extension or any HTTP client like curl or Postman.
POST http://localhost:8000/api/customers
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe",
"accountCategory": "Standard"
}POST http://localhost:8000/api/customers/addresses
Content-Type: application/json
{
"customerId": "123e4567-e89b-12d3-a456-426614174000",
"address": "123 Main St",
"address2": "Apt 4B",
"city": "Seattle",
"state": "WA",
"zipCode": "98101",
"addressType": "shipping"
}spec-driven-dev-backend-apis/
├── contoso_api_backend/ # Main application package
│ ├── __init__.py
│ ├── models.py # Pydantic data models
│ ├── database.py # Cosmos DB connection management
│ ├── customers.py # Customer endpoint handlers
│ └── addresses.py # Address endpoint handlers
├── tests/ # Test suite
│ ├── __init__.py
│ ├── conftest.py # Test fixtures
│ ├── test_customers.py # Customer endpoint tests
│ ├── test_addresses.py # Address endpoint tests
│ └── test_models.py # Model validation tests
├── main.py # FastAPI application entry point
├── pyproject.toml # Project dependencies and metadata
├── .env.example # Environment configuration template
└── README.md # This file
| Variable | Description | Required |
|---|---|---|
COSMOS_CONNECTION_STRING |
Azure Cosmos DB connection string | Yes |
COSMOS_DATABASE_NAME |
Name of the Cosmos DB database | Yes |
COSMOS_ENDPOINT |
Alternative to connection string (requires auth setup) | No |
The API includes comprehensive error handling with appropriate HTTP status codes:
200 OK- Successful GET/PUT operations201 Created- Successful POST operations204 No Content- Successful DELETE operations404 Not Found- Resource not found422 Unprocessable Entity- Validation errors400 Bad Request- General client errors500 Internal Server Error- Server errors
- Follow the existing code structure and patterns
- Add comprehensive tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting changes
This project is licensed under the MIT License - see the LICENSE file for details.