v25.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package migrations
  2. import (
  3. "fmt"
  4. "gorm.io/gorm"
  5. )
  6. func insertUserPrimaryEmail(db *gorm.DB) error {
  7. type EmailAddress struct {
  8. ID int64 `gorm:"primaryKey"`
  9. UserID int64 `xorm:"uid INDEX NOT NULL" gorm:"column:uid;index;uniqueIndex:email_address_user_email_unique;not null"`
  10. Email string `xorm:"UNIQUE NOT NULL" gorm:"uniqueIndex:email_address_user_email_unique;not null;size:254"`
  11. IsActivated bool `gorm:"not null;default:FALSE"`
  12. }
  13. type User struct {
  14. ID int64 `gorm:"primaryKey"`
  15. Email string `xorm:"NOT NULL" gorm:"not null"`
  16. IsActive bool // Activate primary email
  17. }
  18. return db.Transaction(func(tx *gorm.DB) error {
  19. const limit = 100
  20. var offset = 0
  21. for {
  22. var res []User
  23. err := tx.Table("user").Where("type = ?", 0).Offset(offset).Limit(limit).Find(&res).Error
  24. if err != nil {
  25. return fmt.Errorf("query user error: %s", err.Error())
  26. }
  27. for _, r := range res {
  28. record := &EmailAddress{
  29. UserID: r.ID,
  30. Email: r.Email,
  31. IsActivated: r.IsActive,
  32. }
  33. err := tx.Table("email_address").Where("uid = ? AND email = ?", record.UserID, record.Email).FirstOrCreate(record).Error
  34. if err != nil {
  35. return fmt.Errorf("insert email error: %s", err.Error())
  36. }
  37. }
  38. if len(res) < limit {
  39. break
  40. } else {
  41. offset += len(res)
  42. }
  43. }
  44. return nil
  45. })
  46. }