Initial commit: Rentman Clone - Phase 0-6 (T001-T023)
Completed: - Phase 0: Project Setup (T001-T003) - Docker Compose, FastAPI skeleton, React SPA - Phase 1: Auth System (T004-T008) - DB models, JWT auth, RBAC middleware, user management - Phase 2: Contacts & Tags (T009-T011) - CRUD API + UI - Phase 3: Equipment Catalog (T012-T014) - Models, API, UI with barcode/QR - Phase 4: Crew Management (T015-T017) - Models, availability, UI - Phase 5: Vehicle Fleet (T018-T020) - Models, assignments, UI - Phase 6: Projects (T021-T023) - Project hierarchy models, CRUD API, list/detail UI
This commit is contained in:
+241
@@ -0,0 +1,241 @@
|
||||
# Resume – Rentman Clone (abgeschlossener Stand)
|
||||
|
||||
> **Letzte Aktualisierung:** 2026-05-31 13:10
|
||||
> **Zuständiger Agent:** A0 Software Orchestrator
|
||||
> **Nächster Agent kann nahtlos fortfahren.**
|
||||
|
||||
---
|
||||
|
||||
## Projektübersicht
|
||||
**Ziel:** Vollständiger Nachbau von Rentman.io (Cloud-basierte Vermietungs- und Event-Management-Plattform) mit ≥90 % Funktionsumfang.
|
||||
**Ansatz:** Projektzentrisch – jedes Modul gehört zu einem Projekt.
|
||||
**Status:** Implementierungsphase (plan_mode: implementation_allowed).
|
||||
|
||||
---
|
||||
|
||||
## Bisheriger Fortschritt
|
||||
|
||||
### ✅ Abgeschlossene Phasen (0–2)
|
||||
| Phase | Tasks | Inhalt |
|
||||
|-------|-------|--------|
|
||||
| 0 – Foundation | T001–T003 | Projektstruktur, Docker Compose, FastAPI-Grundgerüst, React-Frontend mit Vite/Tailwind/Router/Zustand |
|
||||
| 1 – Auth-System | T004–T008 | Account/User/Role-Modelle, JWT-Auth (Login/Register/Refresh), RBAC-Middleware, Admin-API für User & Roles, Login/Register/Admin-UI |
|
||||
| 2 – Contacts & Tags | T009–T011 | Contact- und Tag-Modelle mit M2M, CRUD-API für Contacts (mit Suche, Typfilter, Tags), Tags-API, Contacts-UI (Liste, Formular, Detailseite) |
|
||||
|
||||
### 🔜 Nächste Phase (3) – Equipment Catalog
|
||||
| Task | Beschreibung |
|
||||
|------|-------------|
|
||||
| T012 | Datenbankmodelle: Equipment, StockLocation, EquipmentGroup (M2M) |
|
||||
| T013 | Equipment-CRUD-API mit Suche, Filter, Barcode/QR-Generierung, CSV-Import/Export |
|
||||
| T014 | Equipment-UI: Liste (Grid/Table-Toggle), Detailseite, Formular, Barcode-Druck |
|
||||
|
||||
**Offene Tasks:** T012–T020 (Equipment, Crew, Vehicles), T021+ (Projektmanagement), Finanzen, Scheduling, Reporting, PWA etc. (siehe `todo.md` und `task_graph.json`).
|
||||
|
||||
---
|
||||
|
||||
## Technologie-Stack
|
||||
|
||||
### Backend (`/backend`)
|
||||
- **Framework:** FastAPI (Python 3.12+, async)
|
||||
- **ORM:** SQLAlchemy 2.0 (async engine mit aiosqlite für Dev)
|
||||
- **Migrationen:** Alembic (render_as_batch für SQLite)
|
||||
- **Auth:** JWT (python-jose) + Passwort-Hashing (passlib bcrypt)
|
||||
- **Config:** Pydantic Settings (`.env` / `.env.example`)
|
||||
- **Datenbank:** SQLite (`backend/data/rentman.db`) für Dev, PostgreSQL 16 für Prod geplant
|
||||
- **Task Queue:** Celery + Redis (später)
|
||||
- **Datei-Storage:** MinIO (Docker)
|
||||
|
||||
### Frontend (`/frontend`)
|
||||
- **Framework:** React 19 + TypeScript
|
||||
- **Build:** Vite
|
||||
- **Styling:** Tailwind CSS 4 + Radix UI Primitives
|
||||
- **State Management:** Zustand (Auth-Store) + TanStack React Query (API-Daten)
|
||||
- **Routing:** React Router 7
|
||||
- **HTTP-Client:** Axios mit Interceptor (Access-Token, Auto-Refresh)
|
||||
- **Icons:** Lucide React
|
||||
|
||||
### Infrastruktur
|
||||
- **Docker Compose:** Services: backend, frontend, redis, minio
|
||||
- **Makefile:** Befehle: `dev`, `backend-dev`, `frontend-dev`, `migrate`, etc.
|
||||
|
||||
---
|
||||
|
||||
## Projektstruktur
|
||||
```
|
||||
rentman-clone/
|
||||
├── backend/
|
||||
│ ├── app/
|
||||
│ │ ├── main.py # FastAPI-App, Lifespan, CORS
|
||||
│ │ ├── core/
|
||||
│ │ │ ├── config.py # Settings
|
||||
│ │ │ └── security.py # JWT + bcrypt
|
||||
│ │ ├── db/
|
||||
│ │ │ ├── base.py # SQLAlchemy Base
|
||||
│ │ │ └── session.py # AsyncEngine + Session
|
||||
│ │ ├── models/ # SQLAlchemy-Modelle
|
||||
│ │ │ ├── account.py
|
||||
│ │ │ ├── user.py
|
||||
│ │ │ ├── role.py
|
||||
│ │ │ ├── contact.py # + Tag M2M
|
||||
│ │ │ └── tag.py
|
||||
│ │ ├── schemas/ # Pydantic-Schemas
|
||||
│ │ │ ├── auth.py
|
||||
│ │ │ ├── user.py
|
||||
│ │ │ ├── role.py
|
||||
│ │ │ └── contact.py
|
||||
│ │ ├── api/v1/
|
||||
│ │ │ ├── router.py # Registriert alle Sub-Router
|
||||
│ │ │ ├── health.py
|
||||
│ │ │ ├── auth.py
|
||||
│ │ │ ├── users.py
|
||||
│ │ │ ├── roles.py
|
||||
│ │ │ ├── contacts.py
|
||||
│ │ │ └── tags.py
|
||||
│ │ └── api/deps.py # Dependency: get_current_user, require_permission
|
||||
│ ├── alembic/
|
||||
│ │ ├── env.py # Async + Batch
|
||||
│ │ └── versions/ # Migrationen
|
||||
│ ├── data/ # SQLite-DB
|
||||
│ ├── requirements.txt
|
||||
│ ├── Dockerfile
|
||||
│ └── .env.example
|
||||
├── frontend/
|
||||
│ ├── src/
|
||||
│ │ ├── main.tsx # Einstieg, QueryClient, Router
|
||||
│ │ ├── App.tsx # Routing
|
||||
│ │ ├── components/
|
||||
│ │ │ ├── AppLayout.tsx # Sidebar, Header, Navigation
|
||||
│ │ │ ├── ProtectedRoute.tsx
|
||||
│ │ │ └── ContactForm.tsx
|
||||
│ │ ├── pages/
|
||||
│ │ │ ├── Home.tsx
|
||||
│ │ │ ├── Login.tsx
|
||||
│ │ │ ├── Register.tsx
|
||||
│ │ │ ├── Dashboard.tsx
|
||||
│ │ │ ├── Users.tsx # Admin
|
||||
│ │ │ ├── Roles.tsx # Admin
|
||||
│ │ │ ├── Contacts.tsx
|
||||
│ │ │ ├── ContactsNew.tsx
|
||||
│ │ │ ├── ContactsEdit.tsx
|
||||
│ │ │ └── ContactDetail.tsx
|
||||
│ │ ├── services/
|
||||
│ │ │ └── api.ts # Axios-Client mit Token-Interceptor
|
||||
│ │ ├── stores/
|
||||
│ │ │ └── authStore.ts # Zustand Auth-Store (persistiert)
|
||||
│ │ └── lib/
|
||||
│ │ └── utils.ts # cn()-Funktion
|
||||
│ ├── package.json
|
||||
│ ├── vite.config.ts
|
||||
│ └── Dockerfile
|
||||
├── docker-compose.yml
|
||||
├── Makefile
|
||||
├── README.md
|
||||
└── .a0/ # Orchestrator-Artefakte
|
||||
├── project_state.json
|
||||
├── requirements.md
|
||||
├── architecture.md
|
||||
├── design.md
|
||||
├── task_graph.json
|
||||
├── decisions.md
|
||||
├── todo.md
|
||||
├── worklog.md
|
||||
├── current_status.md
|
||||
├── next_steps.md
|
||||
├── known_errors.md
|
||||
└── resume.md ← DIESE DATEI
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Wichtige Code-Patterns & Konventionen
|
||||
|
||||
### Backend
|
||||
1. **Model → Schema → Router → Frontend:** Dieses Pattern für jedes neue Modul verwenden.
|
||||
2. **Tenant-Isolation:** Alle Datenbankabfragen müssen `account_id`-Filter enthalten. Der aktuelle User wird aus der JWT extrahiert (`get_current_user`) und liefert `current_user.account_id`.
|
||||
3. **RBAC:** Jeder Endpunkt mit `require_permission("<resource>:<action>")` schützen. Vorhandene Permissions: `users:read/write/delete`, `roles:read/write`, `contacts:read/write/delete`, `tags:read/write`, `equipment:*` (noch zu vergeben).
|
||||
4. **UUIDs:** Alle Primärschlüssel sind UUIDs (Python `uuid.uuid4()`).
|
||||
5. **Migrationen:** Mit `alembic revision --autogenerate` erstellen, `render_as_batch=True` in env.py beachten. Nach Erstellung im `versions/`-Ordner manuell anpassen.
|
||||
6. **API-Paginierung:** Standard: `limit` und `offset` als Query-Parameter, Antwort mit `items`-Array und `total`-Count.
|
||||
|
||||
### Frontend
|
||||
1. **Auth-Store:** `authStore` enthält `token`, `user`, `isAuthenticated`. Bei Login/Refresh gespeichert, bei Logout gelöscht.
|
||||
2. **API-Client:** `services/api.ts` Axios-Instanz mit `baseURL`, Access-Token-Interceptor (fügt `Authorization`-Header hinzu) und 401-Auto-Refresh (ruft `/auth/refresh` auf).
|
||||
3. **Protected Route:** `<ProtectedRoute permission="...">` kapselt Zugriffsschutz. Umleitet auf `/login` wenn nicht authentifiziert, zeigt Fehler wenn Permission fehlt.
|
||||
4. **React Query:** Für Datenabrufe `useQuery`, für Mutationen `useMutation` verwenden (z.B. `useMutation({ mutationFn: ... })`).
|
||||
5. **Tailwind:** Utility-Klassen verwenden, keine eigenen CSS-Dateien. Theme-Farben im `index.css` definiert.
|
||||
6. **Neue Seiten:** In `App.tsx` Route hinzufügen, ggf. mit ProtectedRoute. Sidebar-Links in `AppLayout.tsx` ergänzen.
|
||||
|
||||
---
|
||||
|
||||
## Startanweisungen
|
||||
|
||||
### Voraussetzungen
|
||||
- Docker und Docker Compose installiert
|
||||
- Python 3.12+, Node.js 22+
|
||||
|
||||
### Entwicklung starten
|
||||
```bash
|
||||
cd /a0/usr/workdir/dev-projects/rentman-clone
|
||||
|
||||
# Abhängigkeiten installieren
|
||||
make install-backend # pip install -r backend/requirements.txt
|
||||
make install-frontend # npm install
|
||||
|
||||
# Backend starten (uvicorn auf Port 8000)
|
||||
make backend-dev
|
||||
|
||||
# Frontend starten (Vite auf Port 5173)
|
||||
make frontend-dev
|
||||
|
||||
# Oder alles mit Docker:
|
||||
docker compose up
|
||||
```
|
||||
|
||||
### Datenbank-Migrationen
|
||||
```bash
|
||||
cd backend
|
||||
# Neue Migration erzeugen
|
||||
alembic revision --autogenerate -m "beschreibung"
|
||||
# Migration anwenden
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
### API testen
|
||||
```bash
|
||||
# Registrierung
|
||||
curl -X POST http://localhost:8000/api/v1/auth/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"account_name":"Testfirma", "full_name":"Admin", "email":"admin@test.de", "password":"test123"}'
|
||||
|
||||
# Login
|
||||
curl -X POST http://localhost:8000/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"admin@test.de", "password":"test123"}'
|
||||
|
||||
# Mit Token
|
||||
curl http://localhost:8000/api/v1/auth/me \
|
||||
-H "Authorization: Bearer <access_token>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Offene Punkte & Bekannte Einschränkungen
|
||||
|
||||
- **Keine automatischen Tests** vorhanden (später hinzufügen).
|
||||
- **SQLite-Spezifika:** Einige PostgreSQL-Features (z.B. JSON-Felder in SQLite als Text) müssen bei Migration beachtet werden.
|
||||
- **Image-Upload:** Noch nicht implementiert (Equipment-Bilder, Logos).
|
||||
- **Frontend-Seiten** für Equipment, Crew, Vehicles, Projects, Finanzen etc. fehlen noch.
|
||||
- **Auth-Flows** wie Passwort-Reset und E-Mail-Verifikation fehlen.
|
||||
- **Internationalisierung** (i18n) nicht begonnen (DE+EN geplant).
|
||||
|
||||
---
|
||||
|
||||
## Nächste Aktion für neuen Agenten
|
||||
1. **.a0/resume.md** (diese Datei) lesen, dann **.a0/project_state.json**, **.a0/task_graph.json**, **.a0/next_steps.md** und **.a0/requirements.md**.
|
||||
2. **Plan Mode** prüfen: ist `implementation_allowed`.
|
||||
3. **Phase 3 starten** mit Task **T012**: Equipment-Datenbankmodelle (models/equipment.py, StockLocation, EquipmentGroup), wie in `design.md` und `architecture.md` beschrieben.
|
||||
4. Anschließend T013 (API) und T014 (UI).
|
||||
5. Bei Problemen `known_errors.md` prüfen und ggf. erweitern.
|
||||
6. Alle Änderungen in `.a0/`-Dateien dokumentieren (worklog, todo, current_status, next_steps).
|
||||
|
||||
**Viel Erfolg! 🚀**
|
||||
Reference in New Issue
Block a user