2026-04-08 13:01:49 +02:00
|
|
|
|
# Coding Rules – Mitai Jinkendo
|
|
|
|
|
|
|
|
|
|
|
|
Diese Regeln IMMER befolgen. Sie basieren auf Erfahrungen aus der Entwicklung.
|
|
|
|
|
|
|
|
|
|
|
|
## Backend
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Auth auf jeden Endpoint
|
|
|
|
|
|
```python
|
|
|
|
|
|
# Jeder neue Endpoint braucht Auth:
|
|
|
|
|
|
@router.get("/neuer-endpoint")
|
|
|
|
|
|
def neuer_endpoint(session: dict = Depends(require_auth)):
|
|
|
|
|
|
pid = session['profile_id']
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Profile-ID aus Session – nie aus Header
|
|
|
|
|
|
```python
|
|
|
|
|
|
pid = session['profile_id'] # ✅
|
|
|
|
|
|
# Nicht: request.headers.get('X-Profile-Id') ❌
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. bcrypt für Passwörter
|
|
|
|
|
|
```python
|
|
|
|
|
|
from auth import hash_pin, verify_pin
|
|
|
|
|
|
hashed = hash_pin(plain_password) # ✅
|
|
|
|
|
|
# Nicht: hashlib.sha256(...) ❌
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 4. PostgreSQL-Syntax
|
|
|
|
|
|
```python
|
|
|
|
|
|
cur.execute("SELECT * FROM t WHERE id = %s AND active = true", (id,))
|
|
|
|
|
|
# Nicht: ? und active = 1 (SQLite-Syntax)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 5. Rate Limiting für sensitive Endpoints
|
|
|
|
|
|
```python
|
|
|
|
|
|
from slowapi import Limiter
|
|
|
|
|
|
@router.post("/sensitive")
|
|
|
|
|
|
@limiter.limit("5/minute")
|
|
|
|
|
|
def sensitive(request: Request, ...):
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-11 08:14:20 +02:00
|
|
|
|
### 6. Universal CSV Import / Admin-Vorlagen
|
|
|
|
|
|
Neues **Import-Zielmodul**, Änderungen an **`csv_parser`**, Executor, DB-`source`/`CHECK`, oder System-CSV-Vorlagen:
|
|
|
|
|
|
|
|
|
|
|
|
- Pflichtlektüre und Checkliste: **`.claude/docs/technical/UNIVERSAL_CSV_IMPORT_AGENT_GUIDE.md`**
|
|
|
|
|
|
- Keine zweite DB-Connection im Importpfad; Zeilenfehler ohne „aborted transaction“ (SAVEPOINT-Muster wo nötig)
|
|
|
|
|
|
- Admin Create/Update von Systemvorlagen: Validierung über `validate_csv_template` nicht umgehen
|
|
|
|
|
|
|
2026-04-08 13:01:49 +02:00
|
|
|
|
## Frontend
|
|
|
|
|
|
|
|
|
|
|
|
### 1. api.js für alle API-Calls
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
await api.listWeight() // ✅
|
|
|
|
|
|
await fetch('/api/weight') // ❌ kein Token
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Fehlerbehandlung in async Funktionen
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
try {
|
|
|
|
|
|
const data = await api.meinEndpoint()
|
|
|
|
|
|
} catch(e) {
|
|
|
|
|
|
setError(e.message) // api.js wirft bereits Error mit detail-Text
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. Kein TypeScript
|
|
|
|
|
|
Das Projekt nutzt bewusst kein TypeScript – keine .ts/.tsx Dateien erstellen.
|
|
|
|
|
|
|
|
|
|
|
|
### 4. Keine neuen npm-Pakete ohne Absprache
|
|
|
|
|
|
Erst fragen, dann installieren.
|
|
|
|
|
|
|
|
|
|
|
|
### 5. CSS-Variablen statt Hardcoded-Farben
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// ✅ Richtig:
|
|
|
|
|
|
style={{color: 'var(--accent)'}}
|
|
|
|
|
|
|
|
|
|
|
|
// ❌ Falsch:
|
|
|
|
|
|
style={{color: '#1D9E75'}}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Git & Deployment
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Nie direkt auf main pushen
|
|
|
|
|
|
Immer über Pull Request in Gitea: develop → main
|
|
|
|
|
|
|
|
|
|
|
|
### 2. develop Branch nie löschen
|
|
|
|
|
|
Er ist permanent – nicht nach Merge löschen.
|
|
|
|
|
|
|
|
|
|
|
|
### 3. .env nie committen
|
|
|
|
|
|
Steht in .gitignore – nie entfernen.
|
|
|
|
|
|
|
|
|
|
|
|
### 4. Commit-Message Format
|
|
|
|
|
|
```
|
|
|
|
|
|
feat: neues Feature
|
|
|
|
|
|
fix: Bugfix
|
|
|
|
|
|
refactor: Umbau ohne Funktionsänderung
|
|
|
|
|
|
docs: Dokumentation
|
|
|
|
|
|
ci: CI/CD Änderungen
|
|
|
|
|
|
chore: Maintenance
|
|
|
|
|
|
```
|