256 lines
No EOL
5.6 KiB
Markdown
256 lines
No EOL
5.6 KiB
Markdown
# TschunkOrder
|
|
|
|
A modern web application for managing drink orders, specifically designed for Tschunk beverages. The application provides a real-time ordering system with a Vue.js frontend and FastAPI backend, featuring WebSocket support for live updates and Prometheus metrics for monitoring.
|
|
|
|
## Purpose
|
|
|
|
TschunkOrder is a full-stack application that allows users to:
|
|
- Create and manage drink orders in real-time
|
|
- Choose from various Tschunk variants (Tschunk, Tschunk Hannover-Mische, Tschunk alkoholfreier Rum, Virgin Tschunk)
|
|
- Select between Flora Mate and Club Mate
|
|
- Add custom notes and special requests
|
|
- View order statistics and metrics
|
|
- Receive live updates via WebSocket connections
|
|
|
|
## Quick Start with Docker
|
|
|
|
The easiest way to run the application is using the provided Docker Compose setup:
|
|
|
|
```bash
|
|
# Clone the repository (if not already done)
|
|
git clone ssh://gogs@git.hannover.ccc.de:3071/clarity/tschunkorder.git
|
|
cd tschunkorder
|
|
|
|
# Start all services
|
|
docker-compose up -d
|
|
|
|
# Access the application
|
|
# Frontend: http://[url]
|
|
# API Documentation: http://[url]/api/docs
|
|
# Prometheus Metrics: http://[url]/metrics
|
|
```
|
|
|
|
The Docker setup includes:
|
|
- **Frontend**: Vue.js application served on port 80
|
|
- **Backend**: FastAPI server with WebSocket support
|
|
- **Nginx**: Reverse proxy with rate limiting and security headers
|
|
|
|
## Development Environment Setup
|
|
|
|
### Backend Development
|
|
|
|
**Prerequisites:**
|
|
- Python 3.8+
|
|
- pip
|
|
|
|
**Setup:**
|
|
```bash
|
|
cd backend
|
|
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
|
|
# Activate virtual environment
|
|
# Linux/macOS:
|
|
source venv/bin/activate
|
|
# Windows:
|
|
# venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Run the development server
|
|
python main.py
|
|
# or
|
|
uvicorn main:app --reload
|
|
```
|
|
|
|
The backend will be available at `http://localhost:8000`
|
|
|
|
### Frontend Development
|
|
|
|
**Prerequisites:**
|
|
- Node.js 18+
|
|
- npm
|
|
|
|
**Setup:**
|
|
```bash
|
|
cd frontend
|
|
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Start development server
|
|
npm run dev
|
|
```
|
|
|
|
The frontend will be available at `http://localhost:5173`
|
|
|
|
**Available Scripts:**
|
|
- `npm run dev` - Start development server
|
|
- `npm run build` - Build for production
|
|
- `npm run preview` - Preview production build
|
|
- `npm run lint` - Run ESLint
|
|
- `npm run type-check` - Check TypeScript types
|
|
|
|
## API Description
|
|
|
|
The backend provides a RESTful API with WebSocket support for real-time updates.
|
|
|
|
### Base URL
|
|
- Development: `http://[url]:8000`
|
|
- Production: `http://[url]/api` (when setup via docker)
|
|
|
|
### REST Endpoints
|
|
|
|
#### Create Order
|
|
```http
|
|
POST /api/orders
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"drinks": [
|
|
{
|
|
"drink_type": "Tschunk",
|
|
"mate_type": "Club Mate",
|
|
"quantity": 2,
|
|
"notes": "Extra cold please"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Get All Orders
|
|
```http
|
|
GET /api/orders
|
|
```
|
|
|
|
#### Delete Order
|
|
```http
|
|
DELETE /api/orders/{order_id}
|
|
```
|
|
|
|
#### Get Available Drinks
|
|
```http
|
|
GET /api/drinks
|
|
```
|
|
|
|
#### Get Drink Statistics
|
|
```http
|
|
GET /api/stats/drinks
|
|
```
|
|
|
|
### WebSocket Endpoint
|
|
|
|
**Connection:** `ws://[url]:8000/api/ws` (development) or `ws://[url]/api/ws` (production)
|
|
|
|
**Message Types:**
|
|
|
|
1. **Create Order:**
|
|
```json
|
|
{
|
|
"type": "create_order",
|
|
"drinks": [...]
|
|
}
|
|
```
|
|
|
|
2. **Get All Orders:**
|
|
```json
|
|
{
|
|
"type": "get_all_orders"
|
|
}
|
|
```
|
|
|
|
3. **Delete Order:**
|
|
```json
|
|
{
|
|
"type": "delete_order",
|
|
"order_id": "uuid"
|
|
}
|
|
```
|
|
|
|
4. **Ping/Pong:**
|
|
```json
|
|
{
|
|
"type": "ping"
|
|
}
|
|
```
|
|
|
|
**Received Messages:**
|
|
|
|
- `order_created` - New order created
|
|
- `order_deleted` - Order deleted
|
|
- `all_orders` - All current orders
|
|
- `pong` - Response to ping
|
|
|
|
### Available Drink Types
|
|
- Tschunk
|
|
- Tschunk Hannover-Mische
|
|
- Tschunk alkoholfreier Rum
|
|
- Virgin Tschunk
|
|
|
|
### Available Mate Types
|
|
- Flora Mate
|
|
- Club Mate
|
|
|
|
## Prometheus Metrics
|
|
|
|
The application exposes Prometheus metrics at `/metrics` endpoint for monitoring drink sales and application performance.
|
|
|
|
### Available Metrics
|
|
|
|
#### `tschunk_drinks_sold_total`
|
|
- **Type:** Counter
|
|
- **Labels:** `drink_type`, `mate_type`
|
|
- **Description:** Total number of drinks sold by type and mate variety
|
|
|
|
**Example:**
|
|
```
|
|
# HELP tschunk_drinks_sold_total Total number of drinks sold
|
|
# TYPE tschunk_drinks_sold_total counter
|
|
tschunk_drinks_sold_total{drink_type="Tschunk",mate_type="Club Mate"} 15
|
|
tschunk_drinks_sold_total{drink_type="Virgin Tschunk",mate_type="Flora Mate"} 8
|
|
```
|
|
|
|
### Metrics Persistence
|
|
|
|
- Metrics are persisted to `drink_stats.json` in the backend directory
|
|
- Counters are restored on application restart
|
|
- Data survives container restarts when using Docker volumes
|
|
|
|
### Monitoring Integration
|
|
|
|
The metrics endpoint can be scraped by:
|
|
- Prometheus server
|
|
- Grafana dashboards
|
|
- Other monitoring tools
|
|
|
|
**Example Prometheus configuration:**
|
|
```yaml
|
|
scrape_configs:
|
|
- job_name: 'tschunkorder'
|
|
static_configs:
|
|
- targets: ['http://url']
|
|
metrics_path: '/metrics'
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
tschunkorder/
|
|
├── backend/ # FastAPI backend
|
|
│ ├── main.py # Main application entry point
|
|
│ ├── models.py # Pydantic models
|
|
│ ├── database.py # In-memory database
|
|
│ ├── websocket_manager.py # WebSocket connection management
|
|
│ ├── prometheus_metrics.py # Prometheus metrics
|
|
│ └── requirements.txt # Python dependencies
|
|
├── frontend/ # Vue.js frontend
|
|
│ ├── src/ # Source code
|
|
│ ├── package.json # Node.js dependencies
|
|
│ └── vite.config.ts # Vite configuration
|
|
├── nginx/ # Nginx configuration
|
|
│ ├── nginx.conf # Main nginx config
|
|
│ └── conf.d/ # Server configurations
|
|
└── docker-compose.yml # Docker orchestration
|
|
``` |