feat(auth): replace internal auth with JWT token service
- Replace InternalAuthService with TokenService using JWT tokens - Add support for token issuance, refresh, verification and revocation - Implement automatic signing key rotation with Redis storage - Add database migration checks for indexes and foreign key constraints - Update gRPC endpoints to use token-based authentication - Remove deprecated API key based authentication system - Add JSON Web Token support with HMAC-SHA256 signing - Implement refresh token handling with automatic rotation - Add token revocation by JTI and user ID - Update build configuration to include core proto files - Migrate database schema to handle token-based authentication - Add comprehensive token validation and verification logic
This commit is contained in:
+54
-18
@@ -843,10 +843,14 @@ CREATE TABLE IF NOT EXISTS issue (
|
||||
deleted_at TIMESTAMPTZ NULL
|
||||
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_repo_id ON issue (repo_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_author_id ON issue (author_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_repo_created ON issue (repo_id, created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_deleted ON issue (deleted_at) WHERE deleted_at IS NOT NULL;
|
||||
DO $$ BEGIN
|
||||
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issue' AND column_name = 'repo_id') THEN
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_repo_id ON issue (repo_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_issue_repo_created ON issue (repo_id, created_at DESC);
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- models/issues/issue_labels.rs → issue_label
|
||||
CREATE TABLE IF NOT EXISTS issue_label (
|
||||
@@ -2059,28 +2063,60 @@ CREATE INDEX IF NOT EXISTS idx_conversation_summary_to_message_id ON conversatio
|
||||
|
||||
-- PHASE B: Deferred FKs (circular / self-referencing)
|
||||
|
||||
ALTER TABLE agent_execution_step ADD CONSTRAINT fk_agent_execution_step_execution_id
|
||||
FOREIGN KEY (execution_id) REFERENCES agent_execution(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_agent_execution_step_execution_id') THEN
|
||||
ALTER TABLE agent_execution_step ADD CONSTRAINT fk_agent_execution_step_execution_id
|
||||
FOREIGN KEY (execution_id) REFERENCES agent_execution(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE agent ADD CONSTRAINT fk_agent_current_version_id
|
||||
FOREIGN KEY (current_version_id) REFERENCES agent_version(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_agent_current_version_id') THEN
|
||||
ALTER TABLE agent ADD CONSTRAINT fk_agent_current_version_id
|
||||
FOREIGN KEY (current_version_id) REFERENCES agent_version(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE channel ADD CONSTRAINT fk_channel_last_message_id
|
||||
FOREIGN KEY (last_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_channel_last_message_id') THEN
|
||||
ALTER TABLE channel ADD CONSTRAINT fk_channel_last_message_id
|
||||
FOREIGN KEY (last_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE message ADD CONSTRAINT fk_message_thread_id
|
||||
FOREIGN KEY (thread_id) REFERENCES message_thread(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_message_thread_id') THEN
|
||||
ALTER TABLE message ADD CONSTRAINT fk_message_thread_id
|
||||
FOREIGN KEY (thread_id) REFERENCES message_thread(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE message ADD CONSTRAINT fk_message_reply_to_message_id
|
||||
FOREIGN KEY (reply_to_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_message_reply_to_message_id') THEN
|
||||
ALTER TABLE message ADD CONSTRAINT fk_message_reply_to_message_id
|
||||
FOREIGN KEY (reply_to_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE issue_comment ADD CONSTRAINT fk_issue_comment_reply_to_comment_id
|
||||
FOREIGN KEY (reply_to_comment_id) REFERENCES issue_comment(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_issue_comment_reply_to_comment_id') THEN
|
||||
ALTER TABLE issue_comment ADD CONSTRAINT fk_issue_comment_reply_to_comment_id
|
||||
FOREIGN KEY (reply_to_comment_id) REFERENCES issue_comment(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE message_thread ADD CONSTRAINT fk_message_thread_root_message_id
|
||||
FOREIGN KEY (root_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_message_thread_root_message_id') THEN
|
||||
ALTER TABLE message_thread ADD CONSTRAINT fk_message_thread_root_message_id
|
||||
FOREIGN KEY (root_message_id) REFERENCES message(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
ALTER TABLE conversation_message ADD CONSTRAINT fk_conversation_message_parent_message_id
|
||||
FOREIGN KEY (parent_message_id) REFERENCES conversation_message(id) ON DELETE CASCADE;
|
||||
DO $$ BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_conversation_message_parent_message_id') THEN
|
||||
ALTER TABLE conversation_message ADD CONSTRAINT fk_conversation_message_parent_message_id
|
||||
FOREIGN KEY (parent_message_id) REFERENCES conversation_message(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
COMMIT;
|
||||
@@ -27,8 +27,8 @@ CREATE TABLE IF NOT EXISTS wiki_page_revision (
|
||||
CONSTRAINT uq_wiki_revision_page_version UNIQUE (page_id, version)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_wiki_page_repo_id ON wiki_page(repo_id);
|
||||
CREATE INDEX idx_wiki_page_slug ON wiki_page(slug);
|
||||
CREATE INDEX idx_wiki_page_deleted_at ON wiki_page(deleted_at) WHERE deleted_at IS NULL;
|
||||
CREATE INDEX idx_wiki_revision_page_id ON wiki_page_revision(page_id);
|
||||
CREATE INDEX idx_wiki_revision_version ON wiki_page_revision(version);
|
||||
CREATE INDEX IF NOT EXISTS idx_wiki_page_repo_id ON wiki_page(repo_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_wiki_page_slug ON wiki_page(slug);
|
||||
CREATE INDEX IF NOT EXISTS idx_wiki_page_deleted_at ON wiki_page(deleted_at) WHERE deleted_at IS NULL;
|
||||
CREATE INDEX IF NOT EXISTS idx_wiki_revision_page_id ON wiki_page_revision(page_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_wiki_revision_version ON wiki_page_revision(version);
|
||||
|
||||
Reference in New Issue
Block a user