Dateien
Hetzner-Backup/v2_adminpanel/create_compatibility_views.sql
2025-06-18 19:40:14 +02:00

122 Zeilen
4.1 KiB
PL/PgSQL

-- Compatibility Views für sanfte Migration
-- Diese Views ermöglichen es, dass der Code weiterhin funktioniert,
-- während wir schrittweise die Feldnamen korrigieren
-- 1. Sessions Compatibility View
-- Mappt alle falschen Feldnamen auf die korrekten
CREATE OR REPLACE VIEW sessions_compat AS
SELECT
id,
license_id,
license_key,
session_id,
username,
computer_name,
hardware_id,
hardware_id as device_id, -- Alias für Kompatibilität
ip_address,
user_agent,
app_version,
started_at,
started_at as login_time, -- Alias für Kompatibilität
started_at as start_time, -- Alias für models.py
last_heartbeat,
last_heartbeat as last_activity, -- Alias für Kompatibilität
ended_at,
ended_at as logout_time, -- Alias für Kompatibilität
is_active,
is_active as active -- Alias für Kompatibilität
FROM sessions;
-- Grant permissions
GRANT SELECT, INSERT, UPDATE, DELETE ON sessions_compat TO PUBLIC;
-- 2. Trigger für INSERT auf sessions_compat
CREATE OR REPLACE FUNCTION insert_sessions_compat() RETURNS TRIGGER AS $$
BEGIN
-- Map compatibility fields back to real columns
INSERT INTO sessions (
license_id, license_key, session_id, username, computer_name,
hardware_id, ip_address, user_agent, app_version,
started_at, last_heartbeat, ended_at, is_active
) VALUES (
NEW.license_id,
NEW.license_key,
NEW.session_id,
NEW.username,
NEW.computer_name,
COALESCE(NEW.hardware_id, NEW.device_id), -- Accept both
NEW.ip_address,
NEW.user_agent,
NEW.app_version,
COALESCE(NEW.started_at, NEW.login_time), -- Accept both
COALESCE(NEW.last_heartbeat, NEW.last_activity), -- Accept both
COALESCE(NEW.ended_at, NEW.logout_time), -- Accept both
COALESCE(NEW.is_active, NEW.active) -- Accept both
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_insert_sessions_compat
INSTEAD OF INSERT ON sessions_compat
FOR EACH ROW EXECUTE FUNCTION insert_sessions_compat();
-- 3. Trigger für UPDATE auf sessions_compat
CREATE OR REPLACE FUNCTION update_sessions_compat() RETURNS TRIGGER AS $$
BEGIN
UPDATE sessions SET
license_id = NEW.license_id,
license_key = NEW.license_key,
session_id = NEW.session_id,
username = NEW.username,
computer_name = NEW.computer_name,
hardware_id = COALESCE(NEW.hardware_id, NEW.device_id),
ip_address = NEW.ip_address,
user_agent = NEW.user_agent,
app_version = NEW.app_version,
started_at = COALESCE(NEW.started_at, NEW.login_time),
last_heartbeat = COALESCE(NEW.last_heartbeat, NEW.last_activity),
ended_at = COALESCE(NEW.ended_at, NEW.logout_time),
is_active = COALESCE(NEW.is_active, NEW.active)
WHERE id = NEW.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_update_sessions_compat
INSTEAD OF UPDATE ON sessions_compat
FOR EACH ROW EXECUTE FUNCTION update_sessions_compat();
-- 4. Sync existing duplicate columns (one-time sync)
-- This ensures data consistency before we start using the view
UPDATE sessions SET
hardware_id = COALESCE(hardware_id, device_id),
started_at = COALESCE(started_at, login_time),
last_heartbeat = COALESCE(last_heartbeat, last_activity),
ended_at = COALESCE(ended_at, logout_time),
is_active = COALESCE(is_active, active)
WHERE hardware_id IS NULL
OR started_at IS NULL
OR last_heartbeat IS NULL
OR is_active IS NULL;
-- 5. Verification Query
SELECT
'Sessions with NULL hardware_id' as check_name,
COUNT(*) as count
FROM sessions WHERE hardware_id IS NULL
UNION ALL
SELECT
'Sessions with NULL started_at' as check_name,
COUNT(*) as count
FROM sessions WHERE started_at IS NULL
UNION ALL
SELECT
'Sessions with NULL is_active' as check_name,
COUNT(*) as count
FROM sessions WHERE is_active IS NULL;
-- 6. Create index on hardware_id if not exists
CREATE INDEX IF NOT EXISTS idx_sessions_hardware_id ON sessions(hardware_id);
CREATE INDEX IF NOT EXISTS idx_sessions_is_active ON sessions(is_active);