shinkan-jinkendo/backend/migrations/016_saved_searches.sql

35 lines
1.0 KiB
MySQL
Raw Normal View History

feat: Exercises v2.0 + Migrations 014/016/017 (Clean-Room Rebuild) 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
2026-04-24 15:04:27 +02:00
-- 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 $$;