# 🔬 identity Séma Teljes Audit (2026-06-06) ## Áttekintés Az `identity` séma **9 táblát** tartalmaz, amelyek együttesen a teljes felhasználói identitáskezelést lefedik: a természetes személyt (Person), a login entitást (User), a pénztárcát, a közösségi kapcsolatokat, a bizalmi profilt, az eszközöket és a vouchereket. --- ## 1. 📊 TÁBLÁK ÉS ADATAIK ### 1.1 👤 `users` — Login Entitás (Központi tábla) **Oszlopok (24 db):** | Oszlop | Típus | Kötelező? | Default | Leírás | |--------|-------|-----------|---------|--------| | `id` | INTEGER | PK | nextval(...) | Elsődleges kulcs | | `email` | VARCHAR(255) | **YES** | — | E-mail cím (UNIQUE) | | `hashed_password` | VARCHAR | NO | — | Hash-elt jelszó | | `role` | USERRODE (ENUM) | **YES** | 'user' | Szerepkör (lásd ENUM lent) | | `person_id` | BIGINT | NO | — | FK → persons(id) | | `subscription_plan` | VARCHAR(30) | **YES** | 'FREE' | Előfizetési csomag | | `subscription_expires_at` | TIMESTAMPTZ | NO | — | Előfizetés lejárata | | `is_vip` | BOOLEAN | **YES** | false | VIP státusz | | `referral_code` | VARCHAR(20) | NO | — | Meghívókód (UNIQUE) | | `referred_by_id` | INTEGER | NO | — | FK → users(id) (aki meghívta) | | `current_sales_agent_id` | INTEGER | NO | — | FK → users(id) (értékesítő) | | `is_active` | BOOLEAN | **YES** | false | Aktív-e a fiók | | `is_deleted` | BOOLEAN | **YES** | false | Soft-delete | | `folder_slug` | VARCHAR(12) | NO | — | Fájltároló slug (UNIQUE) | | `preferred_language` | VARCHAR(5) | **YES** | 'hu' | Nyelv | | `region_code` | VARCHAR(5) | **YES** | 'HU' | Régió | | `preferred_currency` | VARCHAR(3) | **YES** | 'HUF' | Pénznem | | `ui_mode` | VARCHAR(20) | **YES** | 'personal' | UI mód (personal/fleet) | | `scope_level` | VARCHAR(30) | **YES** | 'individual' | Scope szint | | `scope_id` | VARCHAR(50) | NO | — | Scope azonosító | | `custom_permissions` | JSON | **YES** | '{}' | Egyedi jogosultságok | | `alternative_emails` | JSON | **YES** | '[]' | Alternatív e-mailek | | `email_history` | JSON | **YES** | '[]' | E-mail cím történet | | `created_at` | TIMESTAMPTZ | **YES** | — | Létrehozás ideje | **Indexek (7 db):** - `users_pkey` — UNIQUE BTREE (id) - `users_email_key` — UNIQUE BTREE (email) - `users_referral_code_key` — UNIQUE BTREE (referral_code) - `ix_identity_users_folder_slug` — UNIQUE BTREE (folder_slug) - `ix_identity_users_email` — UNIQUE BTREE (email) (duplikáció!) - `ix_identity_users_id` — BTREE (id) --- ### 1.2 🧑 `persons` — Természetes Személy **Oszlopok (22 db):** | Oszlop | Típus | Kötelező? | Default | Leírás | |--------|-------|-----------|---------|--------| | `id` | BIGINT | PK | nextval(...) | Elsődleges kulcs | | `user_id` | INTEGER | NO | — | FK → users(id) (aktív fiók) | | `id_uuid` | UUID | **YES** | gen_random_uuid() | Publikus UUID | | `address_id` | UUID | NO | — | FK → system.addresses(id) | | `identity_hash` | VARCHAR(64) | NO | — | Hash: Név+Anyja+DOB (UNIQUE) | | `last_name` | VARCHAR | **YES** | — | Vezetéknév | | `first_name` | VARCHAR | **YES** | — | Keresztnév | | `phone` | VARCHAR | NO | — | Telefonszám | | `mothers_last_name` | VARCHAR | NO | — | Anyja vezetékneve | | `mothers_first_name` | VARCHAR | NO | — | Anyja keresztneve | | `birth_place` | VARCHAR | NO | — | Születési hely | | `birth_date` | TIMESTAMP | NO | — | Születési dátum | | `identity_docs` | JSON | **YES** | '{}' | Okmányok (ID_CARD, LICENSE, stb.) | | `ice_contact` | JSON | **YES** | '{}' | Vészhelyzeti kapcsolattartó | | `lifetime_xp` | BIGINT | **YES** | -1 | Élettapasztalat pont | | `penalty_points` | INTEGER | **YES** | -1 | Büntetőpontok | | `social_reputation` | NUMERIC(3,2) | **YES** | 0.00 | Társadalmi reputáció | | `is_sales_agent` | BOOLEAN | **YES** | true | Értékesítő-e | | `is_active` | BOOLEAN | **YES** | true | Aktív-e | | `is_ghost` | BOOLEAN | **YES** | false | Ghost (soft-delete) | | `merged_into_id` | BIGINT | NO | — | Összevonva ebbe a Person-ba (csak ORM szinten FK) | | `created_at` | TIMESTAMPTZ | **YES** | — | Létrehozás | | `updated_at` | TIMESTAMPTZ | NO | — | Módosítás | **Indexek (4 db):** - `persons_pkey` — UNIQUE BTREE (id) - `persons_id_uuid_key` — UNIQUE BTREE (id_uuid) - `ix_identity_persons_identity_hash` — UNIQUE BTREE (identity_hash) - `ix_identity_persons_id` — BTREE (id) --- ### 1.3 💰 `wallets` — Pénztárca **Oszlopok (6 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `id` | INTEGER | PK | nextval(...) | | `user_id` | INTEGER | **YES** | — (UNIQUE, FK → users(id)) | | `earned_credits` | NUMERIC(18,4) | **YES** | 0 | | `purchased_credits` | NUMERIC(18,4) | **YES** | 0 | | `service_coins` | NUMERIC(18,4) | **YES** | 0 | | `currency` | VARCHAR(3) | **YES** | — | **Indexek:** - `wallets_pkey` — UNIQUE BTREE (id) - `wallets_user_id_key` — UNIQUE BTREE (user_id) --- ### 1.4 🎫 `active_vouchers` — Aktív Voucher-ek **Oszlopok (6 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `id` | INTEGER | PK | nextval(...) | | `wallet_id` | INTEGER | **YES** | — (FK → wallets(id) ON DELETE CASCADE) | | `amount` | NUMERIC(18,4) | **YES** | — | | `original_amount` | NUMERIC(18,4) | **YES** | — | | `expires_at` | TIMESTAMPTZ | **YES** | — | | `created_at` | TIMESTAMPTZ | **YES** | now() | --- ### 1.5 🤝 `social_accounts` — Közösségi Bejelentkezés **Oszlopok (7 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `id` | INTEGER | PK | nextval(...) | | `user_id` | INTEGER | **YES** | — (FK → users(id) ON DELETE CASCADE) | | `provider` | VARCHAR(50) | **YES** | — | | `social_id` | VARCHAR(255) | **YES** | — | | `email` | VARCHAR(255) | **YES** | — | | `extra_data` | JSON | **YES** | '{}' | | `created_at` | TIMESTAMPTZ | **YES** | now() | **Unique:** `uix_social_provider_id` (provider, social_id) **Indexek:** social_id --- ### 1.6 🏆 `user_trust_profiles` — Gondos Gazda Index **Oszlopok (9 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `user_id` | INTEGER | **PK+FK** | — (FK → users(id) ON DELETE CASCADE) | | `trust_score` | INTEGER | **YES** | 0 | | `maintenance_score` | NUMERIC(5,2) | **YES** | 0.00 | | `quality_score` | NUMERIC(5,2) | **YES** | 0.00 | | `preventive_score` | NUMERIC(5,2) | **YES** | 0.00 | | `identity_score` | INTEGER | **YES** | 0 | | `verification_level` | INTEGER | **YES** | 0 | | `verified_channels` | JSONB | **YES** | '{}' | | `identity_risk_flag` | BOOLEAN | **YES** | false | | `last_calculated` | TIMESTAMPTZ | **YES** | now() | --- ### 1.7 📧 `verification_tokens` — Verifikációs Tokenek **Oszlopok (8 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `id` | INTEGER | PK | nextval(...) | | `token` | UUID | **YES** | — (UNIQUE) | | `user_id` | INTEGER | **YES** | — (FK → users(id) ON DELETE CASCADE) | | `token_type` | VARCHAR(20) | **YES** | — | | `extra_data` | JSON | NO | '{}' | | `created_at` | TIMESTAMPTZ | **YES** | now() | | `expires_at` | TIMESTAMPTZ | **YES** | — | | `is_used` | BOOLEAN | **YES** | — | --- ### 1.8 📱 `devices` — Eszközök **Oszlopok (4 db):** | Oszlop | Típus | Kötelező? | |--------|-------|-----------| | `fingerprint_hash` | VARCHAR(255) | **PK** | | `risk_score` | INTEGER | **YES** (default 100) | | `is_banned` | BOOLEAN | **YES** (default false) | | `created_at` | TIMESTAMPTZ | **YES** | --- ### 1.9 🔗 `user_device_links` — Eszköz-Felhasználó Kapcsolat **Oszlopok (6 db):** | Oszlop | Típus | Kötelező? | Default | |--------|-------|-----------|---------| | `id` | UUID | **PK** | — | | `user_id` | INTEGER | **YES** | — (FK → users(id) ON DELETE CASCADE) | | `device_hash` | VARCHAR(255) | **YES** | — (FK → devices(fingerprint_hash) ON DELETE CASCADE) | | `first_seen_at` | TIMESTAMPTZ | **YES** | — | | `last_seen_at` | TIMESTAMPTZ | NO | — | | `login_count` | INTEGER | **YES** | 1 | --- ## 2. 🔗 KAPCSOLATOK (FOREIGN KEYS) ### 2.1 Belső Kapcsolatok (identity → identity) ``` users.person_id ─────────────► persons.id persons.user_id ─────────────► users.id (aktív fiók) users.referred_by_id ────────► users.id (MLM: ki hívta meg) users.current_sales_agent_id ► users.id (értékesítő) social_accounts.user_id ─────► users.id [CASCADE] verification_tokens.user_id ─► users.id [CASCADE] user_trust_profiles.user_id ─► users.id [CASCADE] wallets.user_id ─────────────► users.id user_device_links.user_id ───► users.id [CASCADE] wallets ◄──────────────────── active_vouchers.wallet_id [CASCADE] devices ◄──────────────────── user_device_links.device_hash [CASCADE] ``` ### 2.2 Külső Kapcsolatok (identity → system) ``` persons.address_id ──────────► system.addresses(id) ``` ### 2.3 ORM Szintű Kapcsolatok (nincs DB FK constraint) ``` persons.merged_into_id ──────► persons(id) -- SQLAlchemy ORM, use_alter=True persons.user_id ─────────────► users(id) -- SQLAlchemy ORM (fk_person_active_user), use_alter=True ``` --- ## 3. 🌐 KÜLSŐ HIVATKOZÁSOK (Más sémák hivatkoznak identity táblákra) | Séma | Tábla | Oszlop | Hivatkozott tábla | |------|-------|--------|-------------------| | `audit` | audit_logs | user_id | identity.users | | `audit` | financial_ledger | user_id, person_id | identity.users, identity.persons | | `audit` | operational_logs | user_id | identity.users | | `finance` | withdrawal_requests | user_id | identity.users | | `fleet` | organization_members | user_id, person_id | identity.users, identity.persons | | `gamification` | points_ledger | user_id | identity.users | | `gamification` | user_badges | user_id | identity.users | | `gamification` | user_contributions | user_id | identity.users | | `gamification` | user_scores | user_id | identity.users | | `gamification` | user_stats | user_id | identity.users | | `marketplace` | service_requests | user_id | identity.users | | `marketplace` | service_reviews | user_id | identity.users | | `marketplace` | votes | user_id | identity.users | | `system` | internal_notifications | user_id | identity.users | | `system` | user_scores_deprecated | user_id | identity.users | **Összesen: 17 külső FK hivatkozás 7 különböző sémából.** --- ## 4. 🏷️ ENUM TÍPUSOK ### `identity.userrole` ENUM | Érték | Leírás | |-------|--------| | `owner_old` | (régi, deprecated) | | `ADMIN` | Rendszergazda | | `FLEET_MANAGER` | Flottakezelő | | `DRIVER` | Sofőr | | `owner` | Tulajdonos | | `admin` | Adminisztrátor | | `user` | **Alapértelmezett** — sima felhasználó | **Megjegyzés:** Több érték is duplikált (pl. owner/owner_old, ADMIN/admin). Valószínűleg refaktorálásra szorul, hogy csak a kívánt 9 érték maradjon meg. --- ## 5. 🗺️ KAPCSOLATI ÁBRA (ERD) ``` ┌──────────────────────────────────┐ │ identity.users │ ◄──── social_accounts │ (24 oszlop - központi entitás) │ ◄──── verification_tokens └───┬────┬────┬────┬────┬──────────┘ ◄──── user_trust_profiles │ │ │ │ │ ◄──── wallets │ │ │ │ │ ◄──── user_device_links ┌───────────┘ │ │ │ └───────────────┐ ▼ ▼ ▼ ▼ ▼ ┌──────────┐ ┌───────────┐ ┌───────────────┐ ┌──────────┐ │ persons │ │ wallets │ │ devices │ │ (saját) │ │(22 oszl.)│ │ (6 oszl.) │ │ (4 oszlop) │ │ referrer │ └────┬─────┘ └─────┬─────┘ └───────┬───────┘ │ sales_ag.│ │ │ │ └──────────┘ ▼ ▼ ▼ system.addresses active_vouchers user_device_links (GPS, cím) (FIFO voucher) (kapcsolótábla) ``` --- ## 6. 📝 MEGJEGYZÉSEK 1. **Körkörös függőség:** A `users` és `persons` táblák között **körkörös FK** van: `users.person_id → persons(id)` és `persons.user_id → users(id)`. Ezt az ORM szinten `post_update=True` és `use_alter=True` paraméterekkel oldják fel. 2. **ORM-only FKs:** A `persons.merged_into_id` és a `persons.user_id` (második FK, `fk_person_active_user`) **csak ORM szinten** léteznek, adatbázis szintű FK constraint nélkül. 3. **JSON mezők:** 5 JSON típusú mező van a sémában, amelyek rugalmas adattárolást tesznek lehetővé: `identity_docs`, `ice_contact`, `custom_permissions`, `alternative_emails`, `email_history`, `extra_data` (social_accounts), `verified_channels`. 4. **UNIQUE megszorítások:** Összesen 7 UNIQUE constraint van, ezek közül az `identity_hash` a legkritikusabb — ez biztosítja a deduplikációt. --- ## 7. KÖVETKEZTETÉS Az identity séma **teljes körű emberközpontú identitáskezelést** valósít meg, amely lefedi: - ✅ Személyes adatok (Person) - ✅ Bejelentkezési adatok (User) - ✅ Pénzügyek (Wallet, Vouchers) - ✅ Okmányok (identity_docs JSON) - ✅ Közösségi kapcsolatok (Social accounts) - ✅ Bizalmi index (Trust Profile) - ✅ Eszközazonosítás (Devices) - ✅ MLM/Referral rendszer (referred_by, sales_agent) - ✅ Verifikáció (Verification tokens)