summaryrefslogtreecommitdiff
path: root/src/invidious/database/migrator.cr
blob: 660c32034d192e856a5f500da715b880fe6a4b88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Invidious::Database::Migrator
  MIGRATIONS_TABLE = "public.invidious_migrations"

  class_getter migrations = [] of Invidious::Database::Migration.class

  def initialize(@db : DB::Database)
  end

  def migrate
    versions = load_versions

    ran_migration = false
    load_migrations.sort_by(&.version)
      .each do |migration|
        next if versions.includes?(migration.version)

        puts "Running migration: #{migration.class.name}"
        migration.migrate
        ran_migration = true
      end

    puts "No migrations to run." unless ran_migration
  end

  def pending_migrations? : Bool
    versions = load_versions

    load_migrations.sort_by(&.version)
      .any? { |migration| !versions.includes?(migration.version) }
  end

  private def load_migrations : Array(Invidious::Database::Migration)
    self.class.migrations.map(&.new(@db))
  end

  private def load_versions : Array(Int64)
    create_migrations_table
    @db.query_all("SELECT version FROM #{MIGRATIONS_TABLE}", as: Int64)
  end

  private def create_migrations_table
    @db.exec <<-SQL
      CREATE TABLE IF NOT EXISTS #{MIGRATIONS_TABLE} (
        id bigserial PRIMARY KEY,
        version bigint NOT NULL
      )
    SQL
  end
end