Remove migration dependency to models

This commit is contained in:
kolaente 2020-05-30 17:09:35 +02:00
parent dc036d44db
commit 250c45d1b9
No known key found for this signature in database
GPG key ID: F40E70337AB24C9B

View file

@ -17,28 +17,77 @@
package migration package migration
import ( import (
"code.vikunja.io/api/pkg/models" "code.vikunja.io/api/pkg/timeutil"
"src.techknowlogick.com/xormigrate" "src.techknowlogick.com/xormigrate"
"strings"
"xorm.io/xorm" "xorm.io/xorm"
) )
type list20200516123847 struct {
ID int64 `xorm:"int(11) autoincr not null unique pk" json:"id" param:"list"`
Title string `xorm:"varchar(250) not null" json:"title" valid:"required,runelength(3|250)" minLength:"3" maxLength:"250"`
Description string `xorm:"longtext null" json:"description"`
Identifier string `xorm:"varchar(10) null" json:"identifier" valid:"runelength(0|10)" minLength:"0" maxLength:"10"`
HexColor string `xorm:"varchar(6) null" json:"hex_color" valid:"runelength(0|6)" maxLength:"6"`
OwnerID int64 `xorm:"int(11) INDEX not null" json:"-"`
NamespaceID int64 `xorm:"int(11) INDEX not null" json:"-" param:"namespace"`
IsArchived bool `xorm:"not null default false" json:"is_archived" query:"is_archived"`
Created timeutil.TimeStamp `xorm:"created not null" json:"created"`
Updated timeutil.TimeStamp `xorm:"updated not null" json:"updated"`
}
func init() { func init() {
migrations = append(migrations, &xormigrate.Migration{ migrations = append(migrations, &xormigrate.Migration{
ID: "20200516123847", ID: "20200516123847",
Description: "Generate a list identifier for each list", Description: "Generate a list identifier for each list",
Migrate: func(tx *xorm.Engine) error { Migrate: func(tx *xorm.Engine) error {
lists := []*models.List{} lists := []*list20200516123847{}
err := tx.Find(&lists) err := tx.Find(&lists)
if err != nil { if err != nil {
return err return err
} }
// Copied and adopted from pkg/models/list.go:374
generateListIdentifier := func(l *list20200516123847, sess *xorm.Engine) (err error) {
// The general idea here is to take the title and slice it into pieces, until we found a unique piece.
var exists = true
titleSlug := strings.Replace(strings.ToUpper(l.Title), " ", "", -1)
// We can save at most 10 characters in the db, so we need to ensure it has at most 10 characters
if len(titleSlug) > 10 {
titleSlug = titleSlug[0:9]
}
var i = 0
for exists {
// Prevent endless looping
if i == len(titleSlug) {
break
}
// Take a random part of the title slug, starting at the beginning
l.Identifier = titleSlug[i:]
exists, err = sess.
Where("identifier = ?", l.Identifier).
And("id != ?", l.ID).
Exist(&list20200516123847{})
if err != nil {
return
}
i++
}
return nil
}
for _, l := range lists { for _, l := range lists {
if l.Identifier != "" { if l.Identifier != "" {
continue continue
} }
err := models.GenerateListIdentifier(l, tx) err := generateListIdentifier(l, tx)
if err != nil { if err != nil {
return err return err
} }