Files
service-finder/plans/logic_spec_provider_update_fix.md
2026-06-17 22:07:55 +00:00

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`