3.5 KiB
🔧 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() függvény a migrációs ágon (ServiceStaging → Organization) a folder_slug-ot az alábbi képlettel generálja:
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 modellben a folder_slug mező:
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):
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ÖDIKupdate_providermigration (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
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_providerpontosan 12 karaktert használ → kompatibilis - A migrációs slug-ok (pl.
sp-{id}-{hex6}) elférnek - A
unique=Truemegszorítás megmarad
2. Service fix: backend/app/services/provider_service.py
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):
# 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):
# 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:
docker exec sf_api python -m app.scripts.sync_engine
✅ Elfogadási kritériumok
PUT /api/v1/providers/4859sikeresen lefut (200 OK)- A migrált Organization
folder_slugpontosan 12 karakter hosszú - Meglévő provider-ek (
quick_add-ból) továbbra is működnek - A
folder_sluguniquemegszorítás nem sérül - A logokban nincs
StringDataRightTruncationError