gito/services/core/migrations/00001_initial.sql
toki c9952509e9 feat(core): Forgejo 브랜치 이벤트 및 런타임 채널 인프라를 추가한다
- ControlPlane 라우터에 워커/에이전트 구독 채널을 추가한다
- ProtoSocket 기반 실시간 양방향 채널( dispatcher, envelope, server)을 구현한다
- Forgejo push 이벤트를 provider 어댑터로 처리하도록 연동한다
- PostgreSQL 스토리지 백엔드를 분리하여 postgres.go로 신설한다
- Git engine command에 diff/checkout/merge 연쇄 연산을 추가한다
- 런타임 모델에 agentSession, runtimeChannel 스키마를 추가한다
- 데이터베이스 마이그레이션에 agent_session, runtime_channel, lease 테이블을 추가한다
- agent-contract에 Forgejo branch events 계약 문서를 작성한다
- 로드맵 마일스톤과 아카이브 작업을 갱신한다
2026-06-13 19:16:03 +09:00

90 lines
2.8 KiB
SQL

-- +goose Up
-- +goose StatementBegin
CREATE TABLE IF NOT EXISTS repos (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
remote_url TEXT NOT NULL,
default_branch TEXT NOT NULL,
workspace_root TEXT NOT NULL,
credential_ref TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS workspace_leases (
id TEXT PRIMARY KEY,
repo_id TEXT NOT NULL REFERENCES repos(id),
slot TEXT NOT NULL,
path TEXT NOT NULL,
state TEXT NOT NULL,
expires_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (repo_id, slot)
);
CREATE TABLE IF NOT EXISTS operations (
id TEXT PRIMARY KEY,
repo_id TEXT NOT NULL REFERENCES repos(id),
type TEXT NOT NULL,
state TEXT NOT NULL,
idempotency_key TEXT,
created_by TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX IF NOT EXISTS ux_operations_idempotency
ON operations (idempotency_key)
WHERE idempotency_key IS NOT NULL;
CREATE TABLE IF NOT EXISTS operation_events (
id TEXT PRIMARY KEY,
operation_id TEXT REFERENCES operations(id),
type TEXT NOT NULL,
subject TEXT NOT NULL,
payload JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS revision_cursors (
repo_id TEXT NOT NULL,
branch TEXT NOT NULL,
revision TEXT NOT NULL,
observed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (repo_id, branch)
);
CREATE TABLE IF NOT EXISTS branch_watches (
id TEXT PRIMARY KEY,
provider TEXT NOT NULL,
repo_id TEXT NOT NULL,
branch TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (provider, repo_id, branch)
);
CREATE TABLE IF NOT EXISTS provider_deliveries (
id TEXT PRIMARY KEY,
provider TEXT NOT NULL,
delivery_id TEXT NOT NULL,
dedupe_key TEXT NOT NULL,
event_id TEXT NOT NULL,
repo_id TEXT NOT NULL,
branch TEXT NOT NULL,
revision TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (provider, dedupe_key)
);
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS provider_deliveries;
DROP TABLE IF EXISTS branch_watches;
DROP TABLE IF EXISTS revision_cursors;
DROP TABLE IF EXISTS operation_events;
DROP TABLE IF EXISTS operations;
DROP TABLE IF EXISTS workspace_leases;
DROP TABLE IF EXISTS repos;
-- +goose StatementEnd