190 lines
6.3 KiB
Markdown
190 lines
6.3 KiB
Markdown
|
|
# quiXzoom Shop — Status
|
|||
|
|
|
|||
|
|
## quiXzoom Field Program
|
|||
|
|
|
|||
|
|
| Nivå | Uppdrag | Krav | Förmåner |
|
|||
|
|
|------|---------|------|----------|
|
|||
|
|
| **Contributor** | 0–9 | Registrerad användare | Digital profil, digital verifiering |
|
|||
|
|
| **Field Contributor** | 10+ | 10 godkända uppdrag | 🔓 Field Gear Store (västar, jackor, utrustning) |
|
|||
|
|
| **Verified Field Contributor** | 100+ | 100 godkända uppdrag + 95% godkännandegrad + verifierad identitet + inga allvarliga policyöverträdelser | 🔓 Field ID Kit (personligt ID-kort, hållare, lanyard) + publik verifieringssida |
|
|||
|
|
|
|||
|
|
## ✅ Byggt och klart
|
|||
|
|
|
|||
|
|
### Backend (`quixzoom-shop/`)
|
|||
|
|
- **FastAPI** service på port 8087
|
|||
|
|
- **PostgreSQL** databas `quixzoom_shop`
|
|||
|
|
- **19 produkter** (18 Field Gear + 1 Field ID Kit)
|
|||
|
|
- **JWT-auth** för att verifiera Zoomers
|
|||
|
|
- **Tier-system** med mission-gating och kvalitetskrav
|
|||
|
|
- **Stripe-betalning** integrerad
|
|||
|
|
- **Publik verifieringssida** för ID-kort
|
|||
|
|
|
|||
|
|
### API Endpoints
|
|||
|
|
| Endpoint | Auth | Status |
|
|||
|
|
|----------|------|--------|
|
|||
|
|
| `GET /health` | Nej | ✅ |
|
|||
|
|
| `GET /api/products` | Nej (tier-filter) | ✅ |
|
|||
|
|
| `GET /api/products/{id}` | Nej | ✅ |
|
|||
|
|
| `GET /api/eligibility` | Ja | ✅ (legacy) |
|
|||
|
|
| `GET /api/tier` | Ja | ✅ |
|
|||
|
|
| `POST /api/orders` | Ja | ✅ |
|
|||
|
|
| `GET /api/orders` | Ja | ✅ |
|
|||
|
|
| `GET /api/orders/{id}` | Ja | ✅ |
|
|||
|
|
| `POST /api/payment/create-intent` | Ja | ✅ |
|
|||
|
|
| `POST /api/payment/webhook` | Stripe | ✅ |
|
|||
|
|
|
|||
|
|
### Webbsidor
|
|||
|
|
| Sida | Status |
|
|||
|
|
|------|--------|
|
|||
|
|
| `/` — Produktlista med kundvagn + tier-badge | ✅ |
|
|||
|
|
| `/product/{id}` — Produktdetalj | ✅ |
|
|||
|
|
| `/checkout` — Stripe-betalning | ✅ |
|
|||
|
|
| `/verify/{id}` — **Publik verifieringssida för ID-kort** | ✅ |
|
|||
|
|
|
|||
|
|
### Verifieringssida (`/verify/{contributor_id}`)
|
|||
|
|
- ✅ Sök på Contributor ID
|
|||
|
|
- ✅ Visar status (giltigt/ogiltigt)
|
|||
|
|
- ✅ Visar contributor-info (namn, initialer, stats)
|
|||
|
|
- ✅ Förklarar vad Verified Field Contributor innebär
|
|||
|
|
- ✅ Info för fastighetsägare och kommuner
|
|||
|
|
- ✅ QR-kod leder till denna sida
|
|||
|
|
|
|||
|
|
### App-integration
|
|||
|
|
- Ny **Shop-tab** (🛒) i bottom navigation
|
|||
|
|
- **ShopScreen.tsx** med tre tillstånd:
|
|||
|
|
- Contributor (0-9): Låsskärm med progress
|
|||
|
|
- Field Contributor (10+): WebView med shoppen + tier-banner
|
|||
|
|
- Verified Field Contributor (100+): WebView med shoppen + verified-banner
|
|||
|
|
- **Eligibility-check** via `/api/tier`
|
|||
|
|
- Token injectas via `localStorage`
|
|||
|
|
|
|||
|
|
### Betalningsflöde (Stripe)
|
|||
|
|
1. ✅ Kundvagn i localStorage
|
|||
|
|
2. ✅ Order skapas i backend
|
|||
|
|
3. ✅ Stripe PaymentIntent skapas
|
|||
|
|
4. ✅ Stripe Elements för kortinmatning
|
|||
|
|
5. ✅ Webhook för betalningsbekräftelse
|
|||
|
|
6. ✅ Order uppdateras till `paid`
|
|||
|
|
|
|||
|
|
## 🔄 Kvar att göra
|
|||
|
|
|
|||
|
|
### Produktion
|
|||
|
|
- [ ] Sätta upp nginx + SSL för `shop.quixzoom.com`
|
|||
|
|
- [ ] Konfigurera riktiga Stripe-nycklar
|
|||
|
|
- [ ] Sätta upp Stripe webhook endpoint
|
|||
|
|
- [ ] systemd service aktivera
|
|||
|
|
|
|||
|
|
### Produktbilder
|
|||
|
|
- [ ] Ladda upp riktiga bilder för alla 19 produkter
|
|||
|
|
- [ ] CDN eller S3 för bildhosting
|
|||
|
|
|
|||
|
|
### Orderhantering
|
|||
|
|
- [ ] Admin-panel för ordrar
|
|||
|
|
- [ ] Orderstatus-flöde (pending → paid → shipped → delivered)
|
|||
|
|
- [ ] Fraktintegration
|
|||
|
|
- [ ] E-postbekräftelser
|
|||
|
|
|
|||
|
|
### Field ID Kit
|
|||
|
|
- [ ] ID-kort design (namn, Contributor ID, QR-kod, giltighetsdatum)
|
|||
|
|
- [ ] QR-kod generering i appen/webben
|
|||
|
|
- [ ] Beställningsflöde för ID Kit (gratis för Verified)
|
|||
|
|
|
|||
|
|
## 🚀 Snabbstart produktion
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Kopiera service-filen
|
|||
|
|
sudo cp quixzoom-shop.service /etc/systemd/system/
|
|||
|
|
sudo systemctl daemon-reload
|
|||
|
|
sudo systemctl enable quixzoom-shop
|
|||
|
|
|
|||
|
|
# 2. Uppdatera Stripe-nycklar
|
|||
|
|
sudo systemctl edit --full quixzoom-shop
|
|||
|
|
# Ändra STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET
|
|||
|
|
|
|||
|
|
# 3. Starta
|
|||
|
|
sudo systemctl start quixzoom-shop
|
|||
|
|
|
|||
|
|
# 4. Nginx-konfiguration
|
|||
|
|
sudo cp nginx-shop.conf /etc/nginx/conf.d/
|
|||
|
|
sudo nginx -s reload
|
|||
|
|
|
|||
|
|
# 5. SSL (Let's Encrypt)
|
|||
|
|
sudo certbot --nginx -d shop.quixzoom.com
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 Produkter
|
|||
|
|
|
|||
|
|
### Field Gear Store (10+ uppdrag)
|
|||
|
|
|
|||
|
|
| SKU | Namn | Pris (kr) | Kategori |
|
|||
|
|
|-----|------|-----------|----------|
|
|||
|
|
| VEST-001 | Field Vest | 1 299 | kläder |
|
|||
|
|
| JACKET-001 | Mission Shell | 2 499 | kläder |
|
|||
|
|
| PANTS-001 | Field Pants | 1 799 | kläder |
|
|||
|
|
| BASE-001 | Base Layer | 899 | kläder |
|
|||
|
|
| BEANIE-001 | Field Beanie | 499 | accessoarer |
|
|||
|
|
| GLOVES-001 | Field Gloves | 799 | accessoarer |
|
|||
|
|
| STRAP-001 | Capture Strap | 599 | utrustning |
|
|||
|
|
| POUCH-001 | Utility Pouch | 699 | utrustning |
|
|||
|
|
| COIN-001 | Ref. Coin | 199 | accessoarer |
|
|||
|
|
| LIGHT-001 | Pocket Light | 399 | utrustning |
|
|||
|
|
| POWER-001 | Power Module | 1 499 | utrustning |
|
|||
|
|
| CABLE-001 | Cable Kit | 599 | utrustning |
|
|||
|
|
| RAIN-001 | Rain Cover | 799 | utrustning |
|
|||
|
|
| BAG-001 | Field Bag | 1 999 | utrustning |
|
|||
|
|
| BELT-001 | Tactical Belt | 899 | accessoarer |
|
|||
|
|
| SOCKS-001 | Field Socks | 399 | kläder |
|
|||
|
|
| PATCH-001 | quiXzoom Patch | 299 | accessoarer |
|
|||
|
|
| BOTTLE-001 | Field Bottle | 699 | utrustning |
|
|||
|
|
|
|||
|
|
### Verified Field ID Kit (100+ uppdrag, 95% approval)
|
|||
|
|
|
|||
|
|
| SKU | Namn | Pris | Kategori |
|
|||
|
|
|-----|------|------|----------|
|
|||
|
|
| ID-KIT-001 | Field ID Kit | Gratis | verified |
|
|||
|
|
|
|||
|
|
Innehåll:
|
|||
|
|
- Personligt verifierat ID-kort
|
|||
|
|
- ID-hållare
|
|||
|
|
- Lanyard
|
|||
|
|
- Digital verifieringsmärke
|
|||
|
|
- Publik verifieringssida via QR-kod
|
|||
|
|
|
|||
|
|
## 🔒 Säkerhet
|
|||
|
|
|
|||
|
|
- JWT-token valideras på varje order-request
|
|||
|
|
- Mission-count + approval rate + identity + violations hämtas från databas
|
|||
|
|
- SQL-injection skyddad via asyncpg parameteriserade queries
|
|||
|
|
- Stock-koll innan order skapas (transaction)
|
|||
|
|
- Stripe webhook signerad och verifierad
|
|||
|
|
- Verifieringssida visar endast publik info (ingen känslig data)
|
|||
|
|
|
|||
|
|
## 📁 Filer
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
quixzoom-shop/
|
|||
|
|
├── main.py # FastAPI backend
|
|||
|
|
├── requirements.txt # Python dependencies
|
|||
|
|
├── Dockerfile # Docker image
|
|||
|
|
├── docker-compose.yml # Docker Compose
|
|||
|
|
├── nginx-shop.conf # Nginx reverse proxy
|
|||
|
|
├── quixzoom-shop.service # systemd service
|
|||
|
|
├── README.md # Översikt
|
|||
|
|
├── STRIPE_SETUP.md # Stripe konfiguration
|
|||
|
|
├── SHOP_STATUS.md # Denna fil
|
|||
|
|
├── templates/
|
|||
|
|
│ ├── shop.html # Produktlista med tier-badge
|
|||
|
|
│ ├── product.html # Produktdetalj
|
|||
|
|
│ ├── checkout.html # Stripe-betalning
|
|||
|
|
│ └── verify.html # Publik verifieringssida
|
|||
|
|
└── static/ # Bilder, CSS, JS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔗 URL:er
|
|||
|
|
|
|||
|
|
| Miljö | URL |
|
|||
|
|
|-------|-----|
|
|||
|
|
| Lokal dev | `http://localhost:8087` |
|
|||
|
|
| Produktion | `https://shop.quixzoom.com` |
|
|||
|
|
| Verifiering | `https://shop.quixzoom.com/verify/{contributor_id}` |
|