Initial commit: Beisel Rallye Graz Project with full documentation
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
# Entwicklungshandbuch: Beisel Rallye 🍺
|
||||
|
||||
## Schnellstart
|
||||
|
||||
### Voraussetzungen
|
||||
- Node.js v18+
|
||||
- npm oder yarn
|
||||
- SQLite3 (wird via npm installiert)
|
||||
|
||||
### Setup
|
||||
```bash
|
||||
# In das Projektverzeichnis wechseln
|
||||
cd /home/claw/.openclaw/agents/wisp/workspace/beisel-rally
|
||||
|
||||
# Abhängigkeiten installieren
|
||||
npm install
|
||||
|
||||
# Server starten
|
||||
node index.js
|
||||
|
||||
# Server läuft auf http://localhost:8083
|
||||
```
|
||||
|
||||
## Code-Struktur
|
||||
|
||||
### Wichtige Dateien
|
||||
- `index.js` - Hauptserver mit Express App
|
||||
- `views/index.ejs` - Frontend Template
|
||||
- `public/css/style.css` - Styling
|
||||
- `beisel_rally.db` - SQLite Datenbank
|
||||
- `package.json` - Dependencies und Scripts
|
||||
|
||||
### Entwicklungs-Wiederholungszyklus
|
||||
1. Code ändern
|
||||
2. Server neu starten (`Ctrl+C`, dann `node index.js`)
|
||||
3. Im Browser testen (Cache leeren!)
|
||||
4. Git commit (wenn fertig)
|
||||
|
||||
## Wichtige Konzepte
|
||||
|
||||
### Express Middleware
|
||||
```javascript
|
||||
// Body Parser für JSON Requests
|
||||
app.use(express.json());
|
||||
|
||||
// Statische Dateien servieren
|
||||
app.use(express.static('public'));
|
||||
|
||||
// Custom Middleware (z.B. Logging)
|
||||
app.use((req, res, next) => {
|
||||
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
|
||||
next();
|
||||
});
|
||||
```
|
||||
|
||||
### SQLite Operationen
|
||||
```javascript
|
||||
const sqlite3 = require('sqlite3').verbose();
|
||||
const db = new sqlite3.Database('./beisel_rally.db');
|
||||
|
||||
// Query ausführen
|
||||
db.run("INSERT INTO rally_logs (user_name, district) VALUES (?, ?)",
|
||||
["Gregor", "I. Innere Stadt"], function(err) {
|
||||
if (err) {
|
||||
console.error('Insert fehlgeschlagen:', err);
|
||||
return;
|
||||
}
|
||||
console.log('Erfolgreich eingefügt, ID:', this.lastID);
|
||||
});
|
||||
|
||||
// Daten abrufen
|
||||
db.all("SELECT * FROM rally_logs WHERE user_name = ?", ["Gregor"], (err, rows) => {
|
||||
if (err) {
|
||||
console.error('Query fehlgeschlagen:', err);
|
||||
return;
|
||||
}
|
||||
console.log(rows);
|
||||
});
|
||||
```
|
||||
|
||||
### Fehlerbehandlung
|
||||
```javascript
|
||||
// Try-Catch für async Operationen
|
||||
try {
|
||||
const result = await someAsyncOperation();
|
||||
res.json({ success: true, data: result });
|
||||
} catch (error) {
|
||||
console.error('Fehler:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: 'Interner Serverfehler'
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Manuelles Testen
|
||||
1. Server starten
|
||||
2. Browser öffnen: `http://localhost:8083`
|
||||
3. API Endpunkte testen mit curl oder Postman:
|
||||
```bash
|
||||
# New Visit testen
|
||||
curl -X POST http://localhost:8083/api/visit \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"user_name":"Gregor","district":"I. Innere Stadt","beisel_name":"Test"}'
|
||||
|
||||
# Status abrufen
|
||||
curl http://localhost:8083/api/status/Gregor
|
||||
```
|
||||
|
||||
### Datenbank-Checks
|
||||
```bash
|
||||
# SQLite CLI starten
|
||||
sqlite3 beisel_rally.db
|
||||
|
||||
# Alle Einträge anzeigen
|
||||
SELECT * FROM rally_logs;
|
||||
|
||||
# Statistik pro User
|
||||
SELECT user_name, COUNT(*) as visits FROM rally_logs GROUP BY user_name;
|
||||
```
|
||||
|
||||
## Debugging
|
||||
|
||||
### Häufige Probleme
|
||||
|
||||
**Server startet nicht:**
|
||||
- Port 8083 ist belegt? → `lsof -i :8083` und Prozess killen
|
||||
- Node.js Version zu alt? → `node --version` (braucht v18+)
|
||||
|
||||
**Datenbank Fehler:**
|
||||
- Datei nicht gefunden? → Prüfen ob `beisel_rally.db` existiert
|
||||
- Permission denied? → `chmod 664 beisel_rally.db` und Gruppe prüfen
|
||||
|
||||
**Frontend lädt nicht:**
|
||||
- Cache geleert? → Hard Reload (Ctrl+Shift+R)
|
||||
- CORS Fehler? → Server Logs checken
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Code-Qualität
|
||||
- **ESLint** für JavaScript Linting
|
||||
- **Prettier** für konsistentes Formatting
|
||||
- **Git Commits** mit klaren Nachrichten
|
||||
- **Comments** erklären das "Warum", nicht das "Was"
|
||||
|
||||
### Sicherheit
|
||||
- **Input Validation** auf allen Endpunkten
|
||||
- **Parameterisierte Queries** gegen SQL Injection
|
||||
- **Rate Limiting** für API Endpunkte
|
||||
- **HTTPS** erzwingen (bereits durch Nginx gegeben)
|
||||
|
||||
### Performance
|
||||
- **Datenbank-Verbindungen** schließen wenn nicht benötigt
|
||||
- **Caching** für statische Daten (Bezirke, Beiseln)
|
||||
- **Pagination** bei großen Datensätzen
|
||||
- **Lazy Loading** für komplexe Views
|
||||
|
||||
## Deployment Checklist
|
||||
|
||||
Vor dem Deployen prüfen:
|
||||
- [ ] Alle Tests bestanden
|
||||
- [ ] Datenbank-Schema aktuell
|
||||
- [ ] Environment-Variablen gesetzt (falls nötig)
|
||||
- [ ] Logging konfiguriert
|
||||
- [ ] Backup-Mechanismus vorhanden
|
||||
- [ ] Monitoring/Alerting eingerichtet
|
||||
|
||||
## Ressourcen
|
||||
|
||||
### Offizielle Dokumentation
|
||||
- [Express.js](https://expressjs.com/)
|
||||
- [SQLite3 Node.js](https://github.com/TryGhost/node-sqlite3)
|
||||
- [Nginx Documentation](https://nginx.org/en/docs/)
|
||||
|
||||
### Lokale Hilfe
|
||||
- `PROJECT.md` - Projektübersicht
|
||||
- `API_DESIGN.md` - API Spezifikation
|
||||
- `ARCHITECTURE.md` - System-Architektur
|
||||
|
||||
---
|
||||
*Stand: 2026-06-29 | Version: 1.0*
|
||||
Reference in New Issue
Block a user