admin_szolgáltatók_
This commit is contained in:
682
.roo/history.md
682
.roo/history.md
@@ -18,506 +18,308 @@ Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok fe
|
||||
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
|
||||
- `backend/static/locales/en.json` - GAMIFICATION szekció hozzáadva (16 kulcs: SUBMIT_SERVICE, QUIZ, BADGE, SEASON, ACHIEVEMENTS)
|
||||
- `backend/static/locales/hu.json` - GAMIFICATION szekció hozzáadva (16 kulcs, magyar fordításokkal)
|
||||
|
||||
### ✅ Ellenőrzés
|
||||
- JSON szintaxis: ✅ Érvényes mindkét fájlban
|
||||
- i18n helper `t()` függvény: ✅ Minden kulcs lekérdezhető angolul és magyarul
|
||||
- Interpoláció: ✅ `{error}` helyőrzők működnek
|
||||
- Leaf key count: 16 = 16 (en/hu egyezés)
|
||||
|
||||
## 2026-06-30 - [#344] Fázis 5/7: Backend API endpointok átalakítása - hardcoded stringek eltávolítása
|
||||
## 2026-07-01 - Opening Hours (JSONB) Admin UI támogatás
|
||||
|
||||
### 🎯 Cél
|
||||
A `backend/app/api/v1/endpoints/gamification.py` végpontjaiban található összes hardcoded magyar és angol szöveg cseréje az i18n `t()` helper segítségével.
|
||||
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/gamification.py` - 14 helyen hardcoded string → `t("GAMIFICATION.xxx")` hívás; `from app.core.i18n import t` import hozzáadva
|
||||
- `backend/static/locales/hu.json` - +10 új GAMIFICATION kulcs (QUIZ.ALREADY_COMPLETED, QUIZ.COMPLETED_SUCCESS, QUIZ.QUESTION_NOT_FOUND, QUIZ.POINTS_FAILED, BADGE.AWARDED_SUCCESS, BADGE.POINTS_FAILED, SEASON.NO_ACTIVE, XP_*_DESC, QUIZ_*_DESC)
|
||||
- `backend/static/locales/en.json` - +10 új GAMIFICATION kulcs angol fordítással
|
||||
- `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
|
||||
|
||||
### ✅ Ellenőrzés
|
||||
- Python import: ✅ `from app.api.v1.endpoints.gamification import router` sikeres
|
||||
- Szintaxis: ✅ Nincs hiba
|
||||
- i18n lefedettség: ✅ Minden korábbi hardcoded string i18n kulcsra cserélve
|
||||
- Interpoláció: ✅ `{error}`, `{badge_name}` helyőrzők működnek
|
||||
### ✅ 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-23 - Cost Entry Wizard (CostEntryWizard.vue) - 4-lépéses Számla Űrlap
|
||||
## 2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK)
|
||||
|
||||
### 🎯 Cél
|
||||
4-lépéses stepper wizard építése részletes számla/invoice költségek rögzítésére a CostsActionsCard-ból indíthatóan.
|
||||
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-24 - P0 Fix & Enhance: Permissions Page Data Flow, Editing & i18n
|
||||
## 2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé
|
||||
|
||||
### 🎯 Cél
|
||||
Permissions oldal adatáramlás javítása, szerkesztés/mentés funkció bevezetése, és @nuxtjs/i18n telepítése/konfigurálása.
|
||||
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/pages/permissions/index.vue` - Teljes átírás: client-side data fetch onMounted-ben, szerkeszthető toggle-ok (modifiedPermissions Map), PATCH mentés, toast notification, $t() hívások
|
||||
- `frontend_admin/nuxt.config.ts` - @nuxtjs/i18n modul hozzáadása, locales konfiguráció (hu/en)
|
||||
- `frontend_admin/i18n/locales/hu.json` - Magyar fordítási fájl (permissions oldal összes szövege)
|
||||
- `frontend_admin/i18n/locales/en.json` - Angol fordítási fájl
|
||||
- `frontend_admin/components/LanguageSwitcher.vue` — **LÉTREHOZVA**: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálással
|
||||
- `frontend_admin/layouts/default.vue` — **MÓ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ények
|
||||
- Build: ✅ Sikeres (hu-DbjfOUfH.mjs, en-DnJ23n0t.mjs locale chunk-ok)
|
||||
- i18n modul: @nuxtjs/i18n v10.4.0 telepítve, no_prefix stratégiával
|
||||
- Szerkesztés: modified/original Map-ek, handleToggle, savePermissions (PATCH /admin/permissions/override/{org_id})
|
||||
- Adatmentés: success/error toast notification auto-clear-el
|
||||
### 📊 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-24 - P0 Execution: Wire Packages UI to Real Database
|
||||
## 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 frontend_admin Packages oldal (packages/index.vue) mock adatok helyett valós API adatbázisból töltse a SubscriptionTier csomagokat. "Új Csomag Létrehozása" gomb és modal hozzáadása.
|
||||
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
|
||||
- `backend/app/schemas/subscription.py` - `tier_level` és `feature_capabilities` mezők hozzáadva a SubscriptionTierResponse, SubscriptionTierCreate, SubscriptionTierUpdate modellekhez
|
||||
- `backend/app/api/v1/endpoints/admin_packages.py` - create/update végpontok frissítve az új mezők kezelésére
|
||||
- `frontend_admin/pages/packages/index.vue` - Teljes átírás: mock adatok eltávolítva, fetchPackages() API hívás, create/edit/delete modal-ok, loading/error/empty állapotok, i18n támogatás
|
||||
- `frontend_admin/locales/hu.json` - packages i18n kulcsok (magyar)
|
||||
- `frontend_admin/locales/en.json` - packages i18n kulcsok (angol)
|
||||
|
||||
## 2026-06-29 - #327 Gitea Kártya: Backend - Meglévő PATCH /admin/users/{id}/penalty endpoint javítása
|
||||
**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
|
||||
A #327-es Gitea kártya (Epic 8 Gamification 2.0, 4. implementációs lépés) feladata a meglévő `PATCH /admin/users/{user_id}/penalty` végpont hibáinak kijavítása. Az endpoint már refaktorálva volt GamificationService `process_activity()` használatára, de 3 hibát tartalmazott.
|
||||
|
||||
### 🔧 Javított hibák
|
||||
|
||||
**1. Hiányzó `import logging` az [`admin.py`](backend/app/api/v1/endpoints/admin.py)-ban**
|
||||
- `logger.error()` hívás volt a fájlban (483. sor), de `import logging` nem szerepelt
|
||||
- Javítás: `import logging` és `logger = logging.getLogger("admin-endpoints")` hozzáadva
|
||||
|
||||
**2. Undefined variable `admin` a `approve_action` endpointban**
|
||||
- 82. sor: `admin.id` helyett `current_user.id` (az `admin` változó sosem volt definiálva)
|
||||
|
||||
**3. Rossz [`SecurityAuditLog`](backend/app/models/system/audit.py:12) mezőnevek a penalty endpointban (464-471. sor)**
|
||||
- `user_id=current_user.id` → `actor_id=current_user.id`
|
||||
- `target_user_id=user_id` → `target_id=user_id`
|
||||
- `details="..."` → `payload_after={"penalty_points_added": ..., "reason": ...}` (JSON dict, nem string)
|
||||
- `ip_address="admin_api"` → eltávolítva (nem létező mező)
|
||||
- `payload_before={}` hozzáadva (kötelező mező)
|
||||
|
||||
### 🐛 Hibakeresési tapasztalat
|
||||
- A kezdeti 500-as hibaüzenet félrevezető volt: `'UserStats' object has no attribute 'level'` - valójában a `current_level` mező helyesen létezik
|
||||
- A valódi hiba a `SecurityAuditLog` létrehozásánál volt, de a `raise e` minta a [`process_activity()`](backend/app/services/gamification_service.py:174)-ben elnyelte a belső traceback-et
|
||||
- Stratégiai debug logging segítségével sikerült lokalizálni a valódi hibát
|
||||
- `.pyc` cache törlése és konténer újraindítás szükséges volt a friss kód betöltéséhez
|
||||
|
||||
### ✅ Eredmények
|
||||
- HTTP 200: `{"status":"success","message":"Gamification penalty applied to user 1","user_id":1,"penalty_points_added":100,"total_penalty_points":300,"restriction_level":1}`
|
||||
- Adatbázis: user 1 `penalty_points=300`, `restriction_level=1`
|
||||
- Audit log: `audit.security_audit_logs` bejegyzés `action="apply_gamification_penalty"`, `actor_id=2`, `target_id=1`
|
||||
- Sync Engine: ✅ 1284 OK, 0 Fixed, 0 Extra
|
||||
- Debug logging eltávolítva a [`gamification_service.py`](backend/app/services/gamification_service.py)-ból
|
||||
- Gitea #327: ✅ Lezárva
|
||||
|
||||
## 2026-06-29 - Gitea #328: Gamification Admin Integration - Bugfixes & Endpoint Verification
|
||||
|
||||
### 🎯 Cél
|
||||
Gitea #328 ("Backend: gamification.py endpointok Gami") kártya feladatainak befejezése: admin gamification végpontok hibáinak javítása és teljes körű tesztelése.
|
||||
|
||||
### 🔧 Javítások
|
||||
|
||||
**1. [`gamification.py`](backend/app/api/v1/endpoints/gamification.py) - submit-service végpont hibák:**
|
||||
- Hiányzó `logger` import hozzáadva (`import logging`, `logger = logging.getLogger("gamification-endpoints")`)
|
||||
- `metadata={...}` → `provided_fields={...}` javítás (a `UserContribution` modellben `provided_fields` a JSONB mező neve)
|
||||
- Hiányzó kötelező mezők hozzáadva: `action_type=1`, `earned_xp=submission_rewards.get("xp", 100)`
|
||||
|
||||
**2. [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py) - master-config végpont javítás:**
|
||||
- `system_service.get_setting()` → `system_service.get_scoped_parameter()` (a `SystemService`-ben nincs `get_setting` metódus)
|
||||
- `system_service.set_setting()` → `system_service.set_scoped_parameter()` ugyanezen okból
|
||||
|
||||
**3. [`system_service.py`](backend/app/services/system_service.py) - set_scoped_parameter upsert logika javítás:**
|
||||
- Az eredeti `ON CONFLICT ON CONSTRAINT uix_param_scope` nem működött `scope_id IS NULL` esetén, mert PostgreSQL-ben a UNIQUE constraint nem blokkolja a NULL értékű duplikátumokat (NULL != NULL)
|
||||
- Kétlépéses megközelítésre váltva: először megkeresi a meglévő rekordot, ha van frissíti, ha nincs beszúrja
|
||||
- Adatbázis: `system.system_parameters.scope_level` oszlop típusa átállítva custom PostgreSQL enum-ról `VARCHAR(50)`-re a SQLAlchemy String(50) modellel való kompatibilitás miatt
|
||||
|
||||
### ✅ Teszt Eredmények
|
||||
- **Admin Gamification végpontok:** 18/18 ✅ (GET/POST/PUT/DELETE point-rules, level-configs, badges, seasons, competitions, user-stats, master-config, system-params, points-ledger, contributions)
|
||||
- **Penalty/Reward végpontok:** ✅ POST `/admin/gamification/user-stats/{id}/penalty` és `/reward`
|
||||
- **Legacy PATCH `/admin/users/{id}/penalty`:** ✅ Továbbra is működik a GamificationService-en keresztül
|
||||
- **Sync Engine:** ✅ 1284 OK, 0 Fixed, 0 Extra
|
||||
- **Gitea #328:** ✅ Lezárva
|
||||
|
||||
## 2026-06-29 - #329 Frontend: Gamification menüpont + routing
|
||||
|
||||
### 🎯 Cél
|
||||
Gamification menüpont és routing létrehozása a Nuxt 3 admin frontendben.
|
||||
|
||||
### 📝 Megvalósítás
|
||||
- **`frontend_admin/layouts/default.vue`:** Gamification menücsoport beszúrása a sidebar `menuGroups` tömbjébe 6 menüelemmel (Játékmenet Beállítások, Események & Szezonok, Felhasználói Adatok, Gamification HQ, Rendszer Konfig, Rendszerparaméterek)
|
||||
- **`frontend_admin/pages/gamification/`:** 12 oldal létrehozása:
|
||||
- `index.vue` — Gamification HQ Dashboard (stat kártyák, gyors műveletek, pontnapló, top 5 ranglista)
|
||||
- `point-rules.vue`, `levels.vue`, `badges.vue` — Játékmenet beállítások
|
||||
- `seasons.vue`, `competitions.vue` — Események & Szezonok
|
||||
- `users/index.vue`, `users/[id].vue` — Felhasználói statisztikák
|
||||
- `leaderboard.vue`, `ledger.vue` — Ranglista és Pontnapló
|
||||
- `config.vue`, `parameters.vue` — Rendszer konfiguráció
|
||||
- **Routing:** Nuxt 3 file-based routing automatikusan generálja a route-okat
|
||||
- **Build:** Sikeres Nuxt build (Vite + Nitro), konténer újraindítva
|
||||
- **Gitea #329:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gitea #330: Gamification Dashboard (Frontend Admin)
|
||||
|
||||
### 🎯 Cél
|
||||
Gamification HQ Dashboard oldal (`/gamification/index.vue`) elkészítése az admin felülethez, stat kártyákkal, gyors műveletekkel, pontnaplóval és top 5 ranglistával.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- **`backend/app/api/v1/endpoints/admin_gamification.py`:**
|
||||
- Új `GET /admin/gamification/dashboard-summary` végpont hozzáadva, ami összesíti: összes felhasználó, aktív szezon neve, függő hozzájárulások száma, mai XP
|
||||
- `list_points_ledger` végpont javítva: `user_name` mező hozzáadva (User.email JOIN-nel)
|
||||
- `datetime.utcnow()` → `datetime.now(timezone.utc)` deprecation fix
|
||||
- **`frontend_admin/pages/gamification/index.vue`:**
|
||||
- API hívás átirányítva a dedikált `/api/v1/admin/gamification/dashboard-summary` végpontra
|
||||
- Leaderboard adatok mapping-je kiegészítve: `username`/`current_level`/`total_xp` mezők támogatása a backend válaszhoz igazodva
|
||||
- **Sync Engine:** ✅ 1284 elem szinkronban, 0 hiba
|
||||
- **Gitea #330:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gitea #331: Frontend Pontszabályok + Szintek CRUD oldal (admin)
|
||||
|
||||
### 🎯 Cél
|
||||
A Gamification admin felület Pontszabályok és Szintek CRUD oldalainak implementálása a Nuxt 3 admin frontendben.
|
||||
4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban.
|
||||
|
||||
### 🔧 Változtatások
|
||||
|
||||
- **`frontend_admin/pages/gamification/point-rules.vue`:**
|
||||
- Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, soft-delete (is_active=False)
|
||||
- Adattábla: ID, action_key, points, description, is_active oszlopok
|
||||
- Create/Edit modal: action_key, points, description, is_active mezők validációval
|
||||
- Delete confirmation modal soft-delete-hez
|
||||
- 409 Conflict kezelés (duplikált action_key)
|
||||
- Toast értesítések minden művelethez
|
||||
- API végpont: `/api/v1/admin/gamification/point-rules`
|
||||
**FIX 1 - Silent Rollback (PATCH endpoint):**
|
||||
- [`update_provider()`](backend/app/api/v1/endpoints/admin_providers.py:1147) `db.commit()` köré `try/except IntegrityError` blokk került
|
||||
- IntegrityError esetén `db.rollback()` + `HTTPException(400)` a csendes 200 OK helyett
|
||||
|
||||
- **`frontend_admin/pages/gamification/levels.vue`:**
|
||||
- Teljes CRUD implementáció: listázás, létrehozás, szerkesztés
|
||||
- Adattábla: level_number, rank_name, min_points, is_penalty oszlopok
|
||||
- Create/Edit modal: level_number, rank_name, min_points, is_penalty mezők validációval
|
||||
- Vizuális szint fa diagram progress bar-okkal
|
||||
- 409 Conflict kezelés (duplikált level_number)
|
||||
- Toast értesítések minden művelethez
|
||||
- API végpont: `/api/v1/admin/gamification/level-configs`
|
||||
**FIX 2 - Unique Constraint on Restore:**
|
||||
- [`_create_provider_validation()`](backend/app/api/v1/endpoints/admin_providers.py:198) átírva PostgreSQL `INSERT ... ON CONFLICT DO UPDATE` (UPSERT) használatára
|
||||
- A `uq_voter_provider_validation` constraint tiszteletben tartva
|
||||
|
||||
- **Build:** ✅ Sikeres Nuxt build a `sf_admin_frontend` konténerben
|
||||
- **Gitea #331:** ✅ Elkészült
|
||||
**FIX 3 - Wrong Frontend URL:**
|
||||
- Ellenőrizve: a frontend [`[id].vue`](frontend_admin/pages/providers/[id].vue:761) már a helyes `/api/v1/admin/providers/{id}/validations` URL-t használja
|
||||
|
||||
## 2026-06-29 - Gitea #332: Frontend: Kitüntetések (Badge) kezelő oldal
|
||||
**FIX 4 - AuditLog Attribute Error:**
|
||||
- [`get_provider_history()`](backend/app/api/v1/endpoints/admin_providers.py:1029) `AuditLog.created_at` → `AuditLog.timestamp`
|
||||
- `timestamp=log.created_at` → `timestamp=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
|
||||
A Gamification admin felület Kitüntetések (Badge) CRUD oldalának implementálása a Nuxt 3 admin frontendben. A backend API végpontok már léteztek a [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py)-ban (GET/POST/PUT/DELETE `/admin/gamification/badges`).
|
||||
Két P0 hibajavítás az Admin Provider Details oldalon.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
|
||||
- **`frontend_admin/pages/gamification/badges.vue`:**
|
||||
- Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, törlés
|
||||
- Adattábla: ID, Név, Leírás, Ikon (kép előnézettel), Műveletek oszlopok
|
||||
- Create/Edit modal: name (kötelező, max 100), description (kötelező, max 500), icon_url (opcionális URL élő előnézettel)
|
||||
- Delete confirmation modal: badge név és leírás megjelenítése
|
||||
- 409 Conflict kezelés (duplikált név)
|
||||
- Toast értesítések minden művelethez (siker/hiba)
|
||||
- Loading, error és empty állapotok kezelése
|
||||
- Auth middleware (`useAuth()`)
|
||||
- API végpont: `/api/v1/admin/gamification/badges`
|
||||
**Bug #1 - `get_provider_validations()` 500 error:**
|
||||
- [`admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1018) — `v.voter.display_name` → `v.voter.email`
|
||||
- Root cause: `User` modellben nincs `display_name` mező
|
||||
|
||||
### ✅ Eredmények
|
||||
- **GET /admin/gamification/badges:** ✅ 200 OK (2 meglévő badge listázva)
|
||||
- **POST /admin/gamification/badges:** ✅ 201 Created (új badge létrehozva egyedi névvel)
|
||||
- **PUT /admin/gamification/badges/{id}:** ✅ 200 Updated (badge adatok módosítva)
|
||||
- **DELETE /admin/gamification/badges/{id}:** ✅ 204 No Content (badge törölve, GET visszaadja a maradékot)
|
||||
- **Sync Engine:** ✅ Ellenőrizve
|
||||
- **Gitea #332:** ✅ Elkészült
|
||||
**Bug #2 - Dead "Szerkesztés" gomb:**
|
||||
- [`[id].vue`](frontend_admin/pages/providers/[id].vue:540) — Edit modal template hozzáadva (name, city, address, contact, category mezőkkel)
|
||||
- [`[id].vue`](frontend_admin/pages/providers/[id].vue:603) — 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
|
||||
|
||||
## 2026-06-29 - Gitea #333: Frontend Szezonok + Versenyek kezelő oldal
|
||||
### ✅ 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 gamification admin felület Szezonok (seasons) és Versenyek (competitions) kezelő oldalainak implementálása a meglévő backend API végpontokra építve.
|
||||
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
|
||||
- **`frontend_admin/pages/gamification/seasons.vue`** - Teljes CRUD implementáció: kártya nézet, create/edit modal, aktiválás megerősítéssel, státusz badge-ek (active/inactive), dátumtartomány megjelenítés
|
||||
- **`frontend_admin/pages/gamification/competitions.vue`** - Teljes CRUD implementáció: grid kártya nézet, szezon szűrő dropdown, create/edit modal JSON rules szerkesztővel, státusz badge-ek (draft/active/completed/cancelled)
|
||||
|
||||
### ✅ Eredmény
|
||||
- Build: ✅ Sikeres (Nuxt build hiba nélkül)
|
||||
- Backend API: már implementálva (`admin_gamification.py`)
|
||||
- Menüpontok: már konfigurálva (`default.vue`)
|
||||
- **Gitea #333:** ✅ Elkészült
|
||||
**1. [`backend/app/models/identity/social.py`](backend/app/models/identity/social.py:55)**
|
||||
- `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)`
|
||||
|
||||
## 2026-06-29 - Gitea #334: Frontend: Felhasználói statisztikák + büntetés admin nézet (penalty)
|
||||
**2. [`backend/app/models/marketplace/service.py`](backend/app/models/marketplace/service.py:40)**
|
||||
- `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`](backend/app/api/v1/endpoints/admin_providers.py:126)**
|
||||
- `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`](backend/app/schemas/provider.py:137)**
|
||||
- `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 Gamification admin felület felhasználói statisztikák oldalának (`users/index.vue`) és felhasználó részletes nézetének (`users/[id].vue`) implementálása, büntetés/jutalom funkciókkal.
|
||||
|
||||
### 🔧 Eredmények
|
||||
|
||||
**1. BACKEND ELLENŐRZÉS:** ✅ PASS
|
||||
- `admin_gamification.py` router már teljesen implementálva volt (1098 sor)
|
||||
- Minden szükséges végpont létezik: user-stats list/get/update, penalty POST, reward POST, points-ledger, contributions
|
||||
- `GamificationService.process_activity()` támogatja a penalty/reward admin műveleteket
|
||||
|
||||
**2. FRONTEND `users/index.vue`:** ✅ Implementálva
|
||||
- Felhasználói statisztikák adattábla (XP, szint, pontok, büntetés, restrikció, aktivitás)
|
||||
- Szűrők: szint, minimum/maximum XP, büntetés státusz
|
||||
- Lapozás (offset/limit alapú)
|
||||
- Linkek a részletes nézetre
|
||||
|
||||
**3. FRONTEND `users/[id].vue`:** ✅ Implementálva
|
||||
- Statisztika kártyák: XP, szint, pontok, social pont, büntetés, restrikció, kvóta, kitiltás
|
||||
- Aktivitás mutatók: szolgáltatások, felfedezések, validációk, szolgáltatók
|
||||
- **Büntetés űrlap:** POST `/admin/gamification/user-stats/{id}/penalty` (amount + reason)
|
||||
- **Jutalom űrlap:** POST `/admin/gamification/user-stats/{id}/reward` (xp_amount + social_amount + reason)
|
||||
- Pontnapló tábla a felhasználóhoz tartozó ledger bejegyzésekkel
|
||||
|
||||
**4. ADATBÁZIS SZINKRONIZÁCIÓ:** ✅ PASS
|
||||
- sync_engine: 1284 elem OK, 0 hiba, 0 extra elem
|
||||
- A rendszer tökéletesen szinkronban van
|
||||
|
||||
### ✅ Eredmény
|
||||
- Backend: ✅ Már implementálva (admin_gamification.py)
|
||||
- Frontend users/index.vue: ✅ Teljes implementáció (szűrők, tábla, lapozás)
|
||||
- Frontend users/[id].vue: ✅ Teljes implementáció (statok, büntetés, jutalom, ledger)
|
||||
- Adatbázis: ✅ Szinkronban
|
||||
- **Gitea #334:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gitea #335: Frontend Ranglista Admin Nézet (Leaderboard)
|
||||
|
||||
### 🎯 Cél
|
||||
Admin ranglista nézet megvalósítása a gamification rendszerhez: backend API végpont + frontend admin oldal.
|
||||
|
||||
### 🔧 Eredmények
|
||||
|
||||
**1. BACKEND - Admin Leaderboard API végpont:** ✅
|
||||
- `GET /admin/gamification/leaderboard` végpont hozzáadva az [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py:1193) fájlhoz
|
||||
- Támogatja: pagination (limit/offset), filtering (level, min_xp, search), sorting (sort_by/sort_order)
|
||||
- Kétlépcsős eager loading: `joinedload(UserStats.user).joinedload(User.person)` a Person nevek eléréséhez
|
||||
- Explicit `onclause` a Person join-nál az `AmbiguousForeignKeysError` elkerülésére (User↔Person bidirekcionális FK)
|
||||
- `or_` import hozzáadva a SQLAlchemy import sorhoz
|
||||
|
||||
**2. FRONTEND - Leaderboard oldal:** ✅
|
||||
- [`leaderboard.vue`](frontend_admin/pages/gamification/leaderboard.vue) teljes implementáció:
|
||||
- Keresés név/email alapján
|
||||
- Szint filter (1-20), minimum XP filter
|
||||
- Rendezés (XP, Pontok, Social Points, Szint) + irány toggle
|
||||
- Adattábla 13 oszloppal (Rank, Név, Email, XP, Szint, Pontok, Social, Penalty, Restriction, Felfedezések, Szolgáltatások, Frissítve, Műveletek)
|
||||
- Rank badge-ek (arany/ezüst/bronz) top 3 helyezéshez
|
||||
- Lapozás first/prev/next/last + oldalméret választó (25/50/100/250)
|
||||
- Loading, error, empty állapotok
|
||||
- Link a felhasználói részletek oldalra
|
||||
|
||||
**3. TESZTELÉS:** ✅
|
||||
- Alap leaderboard lekérdezés: 12 user, XP szerint csökkenő
|
||||
- Szint filter (level=2): 7 találat
|
||||
- Min XP filter (min_xp=4000): 2 találat
|
||||
- Rendezés ascending (current_level): helyes sorrend
|
||||
- Keresés névre ("accip"): 1 találat (Tímea Accipe)
|
||||
- Keresés emailre ("profibot"): 6 találat
|
||||
- Keresés vezetéknévre ("Gyöngyössy"): 2 találat
|
||||
- Kombinált filter (level=2 & search=accip): 1 találat
|
||||
- Lapozás (offset=5, limit=3): helyes rank számozás
|
||||
- **Gitea #335:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gitea #336: Frontend Master Config & System Parameters Pages
|
||||
|
||||
### 🎯 Cél
|
||||
Két admin frontend oldal implementálása a Gamification 2.0 modulhoz:
|
||||
1. `config.vue` — GAMIFICATION_MASTER_CONFIG JSON szerkesztő hatás kalkulátorral
|
||||
2. `parameters.vue` — Gamification kategóriájú SystemParameter-ek DataTable inline szerkesztéssel
|
||||
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
|
||||
- `frontend_admin/pages/gamification/config.vue` — Teljes implementáció (~540 sor): 4 konfigurációs szekció (XP Logic, Penalty Logic, Conversion Logic, Level Rewards) csúszkás/inputos szerkesztéssel, Impact Calculator szint/aktivitás/szociális pont csúszkákkal, valós idejű számított értékekkel (napi XP, szintlépés XP, szociális kredit, napok a szintlépésig), Raw JSON szerkesztő validációval, mentés PUT /admin/gamification/master-config végpontra
|
||||
- `frontend_admin/pages/gamification/parameters.vue` — Teljes implementáció (~280 sor): DataTable key/value/category/scope_level/scope_id oszlopokkal, inline szerkesztő modal textarea-val, smart value parsing (JSON/Number/String auto-detection), mentés PUT /admin/gamification/system-params/{key} végpontra
|
||||
|
||||
### ✅ Eredmények
|
||||
- Backend API-k auditálva: GET/PUT /admin/gamification/master-config és GET/PUT /admin/gamification/system-params végpontok teljesen implementálva
|
||||
- Mindkét oldal Nuxt HMR-rel betöltődött és fordítási hiba nélkül fut a sf_admin_frontend konténerben (port 8502)
|
||||
- Auth pattern: useCookie('access_token') + Authorization: Bearer header
|
||||
- Dark theme: slate-800/emerald/amber/rose/violet/cyan színséma
|
||||
- **Gitea #336:** ✅ Elkészült
|
||||
**1. [`backend/app/api/v1/endpoints/admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1098)**
|
||||
- **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`)
|
||||
|
||||
## 2026-06-29 - Gitea #337: Frontend Pontnapló böngésző oldal (ledger.vue)
|
||||
### ✅ 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
|
||||
PointsLedger admin böngésző oldal elkészítése DataTable-lel, szűrőkkel, lapozással és CSV exporttal.
|
||||
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
|
||||
- `backend/app/api/v1/endpoints/admin_gamification.py` - `reason_search` paraméter hozzáadása a `GET /admin/gamification/points-ledger` végponthoz (ILIKE keresés a reason mezőben)
|
||||
- `frontend_admin/pages/gamification/ledger.vue` - Teljes implementáció: loading/error/empty állapotok, szűrősáv (user_id, date_from, date_to, reason_search), adattábla (ID, User, Pont, Büntetés, XP, Ok, Forrás, Dátum), lapozás (Előző/Következő), CSV export, toast értesítések
|
||||
- `frontend_admin/pages/providers/[id].vue` - "Szerkesztés" gomb átirányítása a modális helyett az új `/providers/{id}/edit` útvonalra
|
||||
|
||||
### ✅ API Teszt Eredmények
|
||||
- `GET /api/v1/admin/gamification/points-ledger?limit=5` → 200 OK (5 entry)
|
||||
- `GET /api/v1/admin/gamification/points-ledger?reason_search=test&limit=5` → 200 OK (5 entry, ILIKE filter működik)
|
||||
- `GET /api/v1/admin/gamification/points-ledger?user_id=1&limit=5` → 200 OK (4 entry)
|
||||
### 📝 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
|
||||
|
||||
- **Gitea #337:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gamification Admin E2E Teszt Suite (#338)
|
||||
## 2026-07-01 - P0 HOTFIX: Edit page data modification fix (3 bugs)
|
||||
|
||||
### 🎯 Cél
|
||||
Teljes körű E2E teszt suite létrehozása a Gamification admin felülethez, 10 tesztforgatókönyvvel.
|
||||
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
|
||||
- `backend/tests/e2e/test_gamification_admin_e2e.py` - LÉTREHOZVA: 995 soros E2E teszt suite
|
||||
|
||||
### 📋 Teszt forgatókönyvek
|
||||
1. **Point Rules CRUD** - Create, List, Update, Delete (soft-delete), Duplicate 409
|
||||
2. **Level Configs CRUD** - Create, List, Update, Duplicate 409
|
||||
3. **Badges CRUD** - Create, List, Update, Delete (hard-delete), Duplicate
|
||||
4. **Seasons CRUD + Activation** - Create, List, Update, Activate, Single active verification
|
||||
5. **Competitions CRUD** - Create, List, Update, Non-existent season 404
|
||||
6. **User Stats** - List, Detail (404), Reward, Penalty, Update
|
||||
7. **Master Config** - Get, Update, Verify
|
||||
8. **System Params** - List, Update
|
||||
9. **Points Ledger** - List, Pagination, Reason search, User filter
|
||||
10. **Permission Check** - Regular user without gamification:manage gets 403
|
||||
11. **Dashboard Summary** - Verify response structure
|
||||
**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)
|
||||
|
||||
### ✅ Teszt Eredmények
|
||||
- **40/40 passed, 0 failed** ✅
|
||||
- Minden admin gamification végpont lefedve
|
||||
- Permission teszt: asyncpg-vel aktivált user, email verification-en keresztül
|
||||
- Superadmin bypass token (`dev_bypass_active`) használata admin műveletekhez
|
||||
**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
|
||||
|
||||
- **Gitea #338:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Gamification Nyelvi Modul Audit (#339)
|
||||
|
||||
### 🎯 Cél
|
||||
A gamification backend és frontend admin modulok teljes körű nyelvi auditja - hardcoded stringek azonosítása és i18n javítási terv készítése.
|
||||
|
||||
### 🔧 Eredmények
|
||||
- **16 fájl** átvizsgálva (3 backend + 12 frontend Vue + 1 nuxt.config)
|
||||
- **Megállapítás:** A frontend admin 12 Vue oldalán 100%-ban hardcoded magyar nyelvű szövegek, sehol nincs `useI18n()` vagy `$t()` használat
|
||||
- **Backend:** Kevert magyar/angol hardcoded hibaüzenetek, keménykódolt kvíz (magyar), achievement címek (angol)
|
||||
- **Lokációs fájlok:** Egyetlen gamification kulcs sem található a `frontend_admin/locales/*.json` és `backend/static/locales/*.json` fájlokban
|
||||
- **Javítási javaslat:** 7 fázisú terv a teljes i18n migrációhoz (15-20 fájl módosítás)
|
||||
- **Dokumentáció:** `docs/gamification_i18n_audit_and_fix_proposal.md` - részletes audit és fix proposal
|
||||
|
||||
- **Gitea #339:** ✅ Audit elkészült
|
||||
|
||||
## 2026-06-29 - Gitea #340: Gamification i18n kulcsok felvétele (Fázis 1/7)
|
||||
|
||||
### 🎯 Cél
|
||||
Gamification i18n kulcsok felvétele a `frontend_admin/locales/en.json` és `hu.json` fájlokba a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentációban definiált kulcs struktúra alapján.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- `frontend_admin/locales/en.json` — Hozzáadva a `gamification` szekció 11 al-szekcióval (dashboard, badges, competitions, config, leaderboard, ledger, levels, parameters, point_rules, seasons, users)
|
||||
- `frontend_admin/locales/hu.json` — Hozzáadva a `gamification` szekció magyar fordítással
|
||||
|
||||
### ✅ Eredmény
|
||||
Mindkét JSON fájl validálva (Python json.load), szintaktikailag helyes. A gamification szótár teljes egészében elérhető mind angol, mind magyar nyelven.
|
||||
- **Gitea #340:** ✅ Implementáció kész
|
||||
|
||||
## 2026-06-29 - Gitea #341: Fázis 2/7 - 12 Vue oldal átalakítása useI18n() és t() hívásokkal
|
||||
|
||||
### 🎯 Cél
|
||||
A 12 gamification admin Vue oldal hardcoded magyar szövegeinek lecserélése `useI18n()` + `t()` hívásokra, a #340-ben felvett i18n kulcsok használatával.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- `frontend_admin/i18n/locales/en.json` — Kiegészítve hiányzó gamification kulcsokkal (icon_hint, icon_preview, create_btn, unknown_error, name_placeholder, desc_placeholder, select_season, rules_placeholder, season_id_label)
|
||||
- `frontend_admin/i18n/locales/hu.json` — Kiegészítve hiányzó gamification kulcsokkal (magyar fordítás)
|
||||
- `frontend_admin/pages/gamification/badges.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/competitions.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/config.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/index.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/leaderboard.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/ledger.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/levels.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/parameters.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/point-rules.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/seasons.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/users/index.vue` — useI18n() + t() konverzió
|
||||
- `frontend_admin/pages/gamification/users/[id].vue` — useI18n() + t() konverzió
|
||||
|
||||
### ✅ Eredmény
|
||||
- Build: ✅ Sikeres (`✓ built in 6.95s`)
|
||||
- Mind a 12 Vue oldal átalakítva: `const { t } = useI18n()` hozzáadva, minden hardcoded string `t('gamification.xxx.yyy')` hívással helyettesítve
|
||||
- Interpoláció támogatás: delete confirmációk, penalty/reward sikerüzenetek, paraméter frissítés üzenetek
|
||||
- **Gitea #341:** ✅ Elkészült
|
||||
|
||||
## 2026-06-29 - Debug: JSON Parse Error javítás (Gitea #341 utómunka)
|
||||
|
||||
### 🐛 Hiba
|
||||
Nuxt runtime error: `[plugin json] i18n/locales/hu.json: Could not parse JSON file` — a build után a böngészőben JSON parse hiba lépett fel.
|
||||
|
||||
### 🔧 Javított hibák
|
||||
1. **hu.json (line 377):** `'{"type": "service_submission", ...}'` — a JSON string értékeknél aposztróf (`'`) helyett dupla idézőjel (`"`) kell, escape-elve: `"{\"type\": \"service_submission\", ...}"`
|
||||
2. **en.json (line 377):** Ugyanez a hiba — aposztróf használata JSON stringben
|
||||
3. **hu.json (truncated):** A fájl csonkán íródott ki — hiányzott a `seasons`, `users`, `user_detail` szekció és a záró `}}}`
|
||||
|
||||
### ✅ Eredmény
|
||||
- Mindkét JSON fájl validálva Python `json.load()`-dal: ✅ Sikeres
|
||||
- Build: ✅ Sikeres (`✓ built in 6.88s`)
|
||||
- Mind a 12 gamification i18n szekció elérhető mindkét nyelvben
|
||||
|
||||
## 2026-06-30 - [#342] Backend i18n helper megírása (app/core/i18n.py)
|
||||
|
||||
### 🎯 Cél
|
||||
Backend i18n segédosztály létrehozása a `backend/static/locales/*.json` fájlok betöltésére és kulcs alapú szöveg lekérésre.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- `backend/app/core/i18n.py` - Teljes átírás: JSON fájlokból cache-elt szótár építése, dot-notation kulcsfeloldás, `{{variable}}` interpoláció, context locale integráció, EN fallback, `reload_locales()` támogatás
|
||||
|
||||
### ✅ Eredmények
|
||||
- `t(key, lang, **kwargs)` - Dot-notation kulcsfeloldás és `{{variable}}` interpoláció
|
||||
- `get_locale(lang)` - Teljes nyelvi szótár visszaadása
|
||||
- `reload_locales()` - Cache újratöltés futásidőben
|
||||
- Locale detekció: explicit `lang` param → context locale (I18nMiddleware) → `"hu"` default
|
||||
- Fallback lánc: requested lang → EN → bármely elérhető nyelv → kulcsnév
|
||||
- 10/10 teszt sikeres (EN, HU, változók, fallback, context, reload)
|
||||
|
||||
## 2026-06-30 - [#345] Fázis 6/7: Kvíz tartalom kiszervezése JSON/DB-be nyelvi kulcsokkal
|
||||
|
||||
### 🎯 Cél
|
||||
A keménykódolt magyar nyelvű kvíz kérdések, válaszok és magyarázatok kiszervezése a kódból nyelvi JSON fájlokba.
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- `backend/static/quiz/en.json` - **LÉTREHOZVA**: Angol nyelvű kvíz kérdések (3 db) JSON formátumban
|
||||
- `backend/static/quiz/hu.json` - **LÉTREHOZVA**: Magyar nyelvű kvíz kérdések (3 db) JSON formátumban
|
||||
- `backend/app/core/i18n.py` - **MÓDOSÍTVA**: `get_quiz_data()`, `reload_quiz_data()` függvények hozzáadva a kvíz JSON-ek cache-elt betöltéséhez
|
||||
- `backend/app/api/v1/endpoints/gamification.py` - **MÓDOSÍTVA**: `GET /quiz/questions` és `POST /quiz/answer` végpontok hardcoded adatainak kiváltása `get_quiz_data()` hívásokkal
|
||||
|
||||
### ✅ Eredmények
|
||||
- `get_quiz_data(lang)` - Kvíz kérdések betöltése nyelv szerinti JSON fájlokból, locale detekcióval (explicit lang → context locale → "hu" default → EN fallback)
|
||||
- `reload_quiz_data()` - Kvíz cache újratöltés futásidőben
|
||||
- 3 kvíz kérdés mindkét nyelven (HU + EN), minden opcióval és magyarázattal
|
||||
- Szintaxis ellenőrzés: ✅ Sikeres
|
||||
- Kvíz adatbetöltés teszt: ✅ Sikeres (HU: 3, EN: 3, DE fallback: 3)
|
||||
|
||||
## 2026-06-30 - [#346] Fázis 7/7: Tesztelés - magyar és angol nyelvű gamification felület
|
||||
|
||||
### 🎯 Cél
|
||||
A gamification i18n migráció teljes körű tesztelése: backend API lokalizált hibaüzenetek, kvíz rendszer nyelvfüggő működése, achievement címek nyelvfüggő megjelenítése, nyelvváltás konzisztencia, hiányzó fordítás fallback viselkedés, frontend build ellenőrzés.
|
||||
|
||||
### 🔧 Eredmények
|
||||
|
||||
**1. BACKEND E2E TESZTEK (Admin Gamification):** ✅ 40/40 PASS
|
||||
- Point Rules CRUD: ✅ 5/5
|
||||
- Level Configs CRUD: ✅ 5/5
|
||||
- Badges CRUD: ✅ 5/5
|
||||
- Seasons CRUD: ✅ 5/5
|
||||
- Competitions CRUD: ✅ 5/5
|
||||
- User Stats: ✅ 4/4
|
||||
- Master Config: ✅ 2/2
|
||||
- System Params: ✅ 2/2
|
||||
- Points Ledger: ✅ 2/2
|
||||
- Permission Check: ✅ 3/3
|
||||
- Dashboard Summary: ✅ 2/2
|
||||
|
||||
**2. BACKEND I18N API TESZTEK:** ✅ 15/15 PASS
|
||||
- Localized Error Messages (HU/EN): ✅ 4/4
|
||||
- Quiz Language-Dependent Operation: ✅ 3/3
|
||||
- Achievement Titles Language Display: ✅ 1/1
|
||||
- Language Switch Consistency: ✅ 4/4
|
||||
- Missing Translation Fallback: ✅ 3/3
|
||||
|
||||
**3. FRONTEND ADMIN BUILD:** ✅ Sikeres
|
||||
- Nuxt 3 build: 313 modules transformed, 7.96s client + 6.71s server
|
||||
|
||||
**4. FRONTEND I18N ELLENŐRZÉS:** ✅ 11/11 oldal
|
||||
- Minden gamification admin oldal használja a `useI18n().t()` függvényt
|
||||
- en.json (817 sor) és hu.json (719 sor) teljes gamification szekcióval
|
||||
|
||||
### 🔧 Módosított fájlok
|
||||
- `backend/tests/e2e/test_gamification_i18n_api.py` - Login fix: `json=` → `data=` (OAuth2PasswordRequestForm kompatibilitás)
|
||||
### ✅ 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) ✅
|
||||
|
||||
Reference in New Issue
Block a user