package main import ( "context" "github.com/jackc/pgx/v5/pgxpool" ) func ensureRuntimeDeviceSchema(ctx context.Context, db *pgxpool.Pool) error { queries := []string{ `CREATE EXTENSION IF NOT EXISTS pgcrypto`, `ALTER TABLE IF EXISTS devices ADD COLUMN IF NOT EXISTS phone_number TEXT NOT NULL DEFAULT ''`, `ALTER TABLE IF EXISTS devices ADD COLUMN IF NOT EXISTS computer_name TEXT NOT NULL DEFAULT ''`, `ALTER TABLE IF EXISTS devices ADD COLUMN IF NOT EXISTS device_category TEXT NOT NULL DEFAULT ''`, `ALTER TABLE IF EXISTS devices ADD COLUMN IF NOT EXISTS loaned_to_user_id UUID REFERENCES users(id) ON DELETE SET NULL`, `ALTER TABLE IF EXISTS devices ADD COLUMN IF NOT EXISTS loaned_until DATE`, ` CREATE TABLE IF NOT EXISTS device_relations ( device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE, related_device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (device_id, related_device_id), CONSTRAINT device_relations_no_self_reference CHECK (device_id <> related_device_id) ) `, ` CREATE TABLE IF NOT EXISTS milestone_hardware_child_devices ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), milestone_hardware_id TEXT NOT NULL, milestone_device_id TEXT NOT NULL, device_type TEXT NOT NULL, name TEXT NOT NULL DEFAULT '', display_name TEXT NOT NULL DEFAULT '', short_name TEXT NOT NULL DEFAULT '', enabled BOOLEAN NOT NULL DEFAULT true, recording_enabled BOOLEAN NOT NULL DEFAULT false, recording_storage_id TEXT NOT NULL DEFAULT '', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE (milestone_hardware_id, milestone_device_id, device_type) ) `, `ALTER TABLE IF EXISTS milestone_hardware_child_devices ADD COLUMN IF NOT EXISTS recording_enabled BOOLEAN NOT NULL DEFAULT false`, `ALTER TABLE IF EXISTS milestone_hardware_child_devices ADD COLUMN IF NOT EXISTS recording_storage_id TEXT NOT NULL DEFAULT ''`, } for _, query := range queries { if _, err := db.Exec(ctx, query); err != nil { return err } } return nil }