94 lines
2.1 KiB
Markdown
94 lines
2.1 KiB
Markdown
|
|
# 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, ...):
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 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
|
|||
|
|
```
|