Passa al contenuto principale

Riferimento completo delle tabelle

Lo schema public completo — ogni colonna di tutte le 45 tabelle, le 11 viste e l'unico enum. Le pagine di dominio spiegano il perché; questa pagina è il cosa. Usala come strumento di consultazione.

Notazione

PK = chiave primaria · FK → = chiave esterna verso table.column · N nella colonna Null = la colonna è nullable. I tipi sono i tipi Postgres reali. Questa pagina è generata dal database e riflette lo schema così come distribuito; quando una migrazione modifica una tabella, rigenera la sezione interessata.

La row-level security è abilitata su tutte le 45 tabelle

Il fatto che una colonna sia elencata qui non significa che un client browser possa leggerla. Molte tabelle sono service-role-only / deny-all (raggiungibili solo tramite edge function o la service key) — ad esempio crm_user_roles, player_roles, steam_id_allowlist, device_auth_requests, upload_credentials, tutte e quattro le tabelle growth, lobby_join_events, permissions/role_permissions. Le pagine di dominio annotano la postura RLS per ciascuna area; tratta le relazioni qui come logiche, non come una concessione di lettura.

Enum

EnumValori
game_storesteam · epic · gog · microsoft · other · riot · rockstar

Identità e accesso

→ pagina di dominio: Identità e accesso

playroll_users

L'hub. Indicizzata su user_id (UUID auth di Supabase).

ColonnaTipoNullNote
user_iduuidPK, FK → auth.users.id (ON DELETE CASCADE)
display_nametextN
avatar_urltextN
steam_idtextNUNIQUE
discord_idtextNUNIQUE
discord_usernametextN
contributor_tiertextTier corrente del programma (valore, non FK); default player.
credits_earnednumeric
credits_claimednumeric
created_attimestamptz
updated_attimestamptz
steam_usernametextN
steam_avatar_urltextN
steam_hoursintegerNArricchimento Steam ↓
steam_games_ownedintegerN
steam_levelintegerN
steam_profile_publicbooleanN
steam_account_createdbigintNTimestamp Unix
steam_account_age_daysintegerNCalcolato da trigger (playroll_users_fill_steam_age).
steam_vac_bannedbooleanN
steam_vac_bans_countintegerN
steam_game_bans_countintegerN
steam_days_since_last_banintegerN
steam_enriched_attimestamptzN
steam_friend_countinteger
steam_friends_publicbooleanN
friends_fetched_attimestamptzN
network_valueintegerAggregato da shadow_graph.
network_whale_countinteger
countrytextNAttribuzione ↓
languagetextN
utm_sourcetextN
utm_mediumtextN
utm_campaigntextN
referrertextN
device_typetextN
referral_codetextN
referred_bytextN
referral_countinteger
priority_scoreinteger

steam_id_allowlist

ColonnaTipoNullNote
steam_idtextPK
roletextFK → player_role_catalog.role; default pioneer.
notetextN
added_attimestamptz
added_bytextN
enabledboolean

auth_user_steam_lookup

ColonnaTipoNullNote
steam_idtextPK
user_iduuidFK → auth.users.id; UNIQUE. Mantenuta da auth_user_steam_lookup_sync_trg.
created_attimestamptz
updated_attimestamptz

steam_openid_nonces

ColonnaTipoNullNote
noncetextPK
seen_attimestamptz

player_role_catalog

ColonnaTipoNullNote
roletextPK
rankintegerPiù alto = più accesso.
descriptiontextN
created_attimestamptz

player_roles

ColonnaTipoNullNote
iduuidPK
user_iduuidFK → playroll_users.user_id
roletextFK → player_role_catalog.role
granted_attimestamptz
granted_bytextN

crm_user_roles

RBAC dello staff, indicizzata per email.

ColonnaTipoNullNote
emailtextPK
roletextCHECK admin / cm / vc / sales. Collegata per valore a role_permissions.role.
granted_attimestamptz
granted_bytextN
notestextN

permissions

ColonnaTipoNullNote
idintegerPK
resourcetext
actiontextCHECK read / write.
descriptiontextN
created_attimestamptz

role_permissions

ColonnaTipoNullNote
roletext
permission_idintegerFK → permissions.id
granted_bytextN
granted_attimestamptz

device_auth_requests

Legacy / superata — 0 righe, RLS deny-all, sostituita dal flusso di redirect steam-login.

