18F/e-QIP-prototype

View on GitHub
api/migration.go

Summary

Maintainability
A
0 mins
Test Coverage
// +build !windows

package api

import (
    "path/filepath"

    "github.com/pkg/errors"
    "github.com/truetandem/plucked/migration"
)

// Migration is a service used for data storage migrations.
type Migration struct {
    Env Settings
}

// Up attempts to push any pending updates to the database
func (service Migration) Up(dbURI, directory, environment, schema string) error {
    conf, err := service.databaseConf(dbURI, directory, environment, schema)
    if err != nil {
        return errors.Wrap(err, "Couldn't determine db Conf")
    }

    target, err := migration.NumericComponent(service.Env.String(DbMigrationTarget))
    if err != nil {
        target, err = migration.GetMostRecentDBVersion(conf.MigrationsDir)
        if err != nil {
            return errors.Wrap(err, "Couldn't Get most recent version")
        }
    }

    return migration.RunMigrations(conf, conf.MigrationsDir, target)
}

// CurrentVersion gets the database current version according to the migration status
func (service Migration) CurrentVersion(dbURI, directory, environment, schema string) (int64, error) {
    conf, err := service.databaseConf(dbURI, directory, environment, schema)
    if err != nil {
        return 0, err
    }

    return migration.GetDBVersion(conf)
}

// databaseConf will generate the configuration in memory using environment variables
// instead of the YAML file. This is ideal to reduce the dependencies in production.
func (service Migration) databaseConf(dbURI, directory, environment, schema string) (*migration.DBConf, error) {
    return &migration.DBConf{
        MigrationsDir: filepath.Join(directory, "migrations"),
        Env:           environment,
        PgSchema:      schema,
        Driver:        service.databaseDriver(dbURI),
    }, nil
}

// databaseDriver creates the structure required for migration database driver.
func (service Migration) databaseDriver(uri string) migration.DBDriver {
    return migration.DBDriver{
        Name:    "postgres",
        OpenStr: uri,
        Import:  "github.com/lib/pq",
        Dialect: &migration.PostgresDialect{},
    }
}