trying to rework database migrations
This commit is contained in:
123
migrations/20250101000002_pack_system.sql
Normal file
123
migrations/20250101000002_pack_system.sql
Normal file
@@ -0,0 +1,123 @@
|
||||
-- Migration: Pack System
|
||||
-- Description: Creates pack and runtime tables (runtime without runtime_type)
|
||||
-- Version: 20250101000002
|
||||
|
||||
-- ============================================================================
|
||||
-- PACK TABLE
|
||||
-- ============================================================================
|
||||
|
||||
CREATE TABLE pack (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
ref TEXT NOT NULL UNIQUE,
|
||||
label TEXT NOT NULL,
|
||||
description TEXT,
|
||||
version TEXT NOT NULL,
|
||||
conf_schema JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
config JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
meta JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
tags TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[],
|
||||
runtime_deps TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[],
|
||||
is_standard BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
installers JSONB DEFAULT '[]'::jsonb,
|
||||
|
||||
-- Installation metadata (nullable for non-installed packs)
|
||||
source_type TEXT,
|
||||
source_url TEXT,
|
||||
source_ref TEXT,
|
||||
checksum TEXT,
|
||||
checksum_verified BOOLEAN DEFAULT FALSE,
|
||||
installed_at TIMESTAMPTZ,
|
||||
installed_by BIGINT,
|
||||
installation_method TEXT,
|
||||
storage_path TEXT,
|
||||
|
||||
created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
|
||||
-- Constraints
|
||||
CONSTRAINT pack_ref_lowercase CHECK (ref = LOWER(ref)),
|
||||
CONSTRAINT pack_ref_format CHECK (ref ~ '^[a-z][a-z0-9_-]+$'),
|
||||
CONSTRAINT pack_version_semver CHECK (
|
||||
version ~ '^\d+\.\d+\.\d+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$'
|
||||
)
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_pack_ref ON pack(ref);
|
||||
CREATE INDEX idx_pack_created ON pack(created DESC);
|
||||
CREATE INDEX idx_pack_is_standard ON pack(is_standard) WHERE is_standard = TRUE;
|
||||
CREATE INDEX idx_pack_is_standard_created ON pack(is_standard, created DESC);
|
||||
CREATE INDEX idx_pack_version_created ON pack(version, created DESC);
|
||||
CREATE INDEX idx_pack_config_gin ON pack USING GIN (config);
|
||||
CREATE INDEX idx_pack_meta_gin ON pack USING GIN (meta);
|
||||
CREATE INDEX idx_pack_tags_gin ON pack USING GIN (tags);
|
||||
CREATE INDEX idx_pack_runtime_deps_gin ON pack USING GIN (runtime_deps);
|
||||
CREATE INDEX idx_pack_installed_at ON pack(installed_at DESC) WHERE installed_at IS NOT NULL;
|
||||
CREATE INDEX idx_pack_installed_by ON pack(installed_by) WHERE installed_by IS NOT NULL;
|
||||
CREATE INDEX idx_pack_source_type ON pack(source_type) WHERE source_type IS NOT NULL;
|
||||
|
||||
-- Trigger
|
||||
CREATE TRIGGER update_pack_updated
|
||||
BEFORE UPDATE ON pack
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_column();
|
||||
|
||||
-- Comments
|
||||
COMMENT ON TABLE pack IS 'Packs bundle related automation components';
|
||||
COMMENT ON COLUMN pack.ref IS 'Unique pack reference identifier (e.g., "slack", "github")';
|
||||
COMMENT ON COLUMN pack.label IS 'Human-readable pack name';
|
||||
COMMENT ON COLUMN pack.version IS 'Semantic version of the pack';
|
||||
COMMENT ON COLUMN pack.conf_schema IS 'JSON schema for pack configuration';
|
||||
COMMENT ON COLUMN pack.config IS 'Pack configuration values';
|
||||
COMMENT ON COLUMN pack.meta IS 'Pack metadata';
|
||||
COMMENT ON COLUMN pack.runtime_deps IS 'Array of required runtime references';
|
||||
COMMENT ON COLUMN pack.is_standard IS 'Whether this is a core/built-in pack';
|
||||
COMMENT ON COLUMN pack.source_type IS 'Installation source type (e.g., "git", "local", "registry")';
|
||||
COMMENT ON COLUMN pack.source_url IS 'URL or path where pack was installed from';
|
||||
COMMENT ON COLUMN pack.source_ref IS 'Git ref, version tag, or other source reference';
|
||||
COMMENT ON COLUMN pack.checksum IS 'Content checksum for verification';
|
||||
COMMENT ON COLUMN pack.checksum_verified IS 'Whether checksum has been verified';
|
||||
COMMENT ON COLUMN pack.installed_at IS 'Timestamp when pack was installed';
|
||||
COMMENT ON COLUMN pack.installed_by IS 'Identity ID of user who installed the pack';
|
||||
COMMENT ON COLUMN pack.installation_method IS 'Method used for installation (e.g., "cli", "api", "auto")';
|
||||
COMMENT ON COLUMN pack.storage_path IS 'Filesystem path where pack files are stored';
|
||||
|
||||
-- ============================================================================
|
||||
-- RUNTIME TABLE
|
||||
-- ============================================================================
|
||||
|
||||
CREATE TABLE runtime (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
ref TEXT NOT NULL UNIQUE,
|
||||
pack BIGINT REFERENCES pack(id) ON DELETE CASCADE,
|
||||
pack_ref TEXT,
|
||||
description TEXT,
|
||||
name TEXT NOT NULL,
|
||||
distributions JSONB NOT NULL,
|
||||
installation JSONB,
|
||||
created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
|
||||
-- Constraints
|
||||
CONSTRAINT runtime_ref_lowercase CHECK (ref = LOWER(ref))
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_runtime_ref ON runtime(ref);
|
||||
CREATE INDEX idx_runtime_pack ON runtime(pack);
|
||||
CREATE INDEX idx_runtime_created ON runtime(created DESC);
|
||||
CREATE INDEX idx_runtime_name ON runtime(name);
|
||||
CREATE INDEX idx_runtime_verification ON runtime USING GIN ((distributions->'verification'));
|
||||
|
||||
-- Trigger
|
||||
CREATE TRIGGER update_runtime_updated
|
||||
BEFORE UPDATE ON runtime
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_column();
|
||||
|
||||
-- Comments
|
||||
COMMENT ON TABLE runtime IS 'Runtime environments for executing actions and sensors (unified)';
|
||||
COMMENT ON COLUMN runtime.ref IS 'Unique runtime reference (format: pack.name, e.g., core.python)';
|
||||
COMMENT ON COLUMN runtime.name IS 'Runtime name (e.g., "Python", "Node.js", "Shell")';
|
||||
COMMENT ON COLUMN runtime.distributions IS 'Runtime distribution metadata including verification commands, version requirements, and capabilities';
|
||||
COMMENT ON COLUMN runtime.installation IS 'Installation requirements and instructions including package managers and setup steps';
|
||||
Reference in New Issue
Block a user