ColonnaTipoNullNote
device_codetextPK
statustextDefault pending.
access_tokentextN
refresh_tokentextN
user_iduuidNNessuna FK.
user_profilejsonbN
created_attimestamptz
completed_attimestamptzN
expires_attimestamptzDefault now() + 10 min.

upload_credentials

Legacy / inutilizzata — 0 righe, nessun writer, RLS deny-all (solo service-key).

ColonnaTipoNullNote
mac_hashtextPK
user_idtextUNIQUE (text, non una FK uuid verso playroll_users).
created_attimestamptz
last_used_attimestamptzN
is_activeboolean

playroll_user_consents

Log dei consensi append-only (nessuna colonna revoked; le revoche sono nuove righe).

ColonnaTipoNullNote
iduuidPK
user_iduuidFK → auth.users.id (non playroll_users).
consent_typetextCHECK age_confirmation / tos / privacy / eula / edc_gameplay.
versiontext
accepted_attimestamptz
countrytextN
metadatajsonb{action:'withdrawal'} segna una revoca.
ip_addressinetN
user_agenttextN

contributor_status_projection

Proiezione lato app scritta da redeem-activation-code. Nessun PII. (Il portale possiede la tabella sorgente contributor_app_links.)

ColonnaTipoNullNote
app_user_iduuidPK, FK → auth.users.id (ON DELETE CASCADE).
contributor_iduuid
link_statustextCHECK verified (unico valore).
source_link_iduuid
steam_idtextN
linked_attimestamptz
source_updated_attimestamptz
last_synced_attimestamptz

Spina dorsale delle registrazioni

→ pagina di dominio: Spina dorsale delle registrazioni

recording_sessions

Indicizzata su un session_id di tipo text (rec-<epoch-ms>).

ColonnaTipoNullNote
session_idtextPK
user_idtext
game_nametextN
chunk_countintegerN
statustextDefault uploading.
client_ended_attimestamptzN
server_verified_attimestamptzN
created_attimestamptzN
updated_attimestamptzNMantenuta da trigger.
detected_resolutionjsonbN
game_slugtextN
recording_started_attimestamptzN
recording_ended_attimestamptzN
duration_secondsbigintNOrologio canonico della registrazione. CHECK ≥ 0.
required_artifact_modetextCHECK mp4_csv_json (default) / mp4_csv.
uploadability_statustextNCHECK uploadable / blocked / NULL.
block_reasontextN
lobby_iduuidNPer valore — nessuna FK (il binding alla lobby è imposto da trigger).
hw_snapshot_iduuidNFK → device_hw_snapshots.id
core_versiontextN
ui_versiontextN
installer_versiontextN
transcript_expectedbooleanImpostata a true a fine sessione se e solo se esiste _mic.aac (EC-407).
transcript_skippedbooleanScrivibile dal client tramite GRANT con scope + RLS (EC-409).
dismissedboolean"Nascondi dall'Activity" scrivibile dal client (EC-411).

s3_uploads

Una riga per file caricato. Si collega a una sessione per valore su session_id.

ColonnaTipoNullNote
iduuidPK
s3_keytext
s3_buckettextDefault playroll-captures.
user_idtext
upload_yearintegerChiave di partizione
upload_monthintegerCHECK 1–12.
upload_dayintegerCHECK 1–31.
session_idtextSi unisce a recording_sessions.session_id (valore).
chunk_dirtextN
filenametext
file_typetextmp4 / csv / json / ogg (legacy).
size_bytesbigintN
etagtextN
uploaded_attimestamptz
statustextCHECK uploaded (default) / processing / completed / failed.
lobby_iduuidNFK → lobbies.id (NOT VALID).
recording_started_attimestamptzN
recording_ended_attimestamptzN
game_slugtextNVerificata dal trigger s3_uploads_enforce_lobby_game_match (solo per i tag di lobby).
artifact_kindtextNNessun CHECK; derivata dal suffisso: video/input/meta/transcript; NULL = non classificato (EC-289).

device_hw_snapshots

Chiave di deduplicazione (user_id, hw_fingerprint).

