]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git/blobdiff - db/db.go
Redis connection.
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git] / db / db.go
index bc4b8b3f4e5a16d345849b3972e563b7e629f5ba..078cd5895885f5308a13729c3acca58ed2544266 100644 (file)
--- a/db/db.go
+++ b/db/db.go
@@ -1,18 +1,20 @@
 package db
 
 import (
-       "fmt"
-       "strings"
-
+       migrate "github.com/go-pg/migrations"
        "github.com/go-pg/pg"
        "github.com/go-pg/pg/orm"
+       "github.com/go-redis/redis"
        "github.com/jloup/utils"
 )
 
-var DB *pg.DB
-
 var log = utils.StandardL().WithField("module", "db")
 
+var (
+       DB    *pg.DB
+       Redis *redis.Client
+)
+
 type DBConfig struct {
        Address  string
        Database string
@@ -20,56 +22,92 @@ type DBConfig struct {
        Password string
 }
 
-func Init(config DBConfig) {
+type RedisConfig struct {
+       Type     string // tcp or unix
+       Address  string
+       Password string
+}
+
+func Init(config DBConfig, redisConfig RedisConfig) {
        var err error
 
        DB = connect(config)
 
-       err = createSchema(DB)
+       err = migratedb()
        if err != nil {
-               log.Errorf("cannot create schemas %v\n", err)
+               log.Fatalf("cannot migratedb '%v'\n", err)
        }
 
-       err = createIndexes(DB)
+       Redis = redis.NewClient(&redis.Options{
+               Network:  redisConfig.Type,
+               Addr:     redisConfig.Address,
+               Password: redisConfig.Password,
+               DB:       0,
+       })
+
+       _, err = Redis.Ping().Result()
+
        if err != nil {
-               log.Errorf("cannot create indexes %v\n", err)
+               log.Fatalf("redis init error %s", err)
        }
-}
 
-func connect(config DBConfig) *pg.DB {
-       return pg.Connect(&pg.Options{
-               User:     config.User,
-               Password: config.Password,
-               Database: config.Database,
-               Addr:     config.Address,
-       })
 }
 
-func createSchema(db *pg.DB) error {
-       for _, model := range []interface{}{&User{}, &MarketConfig{}} {
-               err := db.CreateTable(model, &orm.CreateTableOptions{IfNotExists: true})
-               if err != nil {
-                       return err
-               }
+func migratedb() error {
+       /* Remove after first MEP */
+       version, err := migrate.Version(DB)
+       if err != nil {
+               return err
        }
-       return nil
-}
 
-func createIndexes(db *pg.DB) error {
-       indexes := []struct {
-               TableName string
-               Name      string
-               Columns   []string
-       }{
-               {"market_configs", "market_name_user_id_idx", []string{"user_id", "market_name"}},
+       if version == 0 {
+               return migrate.SetVersion(DB, 1)
        }
+       /***/
+
+       mig := make([]migrate.Migration, 0)
+
+       for _, migration := range migrations {
+               mig = append(mig, migrate.Migration{
+                       Version: migration.Version,
+                       Up: func(db orm.DB) error {
+                               for _, query := range migration.Up {
+                                       _, err := db.Exec(query)
+                                       if err != nil {
+                                               return err
+                                       }
+                               }
 
-       for _, index := range indexes {
-               _, err := db.Exec(fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s ON %s (%s)", index.Name, index.TableName, strings.Join(index.Columns, ",")))
-               if err != nil {
-                       return err
-               }
+                               return nil
+                       },
+                       Down: func(db orm.DB) error {
+                               for _, query := range migration.Down {
+                                       _, err := db.Exec(query)
+                                       if err != nil {
+                                               return err
+                                       }
+                               }
+
+                               return nil
+                       },
+               })
        }
 
-       return nil
+       oldVersion, newVersion, err := migrate.RunMigrations(DB, mig, "up")
+
+       if oldVersion != newVersion {
+               log.Infof("Migrate DB: %v -> %v", oldVersion, newVersion)
+       } else {
+               log.Infof("DB up-to-date: version '%v'", newVersion)
+       }
+       return err
+}
+
+func connect(config DBConfig) *pg.DB {
+       return pg.Connect(&pg.Options{
+               User:     config.User,
+               Password: config.Password,
+               Database: config.Database,
+               Addr:     config.Address,
+       })
 }