v25.go 1.5 KB

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