14 KiB
🔬 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
-
Körkörös függőség: A
userséspersonstáblák között körkörös FK van:users.person_id → persons(id)éspersons.user_id → users(id). Ezt az ORM szintenpost_update=Trueésuse_alter=Trueparaméterekkel oldják fel. -
ORM-only FKs: A
persons.merged_into_idés apersons.user_id(második FK,fk_person_active_user) csak ORM szinten léteznek, adatbázis szintű FK constraint nélkül. -
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. -
UNIQUE megszorítások: Összesen 7 UNIQUE constraint van, ezek közül az
identity_hasha 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)