1.6 KiB · text 5af55d9
defmodule GitGud.Repo.Migrations.CreateIssues do
use Ecto.Migration
def change do
create table(:issues) do
add :repository_id, references(:repositories, on_delete: :delete_all), null: false
add :author_id, references(:users, on_delete: :nilify_all)
# 1-based, scoped per repo (#1, #2, ...)
add :number, :integer, null: false
add :title, :string, null: false, size: 255
add :body, :text
add :state, :string, null: false, default: "open"
add :closed_at, :utc_datetime
timestamps(type: :utc_datetime)
end
create unique_index(:issues, [:repository_id, :number])
create index(:issues, [:repository_id, :state])
create index(:issues, [:author_id])
# Postgres FTS via generated tsvector + GIN index
execute """
ALTER TABLE issues
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', coalesce(body, '')), 'B')
) STORED;
""",
"ALTER TABLE issues DROP COLUMN search_vector;"
create index(:issues, [:search_vector], using: :gin)
create table(:issue_comments) do
add :issue_id, references(:issues, on_delete: :delete_all), null: false
add :author_id, references(:users, on_delete: :nilify_all)
add :body, :text, null: false
timestamps(type: :utc_datetime)
end
create index(:issue_comments, [:issue_id, :inserted_at])
# Per-repo issue number sequence is enforced by app-level allocator;
# the unique index above is the safety net.
end
end