Schema Snapshot¶
- Generated at: 2026-03-02T14:26:08.564Z
- Commit SHA: a2a722217e30dc6002a2fbacbbc7910a108c2e8b
- Total tables: 80
Tabelas¶
- achievements
- admin_users
- app_events
- attempts
- cosmetics
- courses
- daily_platform_stats
- did_you_know_cards
- exercise_variants
- feature_flags
- grammar_card_assets
- grammar_card_examples
- grammar_cards
- grammar_concepts
- health_check
- league_divisions
- league_seasons
- lesson_summaries
- lessons
- morphology_rules
- notifications
- pet_feed_events
- pos_colors
- practice_queue
- practice_queue_items
- semantic_relations
- sentence_tags
- sentence_templates
- sentence_tokens
- sentences
- session_continue_events
- session_exercises
- sessions
- skills
- stages
- tags
- tts_assets
- units
- user_achievements
- user_consents
- user_cosmetics
- user_course_enrollments
- user_daily_stats
- user_friends
- user_item_state
- user_item_stats
- user_league_membership
- user_pet_state
- user_profile
- user_security_events
- user_settings
- user_skill_progress
- user_skill_state
- user_stage_progress
- user_streak
- user_subscriptions
- user_tag_stats
- user_variant_history
- user_wallet
- user_xp
- vocabulary
- vw_dashboard_metrics
- vw_leaderboard_global
- vw_league_leaderboard
- vw_recent_activity
- vw_schema_snapshot
- vw_session_summary
- vw_skill_unlock_state
- vw_user_achievements
- vw_user_streak
- vw_user_today_stats
- vw_wallet_overview
- wallet_transactions
- word_assets
- word_forms
- word_grammar
- word_tags
- word_translations
- worlds
- xp_transactions
Colunas por tabela¶
achievements¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| key | text | NO | |
| title | text | NO | |
| description | text | YES | |
| icon_path | text | YES | |
| xp_reward | integer | NO | 0 |
| cookie_reward | integer | NO | 0 |
| is_active | boolean | NO | true |
admin_users¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| created_at | timestamp with time zone | NO | now() |
app_events¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | YES | |
| session_id | uuid | YES | |
| name | text | NO | |
| properties | jsonb | NO | '{}'::jsonb |
| created_at | timestamp with time zone | NO | now() |
attempts¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| session_id | uuid | YES | |
| session_exercise_id | uuid | YES | |
| item_id | uuid | NO | |
| ex_type | text | NO | |
| user_answer | text | YES | |
| stt_transcript | text | YES | |
| is_correct | boolean | YES | |
| score | numeric | YES | |
| duration_ms | integer | YES | |
| created_at | timestamp with time zone | NO | now() |
cosmetics¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| key | text | NO | |
| title | text | NO | |
| kind | text | NO | |
| cookie_price | integer | NO | 0 |
| asset_path | text | YES | |
| is_active | boolean | NO | true |
courses¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| slug | text | NO | |
| title | text | NO | |
| source_lang | text | NO | 'pt'::text |
| target_lang | text | NO | 'en'::text |
| level | text | NO | 'A1'::text |
| is_published | boolean | NO | false |
| created_at | timestamp with time zone | NO | now() |
| name | text | YES |
daily_platform_stats¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| day | date | NO | |
| total_users | integer | NO | 0 |
| active_users | integer | NO | 0 |
| total_sessions | integer | NO | 0 |
| total_xp | bigint | NO | 0 |
| total_cookies_earned | bigint | NO | 0 |
| created_at | timestamp with time zone | NO | now() |
did_you_know_cards¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| course_id | uuid | NO | |
| world_id | uuid | YES | |
| stage_id | uuid | YES | |
| title | text | NO | 'Did you know?'::text |
| body | text | NO | |
| image_path | text | YES | |
| tags | ARRAY | NO | '{}'::text[] |
| is_active | boolean | NO | true |
| created_at | timestamp with time zone | NO | now() |
exercise_variants¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| item_id | uuid | NO | |
| ex_type | text | NO | |
| prompt_text | text | NO | |
| target_text | text | NO | |
| choices | jsonb | YES | |
| hint | text | YES | |
| weight | smallint | NO | 1 |
| is_active | boolean | NO | true |
| flow_group_id | uuid | YES | |
| flow_order | integer | YES | |
| tts_asset_id | uuid | YES |
feature_flags¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| key | text | NO | |
| is_enabled | boolean | NO | false |
| metadata | jsonb | NO | '{}'::jsonb |
grammar_card_assets¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| card_id | uuid | NO | |
| type | text | NO | |
| lang | text | YES | |
| url | text | NO | |
| provider | text | YES | |
| preset | text | YES | |
| cache_key | text | YES | |
| created_at | timestamp with time zone | NO | now() |
grammar_card_examples¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| card_id | uuid | NO | |
| sentence_id | uuid | NO | |
| order_index | integer | NO | 0 |
| highlight_token_index | integer | YES | |
| note | text | YES |
grammar_cards¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| concept_id | uuid | NO | |
| title | text | NO | |
| explanation_native | text | YES | |
| native_lang | text | NO | |
| explanation_target | text | YES | |
| target_lang | text | YES | |
| status | text | NO | 'draft'::text |
| curriculum_tags | jsonb | YES | |
| created_at | timestamp with time zone | NO | now() |
| updated_at | timestamp with time zone | NO | now() |
grammar_concepts¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| name | text | NO | |
| cefr_level | text | YES | |
| introduced_chapter | integer | YES | |
| structure_pattern | text | YES | |
| explanation | text | YES | |
| code | text | YES | |
| title | text | YES | |
| description | text | YES | |
| created_at | timestamp with time zone | NO | now() |
| base_lang | text | YES | |
| level | text | YES | |
| updated_at | timestamp with time zone | NO | now() |
health_check¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
league_divisions¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| key | text | NO | |
| title | text | NO | |
| idx | integer | NO | |
| promotion_slots | integer | NO | 10 |
| demotion_slots | integer | NO | 10 |
league_seasons¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| course_id | uuid | YES | |
| starts_at | date | NO | |
| ends_at | date | NO | |
| name | text | YES | |
| is_active | boolean | NO | true |
lesson_summaries¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| skill_id | uuid | NO | |
| title | text | NO | |
| content | jsonb | NO | |
| version | integer | NO | 1 |
| created_at | timestamp with time zone | NO | now() |
| updated_at | timestamp with time zone | NO | now() |
lessons¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| skill_id | uuid | NO | |
| type | text | NO | |
| order_index | integer | NO | 1 |
| created_at | timestamp with time zone | NO | now() |
morphology_rules¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| language | text | NO | |
| pos | text | NO | |
| rule_name | text | YES | |
| pattern | jsonb | YES | |
| transformation | jsonb | YES | |
| created_at | timestamp with time zone | NO | now() |
notifications¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| kind | text | NO | |
| title | text | NO | |
| body | text | YES | |
| metadata | jsonb | NO | '{}'::jsonb |
| is_read | boolean | NO | false |
| created_at | timestamp with time zone | NO | now() |
pet_feed_events¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| cookies_spent | integer | NO | |
| hunger_before | integer | NO | |
| hunger_after | integer | NO | |
| energy_before | integer | NO | |
| energy_after | integer | NO | |
| bond_xp_gained | integer | NO | |
| created_at | timestamp with time zone | NO | now() |
pos_colors¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| pos | text | NO | |
| color_hex | text | NO |
practice_queue¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| course_id | uuid | NO | |
| created_at | timestamp with time zone | NO | now() |
| source | text | NO | 'most_wrong'::text |
| metadata | jsonb | NO | '{}'::jsonb |
practice_queue_items¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| queue_id | uuid | NO | |
| item_id | uuid | NO | |
| idx | integer | NO |
semantic_relations¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| word_id | uuid | NO | |
| related_word_id | uuid | NO | |
| relation_type | text | NO | |
| created_at | timestamp with time zone | NO | now() |
sentence_tags¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| sentence_id | uuid | NO | |
| tag_id | uuid | NO | |
| created_at | timestamp with time zone | NO | now() |
sentence_templates¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| grammar_concept_id | uuid | YES | |
| structure_pattern | text | NO | |
| cefr_level | text | YES | |
| introduced_chapter | integer | YES |
sentence_tokens¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| sentence_id | uuid | NO | |
| word_id | uuid | NO | |
| position | integer | NO | |
| role | text | YES | |
| created_at | timestamp with time zone | NO | now() |
| form_id | uuid | YES | |
| expected_features | jsonb | YES | |
| dependency_role | text | YES | |
| head_position | integer | YES | |
| slot_id | text | YES |
sentences¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| template_id | uuid | YES | |
| generated_text | text | YES | |
| difficulty_score | numeric | YES | |
| audio_url | text | YES | |
| lang | text | YES | |
| cefr_level | text | YES | |
| introduced_chapter | integer | YES | |
| created_at | timestamp with time zone | NO | now() |
| text | text | YES | |
| source_lang | text | NO | 'en'::text |
| target_lang | text | NO | 'pt'::text |
| updated_at | timestamp with time zone | NO | now() |
session_continue_events¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| session_id | uuid | NO | |
| user_id | uuid | NO | |
| pack_cost | integer | NO | 10 |
| pack_amount | integer | NO | 10 |
| wallet_balance_before | integer | YES | |
| wallet_balance_after | integer | YES | |
| created_at | timestamp with time zone | NO | now() |
session_exercises¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| session_id | uuid | NO | |
| variant_id | uuid | NO | |
| idx | integer | NO | |
| item_id | uuid | NO | |
| ex_type | text | NO | |
| was_correct | boolean | YES | |
| score | numeric | YES | |
| answered_at | timestamp with time zone | YES |
sessions¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| course_id | uuid | NO | |
| unit_id | uuid | YES | |
| skill_id | uuid | YES | |
| stage_id | uuid | YES | |
| mode | USER-DEFINED | NO | 'standard'::session_mode |
| created_at | timestamp with time zone | NO | now() |
| completed_at | timestamp with time zone | YES | |
| target_xp | integer | NO | 20 |
| earned_xp | integer | NO | 0 |
| session_cookies_start | integer | NO | 10 |
| session_cookies_current | integer | NO | 10 |
| continues_used | integer | NO | 0 |
| ended_reason | USER-DEFINED | YES | |
| meta | jsonb | NO | '{}'::jsonb |
skills¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| unit_id | uuid | NO | |
| idx | integer | NO | |
| title | text | NO | |
| description | text | YES | |
| cookie_cost | integer | NO | 0 |
| requires_prev_completed | boolean | NO | true |
| session_cookie_start | integer | NO | 10 |
| continue_pack_cost | integer | NO | 10 |
| continue_pack_amount | integer | NO | 10 |
| min_sessions_required | integer | NO | 1 |
| min_mastery_required | smallint | NO | 70 |
| is_published | boolean | NO | false |
| order_index | integer | NO | 1 |
stages¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| world_id | uuid | NO | |
| idx | integer | NO | |
| title | text | NO | |
| skill_id | uuid | YES | |
| cookie_cost | integer | NO | 0 |
| required_mastery | smallint | NO | 0 |
| is_published | boolean | NO | false |
tags¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| key | text | NO | |
| category | text | NO | |
| weight | numeric | NO | 1 |
| created_at | timestamp with time zone | NO | now() |
| name | text | YES | |
| kind | text | NO | 'general'::text |
tts_assets¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| lang | text | NO | 'en'::text |
| voice | text | NO | 'default'::text |
| text_hash | text | NO | |
| text | text | NO | |
| audio_path | text | NO | |
| duration_ms | integer | YES | |
| created_at | timestamp with time zone | NO | now() |
| entity_type | text | NO | |
| entity_id | uuid | NO | |
| voice_preset | text | YES | |
| url | text | NO | |
| provider | text | YES | |
| meta | jsonb | YES |
units¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| course_id | uuid | NO | |
| idx | integer | NO | |
| title | text | NO | |
| is_published | boolean | NO | false |
| order_index | integer | NO | 1 |
user_achievements¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| achievement_id | uuid | NO | |
| unlocked_at | timestamp with time zone | NO | now() |
user_consents¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| terms_accepted_at | timestamp with time zone | YES | |
| privacy_accepted_at | timestamp with time zone | YES | |
| marketing_opt_in | boolean | NO | false |
| updated_at | timestamp with time zone | NO | now() |
user_cosmetics¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| cosmetic_id | uuid | NO | |
| owned_at | timestamp with time zone | NO | now() |
| is_equipped | boolean | NO | false |
user_course_enrollments¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| course_id | uuid | NO | |
| enrolled_at | timestamp with time zone | NO | now() |
user_daily_stats¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| day | date | NO | |
| xp | integer | NO | 0 |
| sessions | integer | NO | 0 |
| practice_sessions | integer | NO | 0 |
| correct | integer | NO | 0 |
| wrong | integer | NO | 0 |
| cookies_earned | integer | NO | 0 |
| cookies_spent | integer | NO | 0 |
user_friends¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| friend_user_id | uuid | NO | |
| status | text | NO | 'pending'::text |
| created_at | timestamp with time zone | NO | now() |
user_item_state¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| item_id | uuid | NO | |
| ease | numeric | NO | 2.5 |
| interval_days | numeric | NO | 0 |
| due_at | timestamp with time zone | NO | now() |
| last_seen_at | timestamp with time zone | YES | |
| correct_streak | integer | NO | 0 |
| wrong_recent | integer | NO | 0 |
| seen_count | integer | NO | 0 |
| status | text | NO | 'new'::text |
user_item_stats¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| item_id | uuid | NO | |
| attempts | integer | NO | 0 |
| wrong | integer | NO | 0 |
| correct | integer | NO | 0 |
| last_attempt_at | timestamp with time zone | YES |
user_league_membership¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| season_id | uuid | NO | |
| division_id | uuid | NO | |
| xp_in_season | integer | NO | 0 |
| rank_in_division | integer | YES | |
| joined_at | timestamp with time zone | NO | now() |
user_pet_state¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| pet_name | text | NO | 'Spoke'::text |
| bond_level | integer | NO | 1 |
| bond_xp | integer | NO | 0 |
| hunger | integer | NO | 0 |
| energy | integer | NO | 50 |
| skin_key | text | YES | 'default'::text |
| last_fed_at | timestamp with time zone | YES | |
| updated_at | timestamp with time zone | NO | now() |
user_profile¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| display_name | text | YES | |
| username | text | YES | |
| avatar_url | text | YES | |
| country | text | YES | |
| timezone | text | YES | 'Europe/Istanbul'::text |
| created_at | timestamp with time zone | NO | now() |
| updated_at | timestamp with time zone | NO | now() |
| text | YES | ||
| status | text | YES | 'active'::text |
user_security_events¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | YES | |
| ip_address | text | YES | |
| user_agent | text | YES | |
| event | text | YES | |
| metadata | jsonb | NO | '{}'::jsonb |
| created_at | timestamp with time zone | NO | now() |
user_settings¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| ui_lang | text | NO | 'pt'::text |
| learning_goal_minutes | integer | NO | 10 |
| notifications_enabled | boolean | NO | true |
| sound_enabled | boolean | NO | true |
| speaking_enabled | boolean | NO | true |
| accessibility | jsonb | NO | '{}'::jsonb |
| updated_at | timestamp with time zone | NO | now() |
user_skill_progress¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| skill_id | uuid | NO | |
| status | USER-DEFINED | NO | 'locked'::progress_status |
| started_at | timestamp with time zone | YES | |
| completed_at | timestamp with time zone | YES | |
| sessions_completed | integer | NO | 0 |
| mastery | numeric | YES | 0 |
user_skill_state¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| skill_id | uuid | NO | |
| mastery | smallint | NO | 0 |
| last_seen_at | timestamp with time zone | YES |
user_stage_progress¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| stage_id | uuid | NO | |
| status | USER-DEFINED | NO | 'locked'::progress_status |
| unlocked_at | timestamp with time zone | YES | |
| started_at | timestamp with time zone | YES | |
| completed_at | timestamp with time zone | YES |
user_streak¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| current_streak | integer | NO | 0 |
| best_streak | integer | NO | 0 |
| last_active_day | date | YES | |
| freezes | integer | NO | 0 |
| updated_at | timestamp with time zone | NO | now() |
user_subscriptions¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| plan | text | YES | |
| starts_at | timestamp with time zone | YES | |
| ends_at | timestamp with time zone | YES | |
| is_active | boolean | NO | false |
| updated_at | timestamp with time zone | NO | now() |
user_tag_stats¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| tag_id | uuid | NO | |
| attempts | integer | NO | 0 |
| wrong | integer | NO | 0 |
| correct | integer | NO | 0 |
| last_attempt_at | timestamp with time zone | YES |
user_variant_history¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| variant_id | uuid | NO | |
| seen_at | timestamp with time zone | NO | now() |
user_wallet¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| cookies | integer | NO | 0 |
| updated_at | timestamp with time zone | NO | now() |
user_xp¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | NO | |
| xp_total | bigint | NO | 0 |
| updated_at | timestamp with time zone | NO | now() |
vocabulary¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| lemma | text | NO | |
| pos | text | NO | |
| cefr_level | text | YES | |
| frequency_rank | integer | YES | |
| introduced_chapter | integer | YES | |
| created_at | timestamp without time zone | YES | now() |
| updated_at | timestamp with time zone | NO | now() |
| source_lang | text | NO | 'en'::text |
| target_lang | text | NO | 'pt'::text |
| base_lang | text | YES | |
| universal_concept_id | uuid | YES |
vw_dashboard_metrics¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| total_students | bigint | YES | |
| active_courses | bigint | YES | |
| sessions_30d | bigint | YES | |
| avg_study_minutes | numeric | YES | |
| total_xp_30d | bigint | YES |
vw_leaderboard_global¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| username | text | YES | |
| display_name | text | YES | |
| avatar_url | text | YES | |
| xp_total | bigint | YES | |
| rank_position | bigint | YES |
vw_league_leaderboard¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| season_id | uuid | YES | |
| season_name | text | YES | |
| division_key | text | YES | |
| user_id | uuid | YES | |
| username | text | YES | |
| display_name | text | YES | |
| avatar_url | text | YES | |
| xp_in_season | integer | YES | |
| rank_position | bigint | YES |
vw_recent_activity¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| type | text | YES | |
| label | text | YES | |
| created_at | timestamp with time zone | YES |
vw_schema_snapshot¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| table_name | name | YES | |
| column_name | name | YES | |
| data_type | character varying | YES | |
| is_nullable | character varying | YES | |
| column_default | character varying | YES |
vw_session_summary¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| session_id | uuid | YES | |
| total_exercises | bigint | YES | |
| correct_answers | bigint | YES |
vw_skill_unlock_state¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| skill_id | uuid | YES | |
| title | text | YES | |
| idx | integer | YES | |
| cookie_cost | integer | YES | |
| user_id | uuid | YES | |
| status | USER-DEFINED | YES | |
| completed_at | timestamp with time zone | YES |
vw_user_achievements¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| key | text | YES | |
| title | text | YES | |
| description | text | YES | |
| icon_path | text | YES | |
| unlocked_at | timestamp with time zone | YES |
vw_user_streak¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| current_streak | integer | YES | |
| best_streak | integer | YES | |
| last_active_day | date | YES | |
| active_today | boolean | YES |
vw_user_today_stats¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| day | date | YES | |
| xp | integer | YES | |
| sessions | integer | YES | |
| practice_sessions | integer | YES | |
| correct | integer | YES | |
| wrong | integer | YES | |
| cookies_earned | integer | YES | |
| cookies_spent | integer | YES |
vw_wallet_overview¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| user_id | uuid | YES | |
| cookies | integer | YES | |
| last_tx_amount | integer | YES | |
| last_tx_kind | USER-DEFINED | YES | |
| last_tx_created_at | timestamp with time zone | YES |
wallet_transactions¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| kind | USER-DEFINED | NO | |
| source | text | NO | |
| amount | integer | NO | |
| session_id | uuid | YES | |
| skill_id | uuid | YES | |
| stage_id | uuid | YES | |
| metadata | jsonb | NO | '{}'::jsonb |
| created_at | timestamp with time zone | NO | now() |
word_assets¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| word_id | uuid | YES | |
| kind | text | YES | |
| url | text | YES | |
| provider | text | YES | |
| style | jsonb | YES | |
| voice | jsonb | YES | |
| created_at | timestamp with time zone | NO | now() |
word_forms¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| word_id | uuid | YES | |
| form_type | text | YES | |
| form_value | text | NO | |
| form | text | NO | |
| features | jsonb | NO | |
| is_irregular | boolean | NO | false |
| created_at | timestamp with time zone | NO | now() |
word_grammar¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| word_id | uuid | NO | |
| concept_id | uuid | NO | |
| created_at | timestamp with time zone | NO | now() |
word_tags¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| word_id | uuid | NO | |
| tag_id | uuid | NO |
word_translations¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| word_id | uuid | YES | |
| lang | text | YES | |
| text | text | YES | |
| is_primary | boolean | NO | false |
| created_at | timestamp with time zone | NO | now() |
worlds¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| course_id | uuid | NO | |
| idx | integer | NO | |
| title | text | NO | |
| location_key | text | YES | |
| is_published | boolean | NO | false |
xp_transactions¶
| Column | Type | Nullable | Default |
|---|---|---|---|
| id | uuid | NO | gen_random_uuid() |
| user_id | uuid | NO | |
| amount | integer | NO | |
| source | text | NO | |
| session_id | uuid | YES | |
| item_id | uuid | YES | |
| created_at | timestamp with time zone | NO | now() |