/
migrate.go
143 lines (122 loc) · 3.82 KB
/
migrate.go
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package main
import (
"strings"
"github.com/RedHatInsights/chrome-service-backend/rest/database"
"github.com/RedHatInsights/chrome-service-backend/rest/models"
"github.com/joho/godotenv"
"github.com/sirupsen/logrus"
"gorm.io/datatypes"
"gorm.io/gorm"
)
func getValidGridItems(items []models.GridItem) []models.GridItem {
newGridItems := []models.GridItem{}
for _, item := range items {
widgetTypes := strings.Split(item.ID, "#")
if len(widgetTypes) > 0 {
widgetType := widgetTypes[0]
err := models.AvailableWidgets(widgetType).IsValid()
if err == nil {
newGridItems = append(newGridItems, item)
} else {
logrus.Infof("Removing invalid widget type: %s", widgetType)
}
}
}
return newGridItems
}
func migrateDashboardWidgets(tx *gorm.DB) *gorm.DB {
var templates []models.DashboardTemplate
res := tx.Find(&templates)
if res.Error != nil {
return res
}
for _, t := range templates {
t.TemplateConfig.Xl = datatypes.NewJSONType(getValidGridItems(t.TemplateConfig.Xl.Data()))
t.TemplateConfig.Lg = datatypes.NewJSONType(getValidGridItems(t.TemplateConfig.Lg.Data()))
t.TemplateConfig.Md = datatypes.NewJSONType(getValidGridItems(t.TemplateConfig.Md.Data()))
t.TemplateConfig.Sm = datatypes.NewJSONType(getValidGridItems(t.TemplateConfig.Sm.Data()))
res = tx.Save(&t)
if res.Error != nil {
return res
}
}
return res
}
func main() {
godotenv.Load()
database.Init()
var bundleRes *gorm.DB
var visitedRes *gorm.DB
var dashboardRes *gorm.DB
tx := database.DB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
// fk_user_identities_last_visited_pages
if tx.Migrator().HasConstraint(&models.UserIdentity{}, "fk_user_identities_last_visited_pages") {
if err := tx.Migrator().DropConstraint(&models.UserIdentity{}, "fk_user_identities_last_visited_pages"); err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
}
// temporary - removes unused typo column in dashboard template tables
if tx.Migrator().HasColumn(&models.DashboardTemplate{}, "sx") {
if err := tx.Migrator().DropColumn(&models.DashboardTemplate{}, "sx"); err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
}
if err := tx.AutoMigrate(&models.FavoritePage{}, &models.UserIdentity{}, &models.SelfReport{}, &models.ProductOfInterest{}, &models.DashboardTemplate{}); err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
// Drop old tables
if tx.Migrator().HasTable("last_visited_pages") {
if err := tx.Migrator().DropTable("last_visited_pages"); err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
}
bundleRes = tx.Model(&models.UserIdentity{}).Where("visited_bundles IS NULL").Update("visited_bundles", []byte(`{}`))
if bundleRes.Error != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(bundleRes.Error)
}
visitedRes = tx.Model(&models.UserIdentity{}).Where("last_visited_pages IS NULL").Update("last_visited_pages", []byte(`[]`))
if bundleRes.Error != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(bundleRes.Error)
}
dashboardRes = migrateDashboardWidgets(tx)
if dashboardRes.Error != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(dashboardRes.Error)
}
err := tx.Commit().Error
if err != nil {
logrus.Error("Unable to migrate database!")
tx.Rollback()
panic(err)
}
if bundleRes.RowsAffected > 0 {
logrus.Infof("Migrated %d user identity bundles rows", bundleRes.RowsAffected)
}
if visitedRes.RowsAffected > 0 {
logrus.Infof("Migrated %d user identity visited rows", visitedRes.RowsAffected)
}
logrus.Info("Migration complete")
}