ColonnaTipoNullNote
iduuidPK
created_attimestamptz
updated_attimestamptz
user_idtext
hw_fingerprinttext
cpu_modeltextN
cpu_architecturetextN
logical_processorsintegerN
physical_memory_mibbigintN
os_releasetextN
primary_gpu_vendortextN
primary_gpu_nametextN
primary_gpu_drivertextN
primary_gpu_driver_nvidiatextN
snapshotjsonbBlob HW completo.
sourcetextui_login (edge fn di login, predominante) / core_meta_json (Lambda di upload); default core_meta_json.

pipeline_sessions

PK composita (session_id, environment) — una riga per sessione per ambiente.

ColonnaTipoNullNote
session_idtextPK (con environment)
environmenttextPK (con session_id); CHECK dev / prod (default prod).
user_idtext
game_slugtextN
s3_prefixtext
stagesmallintDefault 0.
statustextCHECK pending (default) / processing / verified / failed.
mp4_keytextN
csv_keytextN
ogg_keytextN
size_bytes_totalbigintN
errortextN
created_attimestamptz
verified_attimestamptzN

pipeline_runs

ColonnaTipoNullNote
run_iduuidPK
pipeline_nametext
session_idtextN
user_idtextN
trigger_typetextDefault manual.
created_bytextDefault prefect-ui.
statustextCHECK running (default) / pass / fail / skipped.
steps_executedtext[]N
step_durations_sjsonbN
params_usedjsonbN
output_prefixtextN
error_detailtextN
prefect_flow_run_idtextN
started_attimestamptz
completed_attimestamptzN

nvenc_known_contenders

ColonnaTipoNullNote
process_nametextPK
first_seentimestamptz
last_seentimestamptz
total_eventsbigint
total_usersinteger
sample_codecstext[]
sample_resolutionstext[]
ColonnaTipoNullNote
process_nametextFK → nvenc_known_contenders.process_name
user_idtext
first_seentimestamptz
last_seentimestamptz

bug_reports

ColonnaTipoNullNote
iduuidPK
created_attimestamptz
user_iduuid
steam_idtextN
hw_configjsonb
installer_versiontextN
ui_versiontextN
core_versiontextN
titletextCHECK lunghezza 1–200.
descriptiontextCHECK lunghezza 1–10000.
statustextCHECK logged (default) / in_progress / fixed / verified / wont_fix.
categorytextCHECK ui / recording / performance / onboarding / other.
imagestext[]
linear_tickettextNCompilata automaticamente dal trigger bug_reports_to_linear (AFTER INSERT).
updated_attimestamptz
steam_usernametextN
connectionjsonbN
electron_runtimejsonbN

Lobby e catalogo

→ pagina di dominio: Lobby e catalogo

lobbies

ColonnaTipoNullNote
iduuidPK
lobby_codetext
creator_idtext
game_slugtextFK → eligible_games.slug (ON UPDATE CASCADE / ON DELETE RESTRICT).
statustextCHECK active (default) / closed / expired.
max_playersintegerCHECK 2–16 (default 16).
created_attimestamptz
expires_attimestamptz

lobby_participants

PK composita (lobby_id, user_id) — membership corrente.

ColonnaTipoNullNote
lobby_iduuidPK (con user_id); FK → lobbies.id
user_idtextPK (con lobby_id)
joined_attimestamptz
session_idtextNSi unisce a recording_sessions.
server_recording_started_attimestamptzN

lobby_join_events

Storia prevalentemente append. INSERT al join; il leave aggiorna (UPDATE) left_at (nessuna nuova riga). Pilotata da trigger su lobby_participants.

ColonnaTipoNullNote
idbigintPK
lobby_iduuidFK → lobbies.id
user_idtext
joined_attimestamptz
left_attimestamptzNMarcata al leave.
sourcetextDefault participant_insert.

eligible_games

ColonnaTipoNullNote
igdb_idintegerPK
slugtext
display_nametext
enabledbooleanN
cover_urltextN
created_attimestamptzN
updated_attimestamptzN
tokensjsonbToken di match per il rilevamento della libreria; NOT NULL, default {}.

game_store_ids

ColonnaTipoNullNote
iduuidPK
igdb_idintegerFK → eligible_games.igdb_id (ON DELETE CASCADE).
storegame_storeEnum (steam/epic/gog/microsoft/riot/rockstar/other).
store_idtext

game_runtime_profiles

