6.8 KiB
6.8 KiB
Pokedexter ⚡
Pokémon TCG-samlerwebapp — bygget med FastAPI, PostgreSQL, Nginx og Docker.
Administratorer opretter serier, kort og brugere. Brugere kan logge ind, browse og søge. Ingen åben registrering.
Arkitektur
Browser ──► Nginx (:8080) ──► FastAPI (:8000) ──► PostgreSQL (:5432)
▲ │
└─── static/ ───────┘
- Nginx — reverse proxy, serverer statiske filer
- FastAPI — async Python backend, Jinja2 templates
- PostgreSQL 16 — database med SQLAlchemy (async)
Kom i gang
Docker
docker compose up -d --build
Podman
./start.sh
Stop
./stop.sh # podman
docker compose down # docker
Data i pgdata-volumen bevares mellem genstarter.
Login
| Brugernavn | Adgangskode | Rolle |
|---|---|---|
admin |
admin123 |
Admin |
Brugeren oprettes automatisk ved første opstart. Skift adgangskoden efter første login.
Sådan bruges det
Opret en serie (set)
- Log ind på
/loginmedadmin/admin123 - Gå til Admin → Serier
- Indtast kode (f.eks.
CRI) og navn (f.eks.Chaos Rising) - Tryk Opret
Tilføj kort til en serie
- Gå til Admin → Serier
- Klik Vis kort på det ønskede sæt
- Udfyld kortets detaljer (nummer, navn, type, sjældenhed, HP, stadie)
- Tryk Tilføj kort
Eksempel:
| Felt | Værdi |
|---|---|
| Nummer | 068 |
| Navn | Chaos Dragon |
| Type | Dragon |
| Rarity | Rare |
| HP | 120 |
| Stadie | Basic |
Kortet får automatisk koden CRI-068.
Opret brugere (admin)
API — ingen HTML-side endnu:
curl -X POST http://localhost:8080/api/admin/users \
-H "Content-Type: application/json" \
-b "token=DIN_JWT_TOKEN" \
-d '{"username":"glenn","password":"hemmeligt","role":"user"}'
Browse kort
/sets— liste alle serier/sets/CRI— se alle kort i serieCRI/card/CRI-068— detaljer om et specifikt kort
Søg
/search?q=CRI-068— søg på fuld kortkode/search?q=dragon— søg på kortnavn
API-oversigt
Offentlige endpoints
| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | / |
Forside |
| GET | /sets |
Liste alle serier |
| GET | /sets/{code} |
Kort i en serie |
| GET | /search |
Søgeside |
| GET | /api/search |
Søg (JSON) |
| GET | /api/cards/{full_code} |
Enkelt kort (JSON) |
Auth endpoints
| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | /login |
Loginside |
| POST | /api/login |
Login (sætter cookie) |
| GET | /logout |
Logout |
Admin endpoints (kræver admin)
| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | /admin |
Admin dashboard |
| GET | /admin/sets |
Administrér serier |
| GET | /admin/cards/{code} |
Administrér kort i serie |
| POST | /api/admin/users |
Opret bruger |
| GET | /api/admin/users |
List brugere |
| POST | /api/admin/sets |
Opret serie |
| GET | /api/admin/sets |
List serier |
| DELETE | /api/admin/sets/{id} |
Slet serie |
| POST | /api/admin/sets/{code}/cards |
Opret kort |
| GET | /api/admin/sets/{code}/cards |
List kort i serie |
| DELETE | /api/admin/cards/{id} |
Slet kort |
Datamodel
User
id Integer (PK)
username String (unique)
password_hash String (bcrypt)
role String ("admin" | "user")
created_at DateTime
Set
id Integer (PK)
code String (unique) — "CRI"
name String — "Chaos Rising"
release_date String (optional)
description Text (optional)
created_at DateTime
cards ► Card[]
Card
id Integer (PK)
set_id Integer (FK → sets.id)
number String — "068"
name String — "Chaos Dragon"
type String — "Dragon", "Fire", ...
rarity String — "Common", "Uncommon", "Rare", ...
hp Integer
stage String — "Basic", "Stage 1", "Stage 2"
description Text
image_url String (optional)
set ► Set
full_code [property] — "CRI-068"
Miljøvariable
| Variabel | Standard | Beskrivelse |
|---|---|---|
DATABASE_URL |
postgresql+asyncpg://... |
PostgreSQL forbindelse |
SECRET_KEY |
skift-mig-til-en-sikker-noegle |
JWT signeringsnøgle |
Projektstruktur
pokedexter/
├── docker-compose.yml
├── start.sh # podman start
├── stop.sh # podman stop
├── backend/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app/
│ ├── main.py # FastAPI app, middleware
│ ├── database.py # async engine + session
│ ├── models.py # SQLAlchemy modeller
│ ├── auth.py # bcrypt + JWT
│ ├── routers/
│ │ ├── auth.py # login/logout + admin user mgmt
│ │ ├── admin.py # admin CRUD for sets/cards
│ │ └── cards.py # browse + search
│ ├── templates/ # Jinja2 HTML templates
│ └── static/ # CSS, JS, billeder
├── nginx/
│ ├── Dockerfile
│ └── nginx.conf
└── db/
└── init.sql
Udvikling
Genstart backend efter kodeændringer:
docker compose up -d --build backend
# eller med podman:
podman stop pokedexter-backend && podman rm pokedexter-backend
podman build -t pokedexter-backend ./backend
# ... og kør igen med podman run ...
Planlagte features
- Personlig mappe — brugere kan markere kort de ejer/samler
- Kortbilleder (upload eller URL)
- Filtrering på type, sjældenhed, HP
- Dark mode toggle gemt i localStorage (done)
- Mobilvenlig navigation (done)