migration now works

This commit is contained in:
Michael Jerger 2025-04-03 14:30:09 +02:00
parent aa0c7fab21
commit fee5a5b688
2 changed files with 43 additions and 12 deletions

View file

@ -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"`

View file

@ -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()