ColonnaTipoNullNote
iduuidPK
game_store_iduuidFK → game_store_ids.id
exe_nametext
platformtextN
notestextN
enginetextNFK → engine_defaults.engine
settings_overridejsonbN
settings_enforcementjsonb

engine_defaults

ColonnaTipoNullNote
enginetextPK
settings_specjsonb
created_attimestamptz
updated_attimestamptz

user_game_library

ColonnaTipoNullNote
iduuidPK
user_iduuid
playnite_iduuid
plugin_iduuidN
providertext
provider_game_idtextN
nametext
is_installedbooleanN
is_hiddenbooleanN
is_favoritebooleanN
playtime_secondsbigintN
play_countbigintN
last_played_attimestamptzN
executablesjsonbN
genresjsonbN
developersjsonbN
publishersjsonbN
release_datetextN
cover_image_urltextN
platformtextN
install_size_bytesbigintN
game_registry_igdb_idintegerNFK → eligible_games.igdb_id
synced_attimestamptzN
created_attimestamptzN
updated_attimestamptzN

Growth e network

→ pagina di dominio: Growth e network

shadow_graph

ColonnaTipoNullNote
iduuidPK
source_user_iduuidFK → playroll_users.user_id
source_steam_idtext
target_steam_idtext
target_nametextN
target_avatar_urltextN
target_profile_urltextN
target_hoursintegerN
target_games_ownedintegerN
target_levelintegerN
target_profile_publicbooleanN
target_tiertextCHECK whale / regular / casual (default casual).
target_yearly_valueintegerPunteggio di valore di reclutamento.
recruitment_statustextCHECK none (default) / invited / converted.
invited_attimestamptzN
converted_attimestamptzN
converted_user_iduuidNFK → playroll_users.user_id (nessun cascade).
friend_sincebigintN
created_attimestamptz
updated_attimestamptzEdge UNIQUE: (source_user_id, target_steam_id).

invite_codes

ColonnaTipoNullNote
codetextPK
pooltextDefault phase_0.
max_usesintegerCHECK > 0 (default 1).
usesintegerCHECK 0 ≤ uses ≤ max_uses.
activeboolean
notestextN
created_byuuidNFK → playroll_users.user_id
created_attimestamptz
expires_attimestamptzN

invite_code_consumptions

PK composita (code, user_id) — un utente consuma un dato codice al massimo una volta.

ColonnaTipoNullNote
codetextPK (con user_id); FK → invite_codes.code
user_iduuidPK (con code); FK → playroll_users.user_id
consumed_attimestamptz
ip_hashtextN
user_agenttextN

redeem_attempt_log

Log del rate-limiter per il flusso di activation-code del contributor (redeem-activation-code, EC-227) — non i codici invito. app_user_id è un uuid senza vincoli (riferimento soft, nessuna FK).

ColonnaTipoNullNote
idbigintPK
app_user_iduuidNessuna FK.
iptextN
code_hashtextN
successbooleanDefault false.
attimestamptz

Release

→ pagina di dominio: Release e notifiche

app_releases_v2

ColonnaTipoNullNote
idbigintPK
release_keytext
installer_versiontext
core_versiontext
ui_versiontext
download_urltext
installer_sha256textN
release_notestextN
metadatajsonbDefault {}.
created_attimestamptz
release_tracktextCHECK stable / dev / test (nessun beta).
release_notes_technicaltextN
release_notes_user_facingtextN

app_rollouts_v2

ColonnaTipoNullNote
iduuidPK
nametext
release_idbigintFK → app_releases_v2.id
enabledboolean
priorityinteger
tracktext
force_updateboolean
percentageinteger
experiment_keytextN
ab_buckettextN
include_user_idsuuid[]
exclude_user_idsuuid[]
include_install_idstext[]
starts_attimestamptz
ends_attimestamptzN
created_attimestamptz
updated_attimestamptz

app_rollout_overrides_v2

ColonnaTipoNullNote
iduuidPK
target_typetext
target_idtext
release_idbigintFK → app_releases_v2.id
enabledboolean
force_updateboolean
reasontextN
expires_attimestamptzN
created_attimestamptz

app_update_resolve_audit_v1

Una riga per chiamata di resolve (25 colonne).

