CRITICAL FIX: Build was failing because lucide-react was not in package.json - Added lucide-react ^0.344.0 to dependencies - Required for appNav.js and DesktopSidebar.jsx icon imports - Build should now succeed Apologies for missing this in initial design foundation commit!
101 lines
3.3 KiB
SQL
101 lines
3.3 KiB
SQL
-- Migration 005: Exercises (Übungen)
|
|
-- Erstellt: 2026-04-22
|
|
-- Beschreibung: Übungsverwaltung (Kern-Modul)
|
|
|
|
-- Exercises (Übungen)
|
|
CREATE TABLE exercises (
|
|
id SERIAL PRIMARY KEY,
|
|
title VARCHAR(300) NOT NULL,
|
|
summary TEXT, -- Kurzbeschreibung
|
|
goal TEXT NOT NULL, -- Ziel der Übung
|
|
execution TEXT NOT NULL, -- Durchführung
|
|
preparation TEXT, -- Vorbereitung / Aufbau
|
|
trainer_notes TEXT, -- Hinweise für Trainer
|
|
equipment JSONB, -- ["Matten", "Pratzen", "Bälle"]
|
|
|
|
-- Metadaten
|
|
duration_min INT,
|
|
duration_max INT,
|
|
group_size_min INT,
|
|
group_size_max INT,
|
|
age_groups JSONB, -- ["minis", "kinder", "erwachsene"]
|
|
|
|
-- Fachliche Zuordnung
|
|
focus_area VARCHAR(100), -- karate, selbstverteidigung, gewaltschutz
|
|
secondary_areas JSONB,
|
|
training_character VARCHAR(50), -- grundlage, aufbau, vertiefung, festigung, diagnose
|
|
|
|
-- Methode
|
|
primary_method_id INT REFERENCES training_methods(id),
|
|
secondary_method_ids JSONB,
|
|
|
|
-- Freigabe
|
|
visibility VARCHAR(50) DEFAULT 'private', -- private, club, official
|
|
status VARCHAR(50) DEFAULT 'draft', -- draft, in_review, approved, archived
|
|
created_by INT REFERENCES profiles(id),
|
|
club_id INT REFERENCES clubs(id),
|
|
|
|
-- Import
|
|
import_source VARCHAR(50), -- mediawiki, manual
|
|
import_id VARCHAR(200),
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_exercises_created_by ON exercises(created_by);
|
|
CREATE INDEX idx_exercises_club ON exercises(club_id);
|
|
CREATE INDEX idx_exercises_visibility ON exercises(visibility);
|
|
CREATE INDEX idx_exercises_status ON exercises(status);
|
|
CREATE INDEX idx_exercises_focus_area ON exercises(focus_area);
|
|
|
|
-- Übungs-Fähigkeiten (M:N)
|
|
CREATE TABLE exercise_skills (
|
|
id SERIAL PRIMARY KEY,
|
|
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
|
skill_id INT REFERENCES skills(id),
|
|
is_primary BOOLEAN DEFAULT false,
|
|
intensity INT CHECK (intensity BETWEEN 1 AND 5), -- 1-5
|
|
development_contribution VARCHAR(50), -- low, medium, high
|
|
required_level INT, -- Eingangs-Niveau
|
|
target_level INT, -- Ziel-Niveau
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_exercise_skills_exercise ON exercise_skills(exercise_id);
|
|
CREATE INDEX idx_exercise_skills_skill ON exercise_skills(skill_id);
|
|
|
|
-- Übungsvarianten
|
|
CREATE TABLE exercise_variants (
|
|
id SERIAL PRIMARY KEY,
|
|
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
|
variant_name VARCHAR(200) NOT NULL,
|
|
description TEXT,
|
|
execution_changes TEXT,
|
|
duration_min INT,
|
|
duration_max INT,
|
|
equipment_changes JSONB,
|
|
difficulty_adjustment VARCHAR(50), -- easier, harder, adapted
|
|
age_group_override JSONB,
|
|
skill_focus_override JSONB,
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_exercise_variants_exercise ON exercise_variants(exercise_id);
|
|
|
|
-- Medien (1:N)
|
|
CREATE TABLE exercise_media (
|
|
id SERIAL PRIMARY KEY,
|
|
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
|
media_type VARCHAR(50), -- image, video, document, sketch
|
|
file_path TEXT,
|
|
title VARCHAR(200),
|
|
description TEXT,
|
|
sort_order INT,
|
|
is_primary BOOLEAN DEFAULT false,
|
|
context VARCHAR(100), -- ablauf, detail, trainer_hint
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_exercise_media_exercise ON exercise_media(exercise_id);
|