91 lines
3.5 KiB
Markdown
91 lines
3.5 KiB
Markdown
# 🔧 Fix Plan: Provider Update 500 Error (folder_slug Truncation)
|
|
|
|
## 🎯 Cél
|
|
A `PUT /api/v1/providers/{id}` végpont által dobott 500-as hiba kijavítása, amikor a felhasználó egy olyan szolgáltató adatait szerkeszti, amely még **nincs** átmigrálva az `Organization` táblába (csak `ServiceStaging`-ben létezik).
|
|
|
|
## 🔍 Root Cause Analysis
|
|
|
|
### Hibajelenség
|
|
`PUT /api/v1/providers/4859` → `500 Internal Server Error`
|
|
```
|
|
value too long for type character varying(12)
|
|
```
|
|
|
|
### Kiváltó ok
|
|
A provider ID=4859 a `marketplace.service_staging` táblában létezik, de **nincs** még `fleet.organizations` rekordja.
|
|
|
|
Az [`update_provider()`](backend/app/services/provider_service.py:786) függvény a migrációs ágon (ServiceStaging → Organization) a `folder_slug`-ot az alábbi képlettel generálja:
|
|
|
|
```python
|
|
folder_slug = f"sp-{staging.id}-{uuid.uuid4().hex[:6]}",
|
|
```
|
|
|
|
- `"sp-"` = 3 karakter
|
|
- `"4859"` = 4 karakter (provider_id hossza)
|
|
- `"-"` = 1 karakter
|
|
- `"4d45d3"` = 6 karakter (uuid hex)
|
|
- **Összesen: 14 karakter**
|
|
|
|
Az [`Organization`](backend/app/models/marketplace/organization.py:75) modellben a `folder_slug` mező:
|
|
```python
|
|
folder_slug: Mapped[str] = mapped_column(String(12), unique=True, index=True)
|
|
```
|
|
**Csak 12 karaktert enged!** → PostgreSQL `StringDataRightTruncationError`.
|
|
|
|
**Ugyanez a hiba** a crowd-sourced migrációs ágon is (line 820):
|
|
```python
|
|
folder_slug = f"cr-{crowd.id}-{uuid.uuid4().hex[:6]}",
|
|
```
|
|
|
|
### Összehasonlítás
|
|
- **`quick_add_provider`** (line 501-503): `hashlib.md5(...).hexdigest()[:12]` → pontosan 12 karakter → **MŰKÖDIK**
|
|
- **`update_provider` migration** (line 786, 820): `"sp-{id}-{hex}"` / `"cr-{id}-{hex}"` → **TÚL HOSSZÚ**
|
|
|
|
## 📋 Javítási Terv
|
|
|
|
### 1. Model fix: [`backend/app/models/marketplace/organization.py`](backend/app/models/marketplace/organization.py:75)
|
|
**Változtatás:** `folder_slug` oszlop méretének növelése `String(12)` → `String(24)`
|
|
|
|
Indoklás:
|
|
- A jelenlegi 12 karakter túl szűk
|
|
- A `quick_add_provider` pontosan 12 karaktert használ → kompatibilis
|
|
- A migrációs slug-ok (pl. `sp-{id}-{hex6}`) elférnek
|
|
- A `unique=True` megszorítás megmarad
|
|
|
|
### 2. Service fix: [`backend/app/services/provider_service.py`](backend/app/services/provider_service.py:786)
|
|
**Változtatás:** A migrációs `folder_slug` generálás módosítása konzisztens `hashlib.md5` alapú generálásra.
|
|
|
|
**Staging ág (line 786):**
|
|
```python
|
|
# EZT:
|
|
folder_slug = f"sp-{staging.id}-{uuid.uuid4().hex[:6]}"
|
|
# HELYETTE:
|
|
folder_slug = hashlib.md5(f"sp-{staging.id}-{uuid.uuid4()}".encode()).hexdigest()[:12]
|
|
```
|
|
|
|
**Crowd ág (line 820):**
|
|
```python
|
|
# EZT:
|
|
folder_slug = f"cr-{crowd.id}-{uuid.uuid4().hex[:6]}"
|
|
# HELYETTE:
|
|
folder_slug = hashlib.md5(f"cr-{crowd.id}-{uuid.uuid4()}".encode()).hexdigest()[:12]
|
|
```
|
|
|
|
Indoklás:
|
|
- Konzisztens a `quick_add_provider` által használt módszerrel
|
|
- Mindig pontosan 12 karakter → garantáltan elfér a `String(12)` mezőben is
|
|
- Elég nagy entrópia az egyediséghez (`hashlib.md5(...)` → 32 hex, `[:12]` → 48 bit)
|
|
|
|
### 3. Adatbázis szinkronizáció
|
|
Mivel az oszlop mérete változik (`String(12)` → `String(24)`), futtatni kell:
|
|
```bash
|
|
docker exec sf_api python -m app.scripts.sync_engine
|
|
```
|
|
|
|
## ✅ Elfogadási kritériumok
|
|
1. `PUT /api/v1/providers/4859` sikeresen lefut (200 OK)
|
|
2. A migrált Organization `folder_slug` pontosan 12 karakter hosszú
|
|
3. Meglévő provider-ek (`quick_add`-ból) továbbra is működnek
|
|
4. A `folder_slug` `unique` megszorítás nem sérül
|
|
5. A logokban nincs `StringDataRightTruncationError`
|