Járműkezelés majdnem kész frontend
This commit is contained in:
92
plans/logic_spec_fix_double_prefix_and_4level_arch.md
Normal file
92
plans/logic_spec_fix_double_prefix_and_4level_arch.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 📐 Logic Spec: Fix Double API Prefix & Execute 4-Level Architecture
|
||||
|
||||
## 1. Modul célja és Masterbook 2 illeszkedés
|
||||
|
||||
**Cél:** A frontend járművek lekérésének javítása (Double API Prefix → 404 hiba), majd a jármű UI 4-szintű réteges architektúrájának kialakítása a kód-duplikáció megszüntetésével.
|
||||
|
||||
**Masterbook 2.0 illeszkedés:** A feladat az Epic 11 (Public Frontend) és a B2C Dashboard UX stabilizálásához tartozik.
|
||||
|
||||
---
|
||||
|
||||
## 2. Problémaelemzés
|
||||
|
||||
### 🔴 Bug #1: Double API Prefix Crash
|
||||
|
||||
| Réteg | Fájl | Sor | Tartalom | Probléma |
|
||||
|-------|------|-----|----------|----------|
|
||||
| **Env** | `frontend/.env` | 1 | `VITE_API_BASE_URL=https://dev.servicefinder.hu/api/v1` | **OK** - base URL helyes |
|
||||
| **Axios** | `frontend/src/api/axios.ts:4` | 4 | `baseURL: import.meta.env.VITE_API_BASE_URL` | **OK** - base URL = `/api/v1` |
|
||||
| **Store** | `frontend/src/stores/vehicle.ts:63` | 63 | `api.get('/api/v1/assets/vehicles')` | **🔴 HIBÁS** - dupla prefix! |
|
||||
| **Eredmény URL** | | | `https://dev.servicefinder.hu/api/v1/api/v1/assets/vehicles` | **404 Not Found** |
|
||||
|
||||
### 🔴 Bug #2: Duplikált Mock Adatok
|
||||
|
||||
| Fájl | Sorok | Tartalom |
|
||||
|------|-------|----------|
|
||||
| `DashboardView.vue:368` | 368-426 | `MockVehicle` interface + 3 mock vehicle |
|
||||
| `PrivateVehicleManager.vue:248` | 248-306 | `MockVehicle` interface + 3 mock vehicle |
|
||||
|
||||
---
|
||||
|
||||
## 3. 4-Level Architecture Design
|
||||
|
||||
```
|
||||
Level 1: types/vehicle.ts (VehicleData interface)
|
||||
Level 2: data/mockVehicles.ts (mock vehicles array)
|
||||
Level 3: components/vehicle/ (3 új komponens)
|
||||
Level 4: DashboardView + PrivateVehicleManager + VehicleDetailModal (refaktor)
|
||||
```
|
||||
|
||||
### Level 1: `frontend/src/types/vehicle.ts`
|
||||
Unified `VehicleData` interface covering both API response and mock data.
|
||||
|
||||
### Level 2: `frontend/src/data/mockVehicles.ts`
|
||||
Single source of mock data, imported by all consumers.
|
||||
|
||||
### Level 3: 3 új komponens
|
||||
- **VehiclePlateBadge.vue** - EU plate badge (sm/md/lg sizes)
|
||||
- **VehicleCardCompact.vue** - Mini dashboard card
|
||||
- **VehicleCardStandard.vue** - Full carousel card
|
||||
|
||||
### Level 4: Refaktor
|
||||
- VehicleDetailModal áthelyezése `dashboard/` → `vehicle/`
|
||||
- DashboardView: inline card → VehicleCardCompact
|
||||
- PrivateVehicleManager: inline card → VehicleCardStandard
|
||||
|
||||
---
|
||||
|
||||
## 4. Érintett fájlok
|
||||
|
||||
| # | Fájl | Művelet |
|
||||
|---|------|---------|
|
||||
| 1 | `frontend/src/stores/vehicle.ts` | **JAVÍTÁS** - `/api/v1` prefix eltávolítása |
|
||||
| 2 | `frontend/src/types/vehicle.ts` | **LÉTREHOZÁS** - VehicleData interface |
|
||||
| 3 | `frontend/src/data/mockVehicles.ts` | **LÉTREHOZÁS** - mock adatok |
|
||||
| 4 | `frontend/src/components/vehicle/VehiclePlateBadge.vue` | **LÉTREHOZÁS** |
|
||||
| 5 | `frontend/src/components/vehicle/VehicleCardCompact.vue` | **LÉTREHOZÁS** |
|
||||
| 6 | `frontend/src/components/vehicle/VehicleCardStandard.vue` | **LÉTREHOZÁS** |
|
||||
| 7 | `frontend/src/components/vehicle/VehicleDetailModal.vue` | **LÉTREHOZÁS** (áthelyezve) |
|
||||
| 8 | `frontend/src/components/dashboard/VehicleDetailModal.vue` | **TÖRLÉS** |
|
||||
| 9 | `frontend/src/views/DashboardView.vue` | **REFACTOR** |
|
||||
| 10 | `frontend/src/components/dashboard/PrivateVehicleManager.vue` | **REFACTOR** |
|
||||
|
||||
---
|
||||
|
||||
## 5. Módosítási sorrend
|
||||
|
||||
1. `vehicle.ts` → Fix API prefix
|
||||
2. `types/vehicle.ts` → Létrehozás
|
||||
3. `data/mockVehicles.ts` → Létrehozás
|
||||
4. `VehiclePlateBadge.vue` → Létrehozás
|
||||
5. `VehicleCardCompact.vue` → Létrehozás
|
||||
6. `VehicleCardStandard.vue` → Létrehozás
|
||||
7. `VehicleDetailModal.vue` → Áthelyezés + típusosítás
|
||||
8. `DashboardView.vue` → Refaktor (VehicleCardCompact)
|
||||
9. `PrivateVehicleManager.vue` → Refaktor (VehicleCardStandard)
|
||||
10. `vite build` → Verifikáció
|
||||
|
||||
---
|
||||
|
||||
## ⏸️ Jóváhagyási pont
|
||||
|
||||
**Kérem a felhasználó jóváhagyását a fenti specifikációhoz!**
|
||||
120
plans/vehicle_edit_404_fix_analysis.md
Normal file
120
plans/vehicle_edit_404_fix_analysis.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 🚗 Járműszerkesztés 404-es hiba - Teljes analízis és javítási terv
|
||||
|
||||
## 📋 Probléma Leírása
|
||||
A manager dashboardon a járműkártya szerkesztésekor a **Mentés** gombra kattintva a böngésző `PUT /api/v1/assets/vehicles/{id}` kérést küld, amely **HTTP 404 Not Found** hibával tér vissza.
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Root Cause #1 - Stale uvicorn folyamat (MÁR JAVÍTVA)
|
||||
|
||||
### Tünet
|
||||
A PUT végpont 404-et adott, pedig a kód a fájlokban létezett.
|
||||
|
||||
### Ok
|
||||
A [`sf_api`](docker-compose.yml:21) konténerben az uvicorn [`--reload` nélkül](backend/app/scripts/pre_start.sh) indult PID 1-ként. Amikor a kódot módosították a konténer indulása után, a futó Python folyamat továbbra is a **régi, cache-elt modulokat** használta (`sys.modules`).
|
||||
|
||||
### Bizonyíték
|
||||
- TestClient (friss Python import): `PUT /vehicles/{id}` → **401** (route létezik) ✅
|
||||
- httpx a futó uvicorn-hoz: `PUT /vehicles/{id}` → **404** (route nem létezik a cache-ben) ❌
|
||||
|
||||
### Javítás
|
||||
```bash
|
||||
docker compose restart sf_api
|
||||
```
|
||||
✅ **Elvégezve** - a konténer újraindult, a PUT végpont már 401-et ad (route létezik, auth kell).
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Root Cause #2 - Dual Entity ID mismatch (MÉG JAVÍTANDÓ)
|
||||
|
||||
### Tünet
|
||||
A konténer újraindítás után a PUT végpont 401 helyett **továbbra is 404-et ad** hitelesített kérésekre.
|
||||
|
||||
### Ok
|
||||
A projekt **Dual Entity** modellt használ:
|
||||
- `User` tábla (`id` = 28) - technikai fiók
|
||||
- `Person` tábla (`id` = 29) - valós személy
|
||||
|
||||
A járművek (`Asset`) `owner_person_id` mezője a **Person ID-t** (29) tárolja. A GET végpont helyesen használja a `current_user.person_id`-t, de a PUT végpont hibásan `current_user.id`-t használ.
|
||||
|
||||
### Hiba helye
|
||||
[`backend/app/api/v1/endpoints/assets.py`](backend/app/api/v1/endpoints/assets.py), 278. és 280. sor:
|
||||
```python
|
||||
Asset.owner_person_id == current_user.id, # 278: HIBA - .id helyett .person_id kell
|
||||
Asset.operator_person_id == current_user.id, # 280: HIBA - .id helyett .person_id kell
|
||||
```
|
||||
|
||||
### Helyes megoldás
|
||||
A [`GET /vehicles`](backend/app/api/v1/endpoints/assets.py:62-63) végpont mintája alapján:
|
||||
```python
|
||||
Asset.owner_person_id == current_user.person_id, # ✅
|
||||
Asset.operator_person_id == current_user.person_id, # ✅
|
||||
```
|
||||
|
||||
### Tesztelési eredmények
|
||||
| Teszt | Eredmény | Státusz |
|
||||
|-------|----------|---------|
|
||||
| `current_user.id` = 28 | `Asset.owner_person_id(29) == 28` → false → 404 | ❌ |
|
||||
| `current_user.person_id` = 29 | `Asset.owner_person_id(29) == 29` → true → 200 | ✅ (várt) |
|
||||
|
||||
---
|
||||
|
||||
## ✅ Backend-Adatbázis Kommunikáció
|
||||
|
||||
```json
|
||||
GET /health → {"status": "ok", "database": "connected"}
|
||||
```
|
||||
✅ **Adatbázis kapcsolat rendben működik.**
|
||||
|
||||
---
|
||||
|
||||
## 📝 Javítási Terv
|
||||
|
||||
### 1. Backend javítás (PUT végpont)
|
||||
**Fájl:** `backend/app/api/v1/endpoints/assets.py`
|
||||
**Módosítandó sorok:** 278, 280
|
||||
|
||||
```python
|
||||
# 278. sor HIBA:
|
||||
Asset.owner_person_id == current_user.id,
|
||||
# 278. sor JAVÍTVA:
|
||||
Asset.owner_person_id == current_user.person_id,
|
||||
|
||||
# 280. sor HIBA:
|
||||
Asset.operator_person_id == current_user.id,
|
||||
# 280. sor JAVÍTVA:
|
||||
Asset.operator_person_id == current_user.person_id,
|
||||
```
|
||||
|
||||
### 2. Frontend ellenőrzés
|
||||
A frontend kód (`VehicleFormModal.vue` és `vehicle.ts`) helyesen hívja a `PUT /assets/vehicles/{id}` végpontot. **Nem szorul javításra.**
|
||||
|
||||
### 3. Tesztelés javítás után
|
||||
```bash
|
||||
# 1. Bejelentkezés
|
||||
curl -X POST https://app.servicefinder.hu/api/v1/auth/login \
|
||||
-d "username=tester_pro@profibot.hu&password=Tesztelek99!"
|
||||
|
||||
# 2. Jármű lista lekérése
|
||||
curl -H "Authorization: Bearer {token}" \
|
||||
https://app.servicefinder.hu/api/v1/assets/vehicles
|
||||
|
||||
# 3. Jármű szerkesztése (az első jármű ID-jával)
|
||||
curl -X PUT -H "Authorization: Bearer {token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"current_mileage": 50000}' \
|
||||
https://app.servicefinder.hu/api/v1/assets/vehicles/{id}
|
||||
|
||||
# Várt eredmény: HTTP 200 + frissített jármű adatok
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Összefoglaló táblázat
|
||||
|
||||
| # | Hiba | Státusz | Javítás |
|
||||
|---|------|---------|---------|
|
||||
| 1 | uvicorn --reload nélkül fut, nem tölti be az új kódot | ✅ Javítva (restart) | `docker compose restart sf_api` |
|
||||
| 2 | PUT végpontban `current_user.id` vs `current_user.person_id` mismatch | ❌ Javítandó | `assets.py:278,280` `.id` → `.person_id` |
|
||||
| 3 | Adatbázis kapcsolat | ✅ Rendben | Health check OK |
|
||||
| 4 | Frontend kód | ✅ Rendben | Nem szorul javításra |
|
||||
Reference in New Issue
Block a user