-- ── Users ───────────────────────────────────────────────────────────────────── -- Conformance: "Users, profiles, NIP-05, and user search". One profile per -- (community, pubkey): the same key reposts kind:0 in each community it joins. CREATE TABLE users ( community_id UUID NOT NULL REFERENCES communities(id), pubkey BYTEA NOT NULL, nip05_handle VARCHAR(255), display_name VARCHAR(255), avatar_url TEXT, about TEXT, agent_type VARCHAR(255), capabilities JSONB, okta_user_id VARCHAR(255), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), deactivated_at TIMESTAMPTZ, metadata_event_id BYTEA, agent_owner_pubkey BYTEA, channel_add_policy channel_add_policy NOT NULL DEFAULT 'anyone', PRIMARY KEY (community_id, pubkey), CONSTRAINT chk_users_pubkey_len CHECK (LENGTH(pubkey) = 32), -- agent owner is a user in the SAME community. FOREIGN KEY (community_id, agent_owner_pubkey) REFERENCES users (community_id, pubkey) ON DELETE SET NULL ); -- NIP-05 handle and Okta id unique within a community, not globally. CREATE UNIQUE INDEX idx_users_nip05 ON users (community_id, lower(nip05_handle)) WHERE nip05_handle IS NOT NULL; CREATE UNIQUE INDEX idx_users_okta ON users (community_id, okta_user_id) WHERE okta_user_id IS NOT NULL;