From fee5a5b688e9485a24d2c4dfafc34fd9f5c8e126 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Thu, 3 Apr 2025 14:30:09 +0200 Subject: [PATCH] migration now works --- models/forgefed/federationhost.go | 7 +++-- models/forgejo_migrations/v29.go | 48 +++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/models/forgefed/federationhost.go b/models/forgefed/federationhost.go index 4806da78de..271013fa1e 100644 --- a/models/forgefed/federationhost.go +++ b/models/forgefed/federationhost.go @@ -15,9 +15,10 @@ import ( // FederationHost data type // swagger:model type FederationHost struct { - ID int64 `xorm:"pk autoincr"` - HostFqdn string `xorm:"host_fqdn UNIQUE INDEX VARCHAR(255) NOT NULL"` - NodeInfo NodeInfo `xorm:"extends NOT NULL"` + ID int64 `xorm:"pk autoincr"` + HostFqdn string `xorm:"host_fqdn UNIQUE INDEX VARCHAR(255) NOT NULL"` + NodeInfo NodeInfo `xorm:"extends NOT NULL"` + //TODO: why is this not a number? HostPort string `xorm:"NOT NULL DEFAULT '443'"` HostSchema string `xorm:"NOT NULL DEFAULT 'https'"` LatestActivity time.Time `xorm:"NOT NULL"` diff --git a/models/forgejo_migrations/v29.go b/models/forgejo_migrations/v29.go index 2295532611..89214c2762 100644 --- a/models/forgejo_migrations/v29.go +++ b/models/forgejo_migrations/v29.go @@ -4,15 +4,17 @@ package forgejo_migrations //nolint:revive import ( + "fmt" "time" "forgejo.org/models/migrations/base" + "forgejo.org/modules/forgefed" "forgejo.org/modules/timeutil" "xorm.io/xorm" ) func MigrateNormalizedFederatedURI(x *xorm.Engine) error { - // New Fields + // Update schema type FederatedUser struct { ID int64 `xorm:"pk autoincr"` UserID int64 `xorm:"NOT NULL"` @@ -21,6 +23,7 @@ func MigrateNormalizedFederatedURI(x *xorm.Engine) error { NormalizedOriginalURL string } type User struct { + ID int64 `xorm:"pk autoincr"` NormalizedFederatedURI string } type FederationHost struct { @@ -33,26 +36,53 @@ func MigrateNormalizedFederatedURI(x *xorm.Engine) error { Created timeutil.TimeStamp `xorm:"created"` Updated timeutil.TimeStamp `xorm:"updated"` } - // TODO: add new fields to FederationHost if err := x.Sync(new(User), new(FederatedUser), new(FederationHost)); err != nil { return err } - // Migrate User.NormalizedFederatedURI -> FederatedUser.NormalizedOriginalUrl + // Migrate sessMigration := x.NewSession() defer sessMigration.Close() if err := sessMigration.Begin(); err != nil { return err } - if _, err := sessMigration.Exec("UPDATE `federated_user` SET `normalized_original_url` = (SELECT normalized_federated_uri FROM `user` WHERE `user`.id = federated_user.user_id)"); err != nil { - return err - } - if err := sessMigration.Commit(); err != nil { + federatedUsers := make([]*FederatedUser, 0) + err := sessMigration.Where("normalized_original_url=''").OrderBy("id").Find(&federatedUsers) + if err != nil { return err } - // Migrate (Port, Schema) FederatedUser.NormalizedOriginalUrl -> FederationHost.(Port, Schema) - // TODO + for _, federatedUser := range federatedUsers { + user := &User{} + has, err := sessMigration.Where("id=?", federatedUser.UserID).Get(user) + if err != nil { + return err + } + if !has { + return fmt.Errorf("user not found %v", federatedUser.UserID) + } + fmt.Printf("user: %v\nfederatedUser: %v\n", user, federatedUser) + + // Migrate User.NormalizedFederatedURI -> FederatedUser.NormalizedOriginalUrl + sql := "UPDATE `federated_user` SET `normalized_original_url` = ? WHERE `id` = ?" + if _, err := sessMigration.Exec(sql, user.NormalizedFederatedURI, federatedUser.FederationHostID); err != nil { + return err + } + + // Migrate (Port, Schema) FederatedUser.NormalizedOriginalUrl -> FederationHost.(Port, Schema) + actorId, err := forgefed.NewActorID(user.NormalizedFederatedURI) + if err != nil { + return err + } + sql = "UPDATE `federation_host` SET `host_port` = ?, `host_schema` = ? WHERE `id` = ?" + if _, err := sessMigration.Exec(sql, actorId.HostPort, actorId.HostSchema, federatedUser.FederationHostID); err != nil { + return err + } + } + + if err := sessMigration.Commit(); err != nil { + return err + } // Drop User.NormalizedFederatedURI field in extra transaction sessSchema := x.NewSession()