Files
gitks/migrate/006_pr_review_fork_protection.sql
T
2026-06-07 11:30:56 +08:00

77 lines
3.6 KiB
SQL

-- 006: PR Reviews, Branch Protection, Fork enhancements
CREATE TABLE IF NOT EXISTS pr_review (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
pull_request_id UUID NOT NULL REFERENCES pull_request(id) ON DELETE CASCADE,
author_id UUID NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
state TEXT NOT NULL,
body TEXT NULL,
commit_sha TEXT NULL,
submitted_at TIMESTAMPTZ NULL,
dismissed_at TIMESTAMPTZ NULL,
dismissed_by UUID NULL REFERENCES "user"(id) ON DELETE CASCADE,
dismiss_reason TEXT NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_pr_review_pull_request_id ON pr_review (pull_request_id);
CREATE INDEX IF NOT EXISTS idx_pr_review_author_id ON pr_review (author_id);
CREATE TABLE IF NOT EXISTS pr_review_comment (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
review_id UUID NOT NULL REFERENCES pr_review(id) ON DELETE CASCADE,
pull_request_id UUID NOT NULL REFERENCES pull_request(id) ON DELETE CASCADE,
author_id UUID NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
body TEXT NOT NULL,
path TEXT NOT NULL,
line INTEGER NULL,
original_line INTEGER NULL,
start_line INTEGER NULL,
original_start_line INTEGER NULL,
diff_hunk TEXT NULL,
in_reply_to_id UUID NULL REFERENCES pr_review_comment(id) ON DELETE CASCADE,
edited_at TIMESTAMPTZ NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_pr_review_comment_review_id ON pr_review_comment (review_id);
CREATE INDEX IF NOT EXISTS idx_pr_review_comment_pull_request_id ON pr_review_comment (pull_request_id);
CREATE INDEX IF NOT EXISTS idx_pr_review_comment_author_id ON pr_review_comment (author_id);
CREATE INDEX IF NOT EXISTS idx_pr_review_comment_path ON pr_review_comment (path);
CREATE TABLE IF NOT EXISTS branch_protection_rule (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
repo_id UUID NOT NULL REFERENCES repo(id) ON DELETE CASCADE,
pattern TEXT NOT NULL,
require_approvals INTEGER NOT NULL DEFAULT 0,
require_status_checks BOOLEAN NOT NULL DEFAULT false,
required_status_checks TEXT[] NOT NULL DEFAULT '{}',
require_linear_history BOOLEAN NOT NULL DEFAULT false,
allow_force_pushes BOOLEAN NOT NULL DEFAULT false,
allow_deletions BOOLEAN NOT NULL DEFAULT false,
require_signed_commits BOOLEAN NOT NULL DEFAULT false,
require_code_owner_review BOOLEAN NOT NULL DEFAULT false,
dismiss_stale_reviews BOOLEAN NOT NULL DEFAULT false,
restrict_pushes BOOLEAN NOT NULL DEFAULT false,
push_allowances UUID[] NOT NULL DEFAULT '{}',
restrict_review_dismissal BOOLEAN NOT NULL DEFAULT false,
dismissal_allowances UUID[] NOT NULL DEFAULT '{}',
require_conversation_resolution BOOLEAN NOT NULL DEFAULT false,
created_by UUID NULL REFERENCES "user"(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
CONSTRAINT uq_branch_protection_rule UNIQUE (repo_id, pattern)
);
CREATE INDEX IF NOT EXISTS idx_branch_protection_rule_repo_id ON branch_protection_rule (repo_id);
CREATE TABLE IF NOT EXISTS repo_fork (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
parent_repo_id UUID NOT NULL REFERENCES repo(id) ON DELETE CASCADE,
fork_repo_id UUID NOT NULL REFERENCES repo(id) ON DELETE CASCADE,
forked_by UUID NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL,
CONSTRAINT uq_repo_fork UNIQUE (parent_repo_id, fork_repo_id)
);
CREATE INDEX IF NOT EXISTS idx_repo_fork_parent ON repo_fork (parent_repo_id);
CREATE INDEX IF NOT EXISTS idx_repo_fork_fork ON repo_fork (fork_repo_id);