BREAKING CHANGES:
- exercises.py komplett neu gebaut (kein Legacy-Code)
- Legacy-Felder entfernt: age_groups, focus_area, secondary_areas, training_character
- Nur M:N Relations, keine JSONB-Kataloge
Migrations:
- Migration 014: Variant Progression + Search Vector + Legacy DROP
- exercise_variants: progression_level, sequence_order, prerequisite_variant_id
- exercises: search_vector (tsvector für Volltext-Suche)
- DROP age_groups, focus_area, secondary_areas, training_character
- Helper: update_timestamp() Funktion für Triggers
- Migration 016: Saved Exercise Searches
- saved_exercise_searches (profile_id, name, filters JSONB)
- Migration 017: Exercise Blocks + Template Blocks
- exercise_blocks (name, description, goal, is_template)
- exercise_block_items (exercise_id, variant_id, sequence_order, is_placeholder, placeholder_criteria)
Backend (exercises.py v2.0):
- GET /exercises: Volltext-Suche via tsvector, M:N Joins
- GET /exercises/{id}: enrich_exercise_detail() mit allen M:N Relations
- POST /exercises: M:N Relations (focus_areas_multi, training_styles_multi, target_groups_multi, age_groups, skills)
- PUT /exercises: Partial Update + M:N Relations
- DELETE /exercises: Cascade-Check für exercise_block_items
Architecture:
- Issue #53 konform: Import = Feld-Zuordnung, keine fachliche Interpretation
- Helper: enrich_exercise_detail() für vollständige Objekte
- Helper: assign_exercise_relations() für M:N Management (DELETE+INSERT Pattern)
Docs:
- SMW_IMPORTER_GAP_ANALYSIS.md: Vollständige Gap-Analyse + Umsetzungsplan
Version: 0.7.0
Module: exercises 2.0.0
Schema: 20260424002
35 lines
1.0 KiB
SQL
35 lines
1.0 KiB
SQL
-- Migration 016: Saved Exercise Searches
|
|
-- Autor: Claude Code
|
|
-- Datum: 2026-04-24
|
|
-- Zweck: Nutzer können häufige Suchfilter speichern
|
|
|
|
DO $$
|
|
BEGIN
|
|
|
|
-- ============================================================================
|
|
-- SAVED SEARCHES
|
|
-- ============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS saved_exercise_searches (
|
|
id SERIAL PRIMARY KEY,
|
|
profile_id INT NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
|
|
name VARCHAR(100) NOT NULL,
|
|
filters JSONB NOT NULL,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
-- Index für User-Zugriff
|
|
CREATE INDEX IF NOT EXISTS idx_saved_searches_profile
|
|
ON saved_exercise_searches(profile_id);
|
|
|
|
-- Trigger für updated_at
|
|
DROP TRIGGER IF EXISTS saved_searches_update ON saved_exercise_searches;
|
|
CREATE TRIGGER saved_searches_update
|
|
BEFORE UPDATE ON saved_exercise_searches
|
|
FOR EACH ROW EXECUTE FUNCTION update_timestamp();
|
|
|
|
RAISE NOTICE 'Migration 016 completed successfully';
|
|
|
|
END $$;
|