ColonnaTipoNullNote
idbigintPK
created_attimestamptz
install_idtextN
user_iduuidN
request_tracktextN
installed_installer_versiontextN
installed_core_versiontextN
installed_ui_versiontextN
installed_tracktextNSorgente per user_current_track.
track_ordertext[]
assignment_sourcetextrollout / override / default
assignment_tracktextN
rollout_iduuidN
override_iduuidN
buckettextN
experiment_keytextN
target_release_idbigintN
target_installer_versiontextN
target_core_versiontextN
target_ui_versiontextN
update_availableboolean
update_requiredboolean
force_updateboolean
reasontextN
resolver_versiontext

app_update_resolve_rate_limit

ColonnaTipoNullNote
ip_sha256byteaPK (con window_start)
window_starttimestamptzFinestra allineata a 60s.
request_countinteger
last_seen_attimestamptz

Notifiche

→ pagina di dominio: Release e notifiche

notification_event

ColonnaTipoNullNote
iduuidPK
categorytext
typetext
urgency_tiertext
payloadjsonb
ctajsonbN
sourcetext
localetext
allowed_channelstext[]
audience_filterjsonbRisolto da resolve_audience().
recipient_countinteger
created_attimestamptz
expires_attimestamptzN

notification_deliveries

ColonnaTipoNullNote
iduuidPK
event_iduuidFK → notification_event.id
user_iduuid
channeltext
statustext
error_codetextN
queued_attimestamptz
sent_attimestamptzN

notification_state

ColonnaTipoNullNote
event_iduuidFK → notification_event.id
user_iduuid
read_attimestamptzN
dismissed_attimestamptzN
acted_attimestamptzN
created_attimestamptz

notification_groups

ColonnaTipoNullNote
iduuidPK
slugtext
nametext
descriptiontextN
created_byuuidN
created_attimestamptz

notification_group_members

ColonnaTipoNullNote
group_iduuidFK → notification_groups.id
user_iduuid
added_attimestamptz
added_byuuidN

notification_user_prefs

ColonnaTipoNullNote
user_iduuidPK
enable_payment_and_validationboolean
enable_app_update_and_termsboolean
enable_catalog_and_announcementsboolean
enable_soundboolean
enable_emailboolean
updated_attimestamptz

Viste

Undici viste proiettano le tabelle qui sopra per consumatori specifici. Sono security_invoker dove espongono dati con scope per riga, quindi la RLS sulle tabelle sottostanti governa comunque la visibilità.

VistaBasata suScopo
playroll_users_viewplayroll_users + auth.usersProiezione di lettura canonica dell'utente (profilo + email auth).
investor_daily_recording_kpis_vc_viewrecording_sessionsKPI giornalieri VC/investor-safe dalla durata canonica. Nessun PII.
daily_upload_statss3_uploadsVolumi di upload giornalieri.
upload_summary_by_users3_uploads + playroll_usersRiepilogo upload per utente, identity-first.
player_recording_sessionsrecording_sessionsElenco delle sessioni per giocatore.
session_completion_statusrecording_sessionsRollup di completamento/stato terminale per sessione.
complete_tripletss3_uploadsLegacy — richiede mp4 + ogg + csv (nessun termine JSON). OGG rimosso in EC-173 → corrisponde solo a righe storiche, non all'insieme moderno validato.
support_recording_sessionsrecording_sessions + s3_uploadsVista delle sessioni per support/tester (durata canonica + evidenze dei file).
support_recording_filess3_uploadsVista a livello di file per il support (chi ha caricato ogni file, chiavi, URL, status).
support_player_upload_summaryrecording_sessions + s3_uploadsRiepilogo di lookup del giocatore per il support.
user_current_trackapp_update_resolve_audit_v1Track di release corrente per utente; alimenta il filtro app_track di resolve_audience().

Le dashboard che consumano queste viste sono documentate in Dashboard → Viste Supabase e nella pagina Database → Viste di monitoraggio.


Come viene rigenerata questa pagina

Questo riferimento rispecchia lo schema reale. Per aggiornarlo dopo una migrazione, la struttura proviene da tre query contro il progetto Playroll Supabase (information_schema / pg_catalog): l'elenco tabelle+colonne, l'elenco delle chiavi esterne e l'elenco degli enum. Riesegui quelle query, confronta con le tabelle qui sopra e aggiorna la sezione interessata nello stesso change che rilascia la migrazione — secondo la regola del workspace per cui playroll-docs è mantenuto in sync con le modifiche allo schema.