https://github.com/avidhanr/fastapiserver
This fastapi server is completely written by GitHub Copilot using Agentic mode powered with Claude Sonnet 4.1
https://github.com/avidhanr/fastapiserver
appwrite appwrite-function fastapi mock python
Last synced: 5 months ago
JSON representation
This fastapi server is completely written by GitHub Copilot using Agentic mode powered with Claude Sonnet 4.1
- Host: GitHub
- URL: https://github.com/avidhanr/fastapiserver
- Owner: AVidhanR
- Created: 2025-08-24T18:24:52.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2025-08-24T18:45:24.000Z (5 months ago)
- Last Synced: 2025-08-24T22:49:17.793Z (5 months ago)
- Topics: appwrite, appwrite-function, fastapi, mock, python
- Language: Python
- Homepage: https://68ab5a4800366d9e9bbc.fra.appwrite.run/
- Size: 22.5 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# FastAPI Demo Server
A comprehensive FastAPI backend server demonstration showcasing various types of APIs, authentication, file uploads, and best practices.
## Features
- 🔐 **JWT Authentication** - Secure token-based authentication
- 👥 **User Management** - Complete CRUD operations for users
- 📦 **Product Management** - Product catalog with search and filtering
- 📁 **File Upload** - Single and multiple file upload capabilities
- 🔍 **Search & Filtering** - Advanced search and filtering options
- 📚 **API Documentation** - Auto-generated Swagger/OpenAPI docs
- 🛡️ **Role-based Access Control** - Admin and user roles
- 🌐 **CORS Support** - Cross-origin resource sharing
- ✅ **Input Validation** - Pydantic models for data validation
- 🏗️ **Clean Architecture** - Well-organized folder structure
## Project Structure
```
FastAPIServer/
├── app/
│ ├── api/ # API endpoints
│ │ ├── auth.py # Authentication endpoints
│ │ ├── users.py # User management endpoints
│ │ ├── products.py # Product management endpoints
│ │ ├── files.py # File upload endpoints
│ │ └── misc.py # Miscellaneous endpoints
│ ├── core/ # Core functionality
│ │ ├── config.py # Application configuration
│ │ └── security.py # Security utilities
│ ├── models/ # Pydantic models
│ │ └── __init__.py # Data models and schemas
│ └── services/ # Business logic
│ ├── user_service.py # User business logic
│ └── product_service.py # Product business logic
├── tests/ # Test files
├── uploads/ # File upload directory
├── main.py # Application entry point
├── pyproject.toml # Project configuration
└── README.md # This file
```
## Installation
1. **Clone the repository:**
```bash
git clone
cd FastAPIServer
```
2. **Install dependencies:**
```bash
pip install -e .
```
Or install with development dependencies:
```bash
pip install -e ".[dev]"
```
## Running the Server
### Development Mode
```bash
python main.py
```
### Production Mode
```bash
uvicorn main:app --host 0.0.0.0 --port 8000
```
The server will be available at:
- **API**: http://localhost:8000
- **Swagger UI**: http://localhost:8000/docs
- **ReDoc**: http://localhost:8000/redoc
## API Endpoints
### Authentication (`/api/v1/auth`)
| Method | Endpoint | Description | Auth Required |
| ------ | ----------- | ------------------------- | ------------- |
| POST | `/token` | Login to get access token | No |
| POST | `/register` | Register new user | No |
| GET | `/me` | Get current user info | Yes |
**Example - Login:**
```bash
curl -X POST "http://localhost:8000/api/v1/auth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=admin123"
```
**Example - Register:**
```bash
curl -X POST "http://localhost:8000/api/v1/auth/register" \
-H "Content-Type: application/json" \
-d '{
"username": "newuser",
"email": "user@example.com",
"password": "password123",
"full_name": "New User"
}'
```
### User Management (`/api/v1/users`)
| Method | Endpoint | Description | Auth Required | Admin Only |
| ------ | ------------ | --------------- | ------------- | ---------- |
| GET | `/` | List all users | Yes | No |
| GET | `/{user_id}` | Get user by ID | Yes | No |
| POST | `/` | Create new user | Yes | Yes |
| PUT | `/{user_id}` | Update user | Yes | Self/Admin |
| DELETE | `/{user_id}` | Delete user | Yes | Yes |
**Example - Get all users:**
```bash
curl -X GET "http://localhost:8000/api/v1/users/" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```
### Product Management (`/api/v1/products`)
| Method | Endpoint | Description | Auth Required | Admin Only |
| ------ | ---------------- | ----------------- | ------------- | ---------- |
| GET | `/` | List products | No | No |
| GET | `/search?q=term` | Search products | No | No |
| GET | `/{product_id}` | Get product by ID | No | No |
| POST | `/` | Create product | Yes | Yes |
| PUT | `/{product_id}` | Update product | Yes | Yes |
| DELETE | `/{product_id}` | Delete product | Yes | Yes |
**Query Parameters for GET `/`:**
- `skip`: Number of items to skip (pagination)
- `limit`: Number of items to return (max 100)
- `category`: Filter by category (electronics, clothing, books, home, sports)
- `in_stock`: Filter by stock status (true/false)
**Example - Get products:**
```bash
curl -X GET "http://localhost:8000/api/v1/products/?category=electronics&in_stock=true"
```
**Example - Search products:**
```bash
curl -X GET "http://localhost:8000/api/v1/products/search?q=macbook"
```
### File Upload (`/api/v1/upload`)
| Method | Endpoint | Description | Auth Required |
| ------ | ----------- | ---------------------- | ------------- |
| POST | `/single` | Upload single file | Yes |
| POST | `/multiple` | Upload multiple files | Yes |
| GET | `/info` | Get upload constraints | No |
**Supported File Types:** jpg, jpeg, png, gif, pdf, txt, docx, xlsx
**Maximum File Size:** 10MB
**Maximum Files per Request:** 5 files
**Example - Upload single file:**
```bash
curl -X POST "http://localhost:8000/api/v1/upload/single" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-F "file=@/path/to/your/file.pdf"
```
### Miscellaneous (`/api/v1/misc`)
| Method | Endpoint | Description |
| ------ | ------------------------ | ----------------------- |
| GET | `/health` | Health check |
| GET | `/ping` | Simple ping test |
| GET | `/time` | Get server time |
| GET | `/echo?message=hello` | Echo message |
| POST | `/echo` | Echo JSON data |
| GET | `/random-quote` | Get random quote |
| GET | `/weather?city=London` | Get weather (mock data) |
| GET | `/slow?delay=5` | Slow endpoint (testing) |
| GET | `/error?status_code=404` | Trigger error (testing) |
## Default Users
The application creates default users for testing:
| Username | Password | Role | Email |
| -------- | -------- | ----- | ----------------- |
| admin | admin123 | admin | admin@example.com |
| john_doe | user123 | user | john@example.com |
## Authentication Flow
1. **Register** a new user or use default credentials
2. **Login** to get an access token:
```bash
POST /api/v1/auth/token
{
"username": "admin",
"password": "admin123"
}
```
3. **Use the token** in subsequent requests:
```bash
Authorization: Bearer YOUR_ACCESS_TOKEN
```
## Data Models
### User Model
```json
{
"id": 1,
"username": "john_doe",
"email": "john@example.com",
"full_name": "John Doe",
"role": "user",
"is_active": true,
"created_at": "2024-01-01T00:00:00",
"updated_at": null
}
```
### Product Model
```json
{
"id": 1,
"name": "MacBook Pro",
"description": "Apple MacBook Pro 16-inch with M2 chip",
"price": 2499.99,
"category": "electronics",
"in_stock": true,
"stock_quantity": 10,
"created_at": "2024-01-01T00:00:00",
"updated_at": null
}
```
## Error Handling
The API uses standard HTTP status codes:
- `200` - Success
- `201` - Created
- `400` - Bad Request
- `401` - Unauthorized
- `403` - Forbidden
- `404` - Not Found
- `422` - Validation Error
- `500` - Internal Server Error
Error responses follow this format:
```json
{
"detail": "Error message description"
}
```
## Development
### Running Tests
```bash
pytest
```
### Code Formatting
```bash
black app/ tests/
```
### Linting
```bash
flake8 app/ tests/
```
## Configuration
The application can be configured using environment variables or a `.env` file:
```env
# Application settings
APP_NAME=FastAPI Demo Server
DEBUG=true
# Security
SECRET_KEY=your-super-secret-key-change-this-in-production
ACCESS_TOKEN_EXPIRE_MINUTES=30
# CORS
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8080
```
## Production Deployment
For production deployment:
1. Set `DEBUG=false`
2. Use a strong `SECRET_KEY`
3. Configure proper CORS origins
4. Use a production WSGI server like Gunicorn
5. Set up a reverse proxy (nginx)
6. Use a proper database instead of in-memory storage
7. Implement proper logging and monitoring
### Docker Deployment (Example)
```dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY . /app
RUN pip install -e .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```
## API Testing with curl
### Complete workflow example:
```bash
# 1. Health check
curl http://localhost:8000/api/v1/misc/health
# 2. Login to get token
TOKEN=$(curl -X POST "http://localhost:8000/api/v1/auth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=admin123" | jq -r .access_token)
# 3. Get current user info
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:8000/api/v1/auth/me
# 4. List products
curl http://localhost:8000/api/v1/products/
# 5. Create a new product (admin only)
curl -X POST "http://localhost:8000/api/v1/products/" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "New Product",
"description": "A great product",
"price": 99.99,
"category": "electronics",
"stock_quantity": 5
}'
# 6. Upload a file
curl -X POST "http://localhost:8000/api/v1/upload/single" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@README.md"
```
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Run tests and linting
6. Submit a pull request
## License
This project is for demonstration purposes. Feel free to use it as a starting point for your FastAPI projects.
## Support
For questions or issues, please create an issue in the repository or refer to the [FastAPI documentation](https://fastapi.tiangolo.com/).