Files
rentman-clone/.a0/resume.md
T
Agent Zero 7f7da15965 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
2026-05-31 20:36:42 +00:00

242 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 (02)
| Phase | Tasks | Inhalt |
|-------|-------|--------|
| 0 Foundation | T001T003 | Projektstruktur, Docker Compose, FastAPI-Grundgerüst, React-Frontend mit Vite/Tailwind/Router/Zustand |
| 1 Auth-System | T004T008 | Account/User/Role-Modelle, JWT-Auth (Login/Register/Refresh), RBAC-Middleware, Admin-API für User & Roles, Login/Register/Admin-UI |
| 2 Contacts & Tags | T009T011 | 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:** T012T020 (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! 🚀**