Initial commit: AS4/411 directory and discovery service for Sankofa Marketplace
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
0
packages/storage/migrations/.gitkeep
Normal file
0
packages/storage/migrations/.gitkeep
Normal file
91
packages/storage/migrations/001_initial.sql
Normal file
91
packages/storage/migrations/001_initial.sql
Normal file
@@ -0,0 +1,91 @@
|
||||
-- Initial schema for as4-411 directory (data-model.md)
|
||||
-- Run with psql or migration runner; uses snake_case for columns.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tenants (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS participants (
|
||||
id TEXT PRIMARY KEY,
|
||||
tenant_id TEXT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_participants_tenant_id ON participants(tenant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS identifiers (
|
||||
id TEXT PRIMARY KEY,
|
||||
participant_id TEXT NOT NULL REFERENCES participants(id) ON DELETE CASCADE,
|
||||
identifier_type TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
scope TEXT,
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
verified_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX idx_identifiers_lookup ON identifiers(identifier_type, value);
|
||||
CREATE INDEX idx_identifiers_participant_id ON identifiers(participant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS endpoints (
|
||||
id TEXT PRIMARY KEY,
|
||||
participant_id TEXT NOT NULL REFERENCES participants(id) ON DELETE CASCADE,
|
||||
protocol TEXT NOT NULL,
|
||||
address TEXT NOT NULL,
|
||||
profile TEXT,
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'draining'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_endpoints_participant_id ON endpoints(participant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS capabilities (
|
||||
id TEXT PRIMARY KEY,
|
||||
participant_id TEXT NOT NULL REFERENCES participants(id) ON DELETE CASCADE,
|
||||
service TEXT,
|
||||
action TEXT,
|
||||
process TEXT,
|
||||
document_type TEXT,
|
||||
constraints_json JSONB
|
||||
);
|
||||
|
||||
CREATE INDEX idx_capabilities_participant_id ON capabilities(participant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS credentials (
|
||||
id TEXT PRIMARY KEY,
|
||||
participant_id TEXT NOT NULL REFERENCES participants(id) ON DELETE CASCADE,
|
||||
credential_type TEXT NOT NULL CHECK (credential_type IN ('tls', 'sign', 'encrypt')),
|
||||
vault_ref TEXT NOT NULL,
|
||||
fingerprint TEXT,
|
||||
valid_from TIMESTAMPTZ,
|
||||
valid_to TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX idx_credentials_participant_id ON credentials(participant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS policies (
|
||||
id TEXT PRIMARY KEY,
|
||||
tenant_id TEXT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
rule_json JSONB NOT NULL DEFAULT '{}',
|
||||
effect TEXT NOT NULL CHECK (effect IN ('allow', 'deny')),
|
||||
priority INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_policies_tenant_id ON policies(tenant_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS audit_log (
|
||||
id TEXT PRIMARY KEY,
|
||||
at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
actor TEXT,
|
||||
action TEXT NOT NULL,
|
||||
resource TEXT NOT NULL,
|
||||
resource_id TEXT NOT NULL,
|
||||
payload JSONB,
|
||||
hash_prev TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX idx_audit_log_resource ON audit_log(resource, resource_id);
|
||||
16
packages/storage/migrations/002_routing_artifacts.sql
Normal file
16
packages/storage/migrations/002_routing_artifacts.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
-- Routing artifacts: BIN tables, GTT tables, participant maps, fallback rules.
|
||||
-- See docs/architecture/data-model and protocol_registry.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS routing_artifacts (
|
||||
id TEXT PRIMARY KEY,
|
||||
tenant_id TEXT REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
artifact_type TEXT NOT NULL CHECK (artifact_type IN ('bin_table', 'gtt_table', 'participant_map', 'fallback_rules')),
|
||||
artifact_payload JSONB NOT NULL,
|
||||
effective_from TIMESTAMPTZ NOT NULL,
|
||||
effective_to TIMESTAMPTZ,
|
||||
signature TEXT,
|
||||
fingerprint TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX idx_routing_artifacts_tenant_type ON routing_artifacts(tenant_id, artifact_type);
|
||||
CREATE INDEX idx_routing_artifacts_effective ON routing_artifacts(effective_from, effective_to);
|
||||
20
packages/storage/migrations/003_edges.sql
Normal file
20
packages/storage/migrations/003_edges.sql
Normal file
@@ -0,0 +1,20 @@
|
||||
-- Graph layer: edges with provenance and validity (see data-model.md).
|
||||
-- Optional: used when explicit graph and conflict resolution are needed.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS edges (
|
||||
id TEXT PRIMARY KEY,
|
||||
from_type TEXT NOT NULL,
|
||||
from_id TEXT NOT NULL,
|
||||
to_type TEXT NOT NULL,
|
||||
to_id TEXT NOT NULL,
|
||||
relation TEXT NOT NULL,
|
||||
confidence REAL,
|
||||
source TEXT,
|
||||
valid_from TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
valid_to TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX idx_edges_from ON edges(from_type, from_id);
|
||||
CREATE INDEX idx_edges_to ON edges(to_type, to_id);
|
||||
CREATE INDEX idx_edges_relation ON edges(relation);
|
||||
CREATE INDEX idx_edges_valid ON edges(valid_from, valid_to);
|
||||
Reference in New Issue
Block a user