Files
cloud-orchestrator/schema-provisioning.sql
kappa 91a6e227ed docs: add provisioning API documentation to CLAUDE.md
- Add provisioning service files to Architecture section
- Document telegram-conversations DB tables (users, user_deposits, server_orders)
- Add Server Provisioning API section with endpoints and security features
- Update Bindings with USER_DB and PROVISION_QUEUE
- Add provisioning API test examples
- Include schema-provisioning.sql for reference

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 17:22:36 +09:00

71 lines
3.1 KiB
SQL

-- Provisioning System Schema
-- Users, Payment Holds, Server Orders
-- 1. Users table with deposit balance
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY, -- UUID
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
balance_usd REAL NOT NULL DEFAULT 0.0 CHECK(balance_usd >= 0),
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'suspended', 'deleted')),
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_status ON users(status);
-- 2. Payment holds table (hold → capture/release)
CREATE TABLE IF NOT EXISTS payment_holds (
id TEXT PRIMARY KEY, -- UUID
user_id TEXT NOT NULL,
order_id TEXT NOT NULL, -- References server_orders.id
amount_usd REAL NOT NULL CHECK(amount_usd > 0),
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'captured', 'released')),
reason TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
resolved_at TEXT, -- When captured or released
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_payment_holds_user ON payment_holds(user_id);
CREATE INDEX IF NOT EXISTS idx_payment_holds_order ON payment_holds(order_id);
CREATE INDEX IF NOT EXISTS idx_payment_holds_status ON payment_holds(status);
-- 3. Server orders table
CREATE TABLE IF NOT EXISTS server_orders (
id TEXT PRIMARY KEY, -- UUID
user_id TEXT NOT NULL,
pricing_id INTEGER NOT NULL, -- References pricing.id (instance_type + region)
provider_name TEXT NOT NULL, -- linode, vultr, etc.
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN (
'pending', -- Order created, hold placed
'provisioning', -- API call in progress
'active', -- Server running
'failed', -- Provisioning failed
'deleted' -- Server terminated
)),
-- Provider response data
provider_instance_id TEXT, -- Linode/Vultr instance ID
server_ip TEXT, -- IPv4 address
server_ipv6 TEXT, -- IPv6 address
root_password TEXT, -- Encrypted/hashed
-- Cost tracking
monthly_cost_usd REAL NOT NULL,
-- Metadata
label TEXT, -- User-defined server label
os_image TEXT NOT NULL DEFAULT 'ubuntu_22_04',
error_message TEXT,
-- Timestamps
created_at TEXT NOT NULL DEFAULT (datetime('now')),
provisioned_at TEXT,
deleted_at TEXT,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (pricing_id) REFERENCES pricing(id)
);
CREATE INDEX IF NOT EXISTS idx_server_orders_user ON server_orders(user_id);
CREATE INDEX IF NOT EXISTS idx_server_orders_status ON server_orders(status);
CREATE INDEX IF NOT EXISTS idx_server_orders_provider ON server_orders(provider_name, provider_instance_id);
CREATE INDEX IF NOT EXISTS idx_server_orders_created ON server_orders(created_at);