mirror of
https://github.com/freedbygrace/DynamoDNS.git
synced 2026-07-26 11:38:13 +00:00
277ee0c9b6
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9111ef36-26c8-4085-84ca-a35dc1fec1b5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7083d608-d6d3-4a6a-9a27-6286c5109627/c3b7d9a5-de8b-4951-8fe9-8c111686d08e.jpg
240 lines
8.4 KiB
PL/PgSQL
240 lines
8.4 KiB
PL/PgSQL
-- Enable uuid-ossp extension if not already enabled
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
-- Drop existing tables with a clean slate approach
|
|
-- We'll save data first, then recreate the schema with UUIDs
|
|
|
|
-- Create temporary tables to store data
|
|
CREATE TEMP TABLE tmp_organizations AS SELECT * FROM organizations;
|
|
CREATE TEMP TABLE tmp_users AS SELECT * FROM users;
|
|
CREATE TEMP TABLE tmp_domains AS SELECT * FROM domains;
|
|
CREATE TEMP TABLE tmp_dns_records AS SELECT * FROM dns_records;
|
|
CREATE TEMP TABLE tmp_providers AS SELECT * FROM providers;
|
|
CREATE TEMP TABLE tmp_api_tokens AS SELECT * FROM api_tokens;
|
|
CREATE TEMP TABLE tmp_dns_history AS SELECT * FROM dns_history;
|
|
CREATE TEMP TABLE tmp_dns_metrics AS SELECT * FROM dns_metrics;
|
|
|
|
-- Drop all tables (in reverse order of dependencies)
|
|
DROP TABLE IF EXISTS dns_metrics;
|
|
DROP TABLE IF EXISTS dns_history;
|
|
DROP TABLE IF EXISTS dns_records;
|
|
DROP TABLE IF EXISTS api_tokens;
|
|
DROP TABLE IF EXISTS domains;
|
|
DROP TABLE IF EXISTS users;
|
|
DROP TABLE IF EXISTS providers;
|
|
DROP TABLE IF EXISTS organizations;
|
|
|
|
-- Now recreate tables with UUID fields
|
|
CREATE TABLE organizations (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE providers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
credentials JSONB,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE users (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
username TEXT NOT NULL UNIQUE,
|
|
password TEXT NOT NULL,
|
|
email TEXT NOT NULL UNIQUE,
|
|
full_name TEXT,
|
|
role TEXT NOT NULL DEFAULT 'user',
|
|
organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE domains (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
|
|
provider_id UUID REFERENCES providers(id) ON DELETE SET NULL,
|
|
provider_domain_id TEXT,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
auto_update BOOLEAN NOT NULL DEFAULT false,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
last_checked TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE dns_records (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
domain_id UUID NOT NULL REFERENCES domains(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
content TEXT NOT NULL,
|
|
ttl INTEGER NOT NULL DEFAULT 3600,
|
|
priority INTEGER,
|
|
provider_record_id TEXT,
|
|
notes TEXT,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
auto_update BOOLEAN NOT NULL DEFAULT false,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
last_updated TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE api_tokens (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
token TEXT NOT NULL UNIQUE,
|
|
permissions TEXT[] NOT NULL,
|
|
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
expires_at TIMESTAMP,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
last_used TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE dns_history (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
record_id UUID NOT NULL REFERENCES dns_records(id) ON DELETE CASCADE,
|
|
action TEXT NOT NULL,
|
|
previous_value TEXT,
|
|
new_value TEXT,
|
|
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
timestamp TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE dns_metrics (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
metric_type TEXT NOT NULL,
|
|
domain_id UUID REFERENCES domains(id) ON DELETE CASCADE,
|
|
record_id UUID REFERENCES dns_records(id) ON DELETE CASCADE,
|
|
value DOUBLE PRECISION NOT NULL,
|
|
timestamp TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Create new tables for the features that were missing
|
|
CREATE TABLE webhooks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
url TEXT NOT NULL,
|
|
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
|
|
secret TEXT,
|
|
events TEXT[] NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
last_triggered TIMESTAMP,
|
|
created_by UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE webhook_delivery_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
webhook_id UUID NOT NULL REFERENCES webhooks(id) ON DELETE CASCADE,
|
|
payload JSONB NOT NULL,
|
|
response TEXT,
|
|
status_code INTEGER,
|
|
status BOOLEAN NOT NULL,
|
|
error TEXT,
|
|
timestamp TIMESTAMP NOT NULL DEFAULT now(),
|
|
duration_ms INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE TABLE custom_roles (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL UNIQUE,
|
|
description TEXT,
|
|
permissions TEXT[] NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
created_by UUID NOT NULL REFERENCES users(id) ON DELETE SET NULL
|
|
);
|
|
|
|
CREATE TABLE groups (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_by UUID NOT NULL REFERENCES users(id) ON DELETE SET NULL
|
|
);
|
|
|
|
CREATE TABLE group_memberships (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
group_id UUID NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
entity_type TEXT NOT NULL,
|
|
entity_id UUID NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
conditions JSONB
|
|
);
|
|
|
|
-- Helper function to generate a UUID from an integer
|
|
CREATE OR REPLACE FUNCTION int_to_uuid(id INTEGER) RETURNS UUID AS $$
|
|
BEGIN
|
|
RETURN uuid_generate_v5('11111111-1111-1111-1111-111111111111'::UUID, id::TEXT);
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Insert data back into the tables with UUIDs
|
|
-- Organizations
|
|
INSERT INTO organizations (id, name, is_active, created_at)
|
|
SELECT int_to_uuid(id), name, is_active, created_at
|
|
FROM tmp_organizations;
|
|
|
|
-- Providers
|
|
INSERT INTO providers (id, name, type, credentials, is_active, created_at)
|
|
SELECT int_to_uuid(id), name, type, credentials, is_active, created_at
|
|
FROM tmp_providers;
|
|
|
|
-- Users
|
|
INSERT INTO users (id, username, password, email, full_name, role, organization_id, created_at)
|
|
SELECT int_to_uuid(id), username, password, email, full_name, role, int_to_uuid(organization_id), created_at
|
|
FROM tmp_users;
|
|
|
|
-- Domains
|
|
INSERT INTO domains (id, name, organization_id, provider_id, provider_domain_id, is_active, auto_update, created_at, last_checked)
|
|
SELECT int_to_uuid(id), name, int_to_uuid(organization_id),
|
|
CASE WHEN provider_id IS NOT NULL THEN int_to_uuid(provider_id) ELSE NULL END,
|
|
provider_domain_id, is_active, auto_update, created_at, last_checked
|
|
FROM tmp_domains;
|
|
|
|
-- DNS Records
|
|
INSERT INTO dns_records (id, domain_id, name, type, content, ttl, priority, provider_record_id, notes, is_active, auto_update, created_at, last_updated)
|
|
SELECT int_to_uuid(id), int_to_uuid(domain_id), name, type, content, ttl, priority, provider_record_id, notes, is_active, auto_update, created_at, last_updated
|
|
FROM tmp_dns_records;
|
|
|
|
-- API Tokens
|
|
INSERT INTO api_tokens (id, organization_id, name, token, permissions, created_by, expires_at, is_active, created_at, last_used)
|
|
SELECT int_to_uuid(id), int_to_uuid(organization_id), name, token, permissions,
|
|
CASE WHEN created_by IS NOT NULL THEN int_to_uuid(created_by) ELSE NULL END,
|
|
expires_at, is_active, created_at, last_used
|
|
FROM tmp_api_tokens;
|
|
|
|
-- DNS History
|
|
INSERT INTO dns_history (id, record_id, action, previous_value, new_value, user_id, timestamp)
|
|
SELECT int_to_uuid(id), int_to_uuid(record_id), action, previous_value, new_value,
|
|
CASE WHEN user_id IS NOT NULL THEN int_to_uuid(user_id) ELSE NULL END,
|
|
timestamp
|
|
FROM tmp_dns_history;
|
|
|
|
-- DNS Metrics
|
|
INSERT INTO dns_metrics (id, metric_type, domain_id, record_id, value, timestamp)
|
|
SELECT int_to_uuid(id), metric_type,
|
|
CASE WHEN domain_id IS NOT NULL THEN int_to_uuid(domain_id) ELSE NULL END,
|
|
CASE WHEN record_id IS NOT NULL THEN int_to_uuid(record_id) ELSE NULL END,
|
|
value, timestamp
|
|
FROM tmp_dns_metrics;
|
|
|
|
-- Drop the conversion function
|
|
DROP FUNCTION int_to_uuid;
|
|
|
|
-- Clean up session table if it exists
|
|
DROP TABLE IF EXISTS session;
|
|
|
|
-- Recreate session table for auth
|
|
CREATE TABLE IF NOT EXISTS "session" (
|
|
"sid" varchar NOT NULL COLLATE "default",
|
|
"sess" json NOT NULL,
|
|
"expire" timestamp(6) NOT NULL,
|
|
CONSTRAINT "session_pkey" PRIMARY KEY ("sid")
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS "IDX_session_expire" ON "session" ("expire"); |