20 KiB
Service Finder Fejlesztési Történet
2026-06-21 - P0 Deep Audit: Database Consistency & Zombie API Hunt
🎯 Cél
Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok felderítése a vehicle, finance, fleet_finance sémákban, mielőtt a frontend fejlesztés elkezdődik.
🔧 Eredmények
1. ADATBÁZIS TISZTASÁG: ✅ PASS
- API modul import: ✅ Sikeres (2 route: GET, POST)
- Sync Engine: ✅ 1210 OK, 0 Fixed, 0 Extra
- E2E test: ⚠️ Pre-existing conftest hiba (verification token timeout - nem kapcsolódó)
2026-06-30 - [#343] Fázis 4/7: Gamification kulcsok felvétele backend lokációs fájlokba
🎯 Cél
GAMIFICATION szekció létrehozása a backend/static/locales/en.json és hu.json fájlokban a docs/gamification_i18n_audit_and_fix_proposal.md dokumentáció alapján.
🔧 Módosított fájlok
2026-07-01 - Opening Hours (JSONB) Admin UI támogatás
🎯 Cél
Nyitvatartás (Opening Hours) JSONB mező adminisztrációs támogatásának megvalósítása: backend API (GET/PATCH), frontend edit UI (7 napos grid), frontend detail display.
🔧 Módosított fájlok
backend/app/api/v1/endpoints/admin_providers.py- ProviderDetail + ProviderUpdateInput sémákopening_hoursmezővel; get_provider_detail() és update_provider() végpontok kiegészítése a ServiceProfile JSONB oszlop olvasásával/írásávalfrontend_admin/pages/providers/[id]/edit.vue- "Nyitvatartás" tab (4. tab) 7 napos grid-del, checkbox + time input párokkal, 24/7 gyorsgombbal, hétköznap másolással, összes törlésselfrontend_admin/pages/providers/[id]/index.vue- Nyitvatartás megjelenítő tábla a részletes nézetben
✅ Verifikáció
- Sync Engine: 1297 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban
- GET /admin/providers/1 → 200,
opening_hoursmező visszatér - PATCH /admin/providers/1
opening_hours→ 200, adatok perzisztálódnak és visszaolvashatók
2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK)
🎯 Cél
5 új nyelv (Német, Francia, Román, Cseh, Szlovák) bevezetése a backend és frontend admin i18n rendszerekbe.
🔧 Létrehozott fájlok
backend/static/locales/de.json- Backend német lokációs fájl (7 szekció)backend/static/locales/fr.json- Backend francia lokációs fájl (7 szekció)backend/static/locales/ro.json- Backend román lokációs fájl (7 szekció)backend/static/locales/cz.json- Backend cseh lokációs fájl (7 szekció)backend/static/locales/sk.json- Backend szlovák lokációs fájl (7 szekció)frontend_admin/locales/de.json- Frontend admin német fő lokációs fájlfrontend_admin/locales/fr.json- Frontend admin francia fő lokációs fájlfrontend_admin/locales/ro.json- Frontend admin román fő lokációs fájlfrontend_admin/locales/cz.json- Frontend admin cseh fő lokációs fájlfrontend_admin/locales/sk.json- Frontend admin szlovák fő lokációs fájlfrontend_admin/i18n/locales/de.json- Frontend admin német közös lokációs fájlfrontend_admin/i18n/locales/fr.json- Frontend admin francia közös lokációs fájlfrontend_admin/i18n/locales/ro.json- Frontend admin román közös lokációs fájlfrontend_admin/i18n/locales/cz.json- Frontend admin cseh közös lokációs fájlfrontend_admin/i18n/locales/sk.json- Frontend admin szlovák közös lokációs fájl
🔧 Módosított fájlok
frontend_admin/nuxt.config.ts- 5 új nyelv regisztrálása a @nuxtjs/i18n konfigurációban
✅ Verifikáció
- Backend i18n: Mind az 5 nyelv betöltődik (7-7 szekció), leaf key fordítések működnek
- Sync Engine: 1293 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban
🎯 Cél
GAMIFICATION szekció létrehozása a backend/static/locales/en.json és hu.json fájlokban a docs/gamification_i18n_audit_and_fix_proposal.md dokumentáció alapján.
🔧 Módosított fájlok
2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé
🎯 Cél
A jelenlegi kétállású HU/EN kapcsoló átalakítása bővíthető, legördülő nyelvválasztó dropdownná, amely a backend-ből érkező támogatott nyelveket listázza.
🔧 Módosított fájlok
frontend_admin/components/LanguageSwitcher.vue— LÉTREHOZVA: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálássalfrontend_admin/layouts/default.vue— MÓDOSÍTVA: 157-170. sorokban a régi gomb-alapú kapcsoló kicserélve<LanguageSwitcher />komponensre; feleslegesuseI18nimport ésswitchLocale/getAuthHeadersfüggvények eltávolítva
📊 Eredmény
- LanguageSwitcher komponens: ✅ Létrehozva (zászló emoji, dinamikus locale lista, backend PATCH perzisztálás, localStorage)
- default.vue cleanup: ✅ 25 sor kód eltávolítva (i18n logika kiszervezve)
- Nuxt production build: ✅ Sikeres
2026-06-30 - Admin Provider Root Cause Analysis (#379)
Vizsgálat típusa: Rendszer-Architect root cause analysis Gitea kártya: #379
Felfedezett probléma
Az admin felület (providers list & pending queue) csak 6 rekordot mutat a marketplace.service_providers táblából. A robotok által gyűjtött 8569 rekord a marketplace.service_staging-ben láthatatlan.
Root Cause
A backend/app/api/v1/endpoints/admin_providers.py list_providers() és get_provider_stats() endpointjai kizárólag a ServiceProvider modellt kérdezik le. A provider_service.py search_providers() (public API) már helyesen használ UNION ALL-t mindhárom forrásból.
Javítási terv
ProviderListItemresponse model kiegészítésesource_tablemezővellist_providers()UNION ALL kiterjesztése ServiceStaging-reget_provider_stats()kiterjesztése staging rekordokkal- Nem kell új validációs mező - a
provider_validations,service_profiles.trust_scorestb. már létezik
Dokumentáció
docs/admin_providers_root_cause_analysis.md
2026-06-30 - Admin Provider Discovery Implementáció
🎯 Cél
A list_providers() admin végpont kiterjesztése UNION ALL lekérdezéssel, hogy a bot által gyűjtött ServiceStaging rekordok (8569 db) és a verified organization-ök is megjelenjenek az admin felületen. Új rejected.vue oldal az elutasított szolgáltatók visszaállításához.
🔧 Változtatások
backend/app/api/v1/endpoints/admin_providers.py:_build_unified_providers_query(): UNION ALL a ServiceProvider, ServiceStaging és Organizations táblákbólsource_filteréssource_table_filtera UNION ALL eredményére alkalmazva (nem az egyes részekre) - kijavítva a SourceType enum ütközési hibátget_provider_stats(): staging_pending mező hozzáadásarestore_provider(): POST végpont rejected->approved státuszváltáshozget_provider_history(),update_provider()végpontok
frontend_admin/pages/providers/rejected.vue: új oldal az elutasított szolgáltatók listázásához és visszaállításáhozfrontend_admin/pages/providers/index.vue: source_table, bot/verified_org szűrés támogatásfrontend_admin/pages/providers/pending.vue: source_table mező hozzáadása
✅ Tesztek
source=botfilter: 200 OK, 5 staging rekord visszaadvasource=verified_orgfilter: 200 OK, 1 organization rekordsource_table=service_stagingfilter: 200 OK, 3 staging rekord- Stats: total=8575, staging_pending=5096
- Rejected filter: 200 OK, 2 rejected rekord
2026-06-30 - Provider Admin Tabbed Edit UI (Status, Validations, History)
🎯 Cél
A szolgáltatók admin felületének bővítése: többfülű szerkesztési nézet, státuszkezelés, gamification validációs lista és állapotváltoztatási előzmények megjelenítése.
🔧 Módosított fájlok
1. backend/app/api/v1/endpoints/admin_providers.py
ProviderUpdateInputséma bővítése:status(pending/approved/rejected) ésvalidation_score(0-100) mezőkkelProviderValidationEntryresponse séma létrehozása (id, provider_id, voter_user_id, validation_type, weight, validation_metadata, created_at, voter_name)GET /admin/providers/{id}/validationsvégpont: gamification validációk lekérése voter névvelPATCH /admin/providers/{id}módosítása: státuszváltás kezelése (ModerationStatus enum), old_data audit snapshot, validation_score auto-állítás restore/reject esetén
2. frontend_admin/pages/providers/[id].vue
- Teljes átírás: egysávos layout helyett 4 fül (Adatok, Státusz, Validációk, Előzmények)
- Adatok fül: változatlan alapadatok, cím, elérhetőség, moderációs műveletek
- Státusz fül: új űrlap státusz select, validation_score range slider (0-100), indoklás textarea
- Validációk fül: gamification validációs lista típus-badge-ekkel, szavazó név, súly, metadata, timestamp
- Előzmények fül: idővonal action-badge-ekkel, státusz átmenetek (régi→új), user info, expandálható részletek
- Elutasított/Megjelölt szekció: "Szerkesztés" és "Visszaállítás" gombok minden státuszhoz
✅ Verifikáció
- Sync Engine: ✅ 1293 OK, 0 Fixed, 0 Extra - teljes szinkron
- Backend syntax: ✅ admin_providers.py AST parse OK
- Backend import: ✅ router modul betöltés sikeres
2026-06-30 - P0 Rescue: Admin Providers API Blocker Fixes
🎯 Cél
4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban.
🔧 Változtatások
FIX 1 - Silent Rollback (PATCH endpoint):
update_provider()db.commit()körétry/except IntegrityErrorblokk került- IntegrityError esetén
db.rollback()+HTTPException(400)a csendes 200 OK helyett
FIX 2 - Unique Constraint on Restore:
_create_provider_validation()átírva PostgreSQLINSERT ... ON CONFLICT DO UPDATE(UPSERT) használatára- A
uq_voter_provider_validationconstraint tiszteletben tartva
FIX 3 - Wrong Frontend URL:
- Ellenőrizve: a frontend
[id].vuemár a helyes/api/v1/admin/providers/{id}/validationsURL-t használja
FIX 4 - AuditLog Attribute Error:
get_provider_history()AuditLog.created_at→AuditLog.timestamptimestamp=log.created_at→timestamp=log.timestamp
✅ Verifikáció
- Backend syntax: ✅
py_compileOK - Modul import: ✅
admin_providersmodul betöltés sikeres - Container: ✅
sf_apirestart sikeres, státusz Up
2026-06-30 - [#381] P0 Fix: Provider validations 500 error & missing edit/flag modals
🎯 Cél
Két P0 hibajavítás az Admin Provider Details oldalon.
🔧 Módosított fájlok
Bug #1 - get_provider_validations() 500 error:
admin_providers.py—v.voter.display_name→v.voter.email- Root cause:
Usermodellben nincsdisplay_namemező
Bug #2 - Dead "Szerkesztés" gomb:
[id].vue— Edit modal template hozzáadva (name, city, address, contact, category mezőkkel)[id].vue— Flag modal template hozzáadva (indoklás textarea-val)- Root cause: A
<template>szekcióból hiányzott mindkét modal, bár a JavaScript logika (showEditModal,openEditModal,saveEdit,showFlagModal,flagProvider) definiálva volt
✅ Verifikáció
- Backend syntax: ✅
ast.parseOK - Frontend template: ✅ Mind a 3 modal (Reject, Edit, Flag) jelen van a
<template>-ben
2026-07-01 - [#382] P0: Backend Database Models - 3D Filtering Matrix
🎯 Cél
A ServiceProvider és ServiceProfile modellek bővítése supported_vehicle_classes (ARRAY) és specializations (JSONB) oszlopokkal a 3D szűrési mátrix támogatásához. Pydantic schemák frissítése az új mezőkkel.
🔧 Módosított fájlok
1. backend/app/models/identity/social.py
ARRAYimport hozzáadvasqlalchemy.dialects.postgresql-bőlsupported_vehicle_classes: Mapped[Optional[list]] = mapped_column(ARRAY(String), server_default=text("'{}'"), nullable=True)specializations: Mapped[Optional[dict]] = mapped_column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)
2. backend/app/models/marketplace/service.py
ARRAYimport hozzáadvasqlalchemy.dialects.postgresql-ből- Azonos 2 oszlop hozzáadva a ServiceProfile modellhez
3. backend/app/api/v1/endpoints/admin_providers.py
ProviderUpdateInput:category_ids,supported_vehicle_classes,specializationsmezőkProviderDetail:category_ids,supported_vehicle_classes,specializationsmezőkget_provider_detail()ésupdate_provider()response-ok frissítve
4. backend/app/schemas/provider.py
ProviderQuickAddIn:supported_vehicle_classes,specializationsmezőkProviderUpdateIn:supported_vehicle_classes,specializationsmezőkProviderSearchResult:supported_vehicle_classes,specializationsmezők
✅ Verifikáció
- Sync Engine: ✅ 1293 OK, 4 Fixed (4 új oszlop), 0 Extra
- Adatbázis oszlopok ellenőrizve:
marketplace.service_providers.supported_vehicle_classes(ARRAY),marketplace.service_providers.specializations(JSONB),marketplace.service_profiles.supported_vehicle_classes(ARRAY),marketplace.service_profiles.specializations(JSONB) — mind jelen van megfelelő típussal és default értékkel
2026-07-01 - [#383] P0: Admin PATCH endpoint - ServiceExpertise sync & Array persistence
🎯 Cél
A PATCH /admin/providers/{id} végpont kiegészítése: category_ids, supported_vehicle_classes, specializations mezők mentése mind a ServiceProvider, mind a ServiceProfile modellekbe, valamint _sync_service_expertises() meghívása a ServiceProfile ID-val a taxonomy fa szinkronizálásához.
🔧 Módosított fájlok
1. backend/app/api/v1/endpoints/admin_providers.py
- Importok bővítése:
ServiceProfileimportapp.models.marketplace.service-ből,_sync_service_expertisesimportapp.services.provider_service-ből update_provider():category_ids,supported_vehicle_classes,specializationskiemelése a payload-bólupdate_fields.pop()segítségével; tömbök mentése ServiceProvider-re; ServiceProfile lekéréseservice_provider_idalapján; tömbök mentése ServiceProfile-ra;_sync_service_expertises(db, profile.id, category_ids)hívásaget_provider_detail():category_idsfeloldása a ServiceExpertise join táblából ServiceProfile-on keresztül (korábban hardcodedNone)
✅ Verifikáció
- Backend syntax: ✅
py_compileOK (exit code 0) - Container restart: ✅
sf_apisikeresen újraindítva - Import verifikáció: ✅
ProviderUpdateInputséma tartalmazza acategory_ids,supported_vehicle_classes,specializationsmezőket
2026-07-01 - [#384] P0: Service Provider Dedicated Full-Page Editor
🎯 Cél
Dedikált teljes oldalas szerkesztő létrehozása a szolgáltatók adminisztrációjához, amely felváltja a hiányzó modális szerkezetet. A szerkesztő 3 tabos struktúrával rendelkezik: Alapadatok & Kapcsolat, Szolgáltatások & Járművek (3D Mátrix), Helyszín & Lokáció.
🔧 Létrehozott fájlok
frontend_admin/pages/providers/[id]/edit.vue- Teljes oldalas 3-tabos szerkesztő (Alapadatok, 3D Mátrix, Helyszín)frontend_admin/components/TreeNode.vue- Rekurzív fa komponens a kategória hierarchia megjelenítéséhez
🔧 Módosított fájlok
frontend_admin/pages/providers/[id].vue- "Szerkesztés" gomb átirányítása a modális helyett az új/providers/{id}/editútvonalra
📝 Technikai részletek
- Tab 1 (Alapadatok & Kapcsolat): Név, Kategória, Forrás (read-only), Telefon, Email, Weboldal
- Tab 2 (Szolgáltatások & Járművek): 3D Képesség Mátrix - A: Járműosztályok (8 checkbox), B: Szolgáltatási Kategóriák (rekurzív fa), C: Specializációk (márka + hajtáslánc tag inputok)
- Tab 3 (Helyszín & Lokáció): Teljes cím, Város, Irányítószám, Utca, Házszám, Plus Code
- API integráció: PATCH
/api/v1/admin/providers/{id}végpont használata aProviderUpdateInputséma szerint - Adatfolyam: GET provider detail → form mapping → user edit → PATCH save → visszanavigálás a detail oldalra
- Build: Sikeres Nuxt build hibák nélkül
2026-07-01 - P0 HOTFIX: Edit page data modification fix (3 bugs)
🎯 Cél
A /providers/[id]/edit oldalon a felhasználó nem tudott adatokat módosítani és menteni. 3 összefüggő hibát azonosítottam és javítottam.
🔧 Javítások
1. Backend - Hiányzó address mező a ProviderUpdateInput sémában
- Hely:
backend/app/api/v1/endpoints/admin_providers.py:127 - Probléma: A PATCH végpont Pydantic sémája nem tartalmazta az
addressmezőt, így a "Teljes cím" módosítása sosem került mentésre. - Javítás:
address: Optional[str] = Field(None, max_length=500)hozzáadva a sémához.
2. Frontend - Hiányzó address és address_street_type a hasChanges computed-ból
- Hely:
frontend_admin/pages/providers/[id]/edit.vue:579 - Probléma: A Mentés gomb disabled maradt, ha csak a "Teljes cím" vagy "Utca típusa" mezőt módosították.
- Javítás:
form.address !== (p.address || '')ésform.address_street_type !== (p.address_street_type || '')ellenőrzések hozzáadva.
3. Frontend - Hiányzó address a saveForm payload-ból
- Hely:
frontend_admin/pages/providers/[id]/edit.vue:803 - Probléma: A PATCH kérés törzséből hiányzott az
addressmező. - Javítás:
address: form.address || nullhozzáadva a payload objektumhoz.
✅ Verifikáció
- Backend Python szintaxis: OK
- Sync Engine: 1297 elem OK, 0 hiba, teljes szinkronban
2026-07-01 - P0 Feature: "Always Open" (0-24) nyitvatartás a provider admin felületen
🎯 Cél
A provider admin szerkesztő felületen egy "Folyamatos (0-24) nyitvatartás" checkbox bevezetése, amely:
- Backend:
is_always_open: Optional[bool]mező aProviderUpdateInputsémában - Backend: Ha
is_always_open=True, aupdate_provider()PATCH endpoint automatikusan 00:00-23:59-re állítja mind a 7 napot, ésalways_open: truemetadatát tárol a JSONBopening_hoursmezőben - Backend: Ha
is_always_open=False, a meglévőopening_hoursmentése változatlan, azalways_openkulcs törlődik - Frontend: Checkbox a Nyitvatartás tabon, amely bekapcsoláskor letiltja a naponkénti bevitelt és 00:00-23:59-re állít mindent
- Adatbázis: Nincs új migráció - a
always_openmetadata a meglévő JSONBopening_hoursoszlopban tárolódik
🔧 Módosított fájlok
1. Backend - backend/app/api/v1/endpoints/admin_providers.py
ProviderUpdateInputosztály:is_always_open: Optional[bool] = Field(None, ...)hozzáadva (148. sor)update_provider()PATCH endpoint:is_always_openkinyeréseupdate_fields-ből, 0-24 kényszerítés True esetén, metadata törlés False esetén (1150-1170. sor)
2. Frontend - frontend_admin/pages/providers/[id]/edit.vue
formreactive objektum:is_always_open: falsemező hozzáadva- Template: "Folyamatos (0-24) nyitvatartás" checkbox a Nyitvatartás tab tetején, amely letiltja a naponkénti grid-et
onAlwaysOpenChange(): Checkbox toggle handler - bekapcsoláskorsetAllDaysOpen('00:00', '23:59'), kikapcsoláskorclearAllHours()mapProviderToForm():always_openmetadata felismerése a JSONB-ből (mind a régi flat, mind az új nested formátum támogatott)hasChangescomputed:is_always_openösszehasonlítás ap.opening_hours?.always_open-valsaveForm():is_always_open: form.is_always_opena PATCH payload-ban
✅ Verifikáció
- Backend Python szintaxis: OK
- Sync Engine: 1297 elem OK, 0 hiba, teljes szinkronban
- API Test 1:
PATCH is_always_open=True→{"always_open": true, "days": {"monday": {"open": "00:00", "close": "23:59"}, ...}}✅ - API Test 2:
PATCH is_always_open=False→{"monday": {"open": "09:00", "close": "17:00"}}(always_open metadata stripped) ✅