Files
service-finder/.roo/history.md
2026-07-01 02:27:38 +00:00

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ák opening_hours mezővel; get_provider_detail() és update_provider() végpontok kiegészítése a ServiceProfile JSONB oszlop olvasásával/írásával
  • frontend_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éssel
  • frontend_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_hours mező 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ájl
  • frontend_admin/locales/fr.json - Frontend admin francia fő lokációs fájl
  • frontend_admin/locales/ro.json - Frontend admin román fő lokációs fájl
  • frontend_admin/locales/cz.json - Frontend admin cseh fő lokációs fájl
  • frontend_admin/locales/sk.json - Frontend admin szlovák fő lokációs fájl
  • frontend_admin/i18n/locales/de.json - Frontend admin német közös lokációs fájl
  • frontend_admin/i18n/locales/fr.json - Frontend admin francia közös lokációs fájl
  • frontend_admin/i18n/locales/ro.json - Frontend admin román közös lokációs fájl
  • frontend_admin/i18n/locales/cz.json - Frontend admin cseh közös lokációs fájl
  • frontend_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.vueLÉTREHOZVA: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálással
  • frontend_admin/layouts/default.vueMÓDOSÍTVA: 157-170. sorokban a régi gomb-alapú kapcsoló kicserélve <LanguageSwitcher /> komponensre; felesleges useI18n import és switchLocale/getAuthHeaders fü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

  1. ProviderListItem response model kiegészítése source_table mezővel
  2. list_providers() UNION ALL kiterjesztése ServiceStaging-re
  3. get_provider_stats() kiterjesztése staging rekordokkal
  4. Nem kell új validációs mező - a provider_validations, service_profiles.trust_score stb. 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

  1. backend/app/api/v1/endpoints/admin_providers.py:
    • _build_unified_providers_query(): UNION ALL a ServiceProvider, ServiceStaging és Organizations táblákból
    • source_filter és source_table_filter a UNION ALL eredményére alkalmazva (nem az egyes részekre) - kijavítva a SourceType enum ütközési hibát
    • get_provider_stats(): staging_pending mező hozzáadása
    • restore_provider(): POST végpont rejected->approved státuszváltáshoz
    • get_provider_history(), update_provider() végpontok
  2. frontend_admin/pages/providers/rejected.vue: új oldal az elutasított szolgáltatók listázásához és visszaállításához
  3. frontend_admin/pages/providers/index.vue: source_table, bot/verified_org szűrés támogatás
  4. frontend_admin/pages/providers/pending.vue: source_table mező hozzáadása

Tesztek

  • source=bot filter: 200 OK, 5 staging rekord visszaadva
  • source=verified_org filter: 200 OK, 1 organization rekord
  • source_table=service_staging filter: 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

  • ProviderUpdateInput séma bővítése: status (pending/approved/rejected) és validation_score (0-100) mezőkkel
  • ProviderValidationEntry response séma létrehozása (id, provider_id, voter_user_id, validation_type, weight, validation_metadata, created_at, voter_name)
  • GET /admin/providers/{id}/validations végpont: gamification validációk lekérése voter névvel
  • PATCH /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 IntegrityError blokk 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 PostgreSQL INSERT ... ON CONFLICT DO UPDATE (UPSERT) használatára
  • A uq_voter_provider_validation constraint tiszteletben tartva

FIX 3 - Wrong Frontend URL:

  • Ellenőrizve: a frontend [id].vue már a helyes /api/v1/admin/providers/{id}/validations URL-t használja

FIX 4 - AuditLog Attribute Error:

  • get_provider_history() AuditLog.created_atAuditLog.timestamp
  • timestamp=log.created_attimestamp=log.timestamp

Verifikáció

  • Backend syntax: py_compile OK
  • Modul import: admin_providers modul betöltés sikeres
  • Container: sf_api restart 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.pyv.voter.display_namev.voter.email
  • Root cause: User modellben nincs display_name mező

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.parse OK
  • 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

  • ARRAY import hozzáadva sqlalchemy.dialects.postgresql-ből
  • supported_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

  • ARRAY import hozzáadva sqlalchemy.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, specializations mezők
  • ProviderDetail: category_ids, supported_vehicle_classes, specializations mezők
  • get_provider_detail() és update_provider() response-ok frissítve

4. backend/app/schemas/provider.py

  • ProviderQuickAddIn: supported_vehicle_classes, specializations mezők
  • ProviderUpdateIn: supported_vehicle_classes, specializations mezők
  • ProviderSearchResult: supported_vehicle_classes, specializations mező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: ServiceProfile import app.models.marketplace.service-ből, _sync_service_expertises import app.services.provider_service-ből
  • update_provider(): category_ids, supported_vehicle_classes, specializations kiemelése a payload-ból update_fields.pop() segítségével; tömbök mentése ServiceProvider-re; ServiceProfile lekérése service_provider_id alapján; tömbök mentése ServiceProfile-ra; _sync_service_expertises(db, profile.id, category_ids) hívása
  • get_provider_detail(): category_ids feloldása a ServiceExpertise join táblából ServiceProfile-on keresztül (korábban hardcoded None)

Verifikáció

  • Backend syntax: py_compile OK (exit code 0)
  • Container restart: sf_api sikeresen újraindítva
  • Import verifikáció: ProviderUpdateInput séma tartalmazza a category_ids, supported_vehicle_classes, specializations mező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 a ProviderUpdateInput sé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 address mező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 || '') és form.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 address mező.
  • Javítás: address: form.address || null hozzá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ő a ProviderUpdateInput sémában
  • Backend: Ha is_always_open=True, a update_provider() PATCH endpoint automatikusan 00:00-23:59-re állítja mind a 7 napot, és always_open: true metadatát tárol a JSONB opening_hours mezőben
  • Backend: Ha is_always_open=False, a meglévő opening_hours mentése változatlan, az always_open kulcs 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_open metadata a meglévő JSONB opening_hours oszlopban tárolódik

🔧 Módosított fájlok

1. Backend - backend/app/api/v1/endpoints/admin_providers.py

  • ProviderUpdateInput osztály: is_always_open: Optional[bool] = Field(None, ...) hozzáadva (148. sor)
  • update_provider() PATCH endpoint: is_always_open kinyerése update_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

  • form reactive objektum: is_always_open: false mező 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áskor setAllDaysOpen('00:00', '23:59'), kikapcsoláskor clearAllHours()
  • mapProviderToForm(): always_open metadata felismerése a JSONB-ből (mind a régi flat, mind az új nested formátum támogatott)
  • hasChanges computed: is_always_open összehasonlítás a p.opening_hours?.always_open-val
  • saveForm(): is_always_open: form.is_always_open a 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)