mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-04-17 03:01:35 +02:00
Merge remote-tracking branch 'refs/remotes/origin/addPortToFederationHost' into addPortToFederationHost
This commit is contained in:
commit
c86d436261
6 changed files with 143 additions and 0 deletions
|
@ -0,0 +1,5 @@
|
|||
-
|
||||
id: 1
|
||||
user_id: 3
|
||||
federation_host_id: 1
|
||||
external_id: "18"
|
|
@ -0,0 +1,5 @@
|
|||
-
|
||||
id: 1
|
||||
host_fqdn: "my.host.x"
|
||||
software_name: forgejo
|
||||
latest_activity: 2024-04-26 14:14:50
|
|
@ -0,0 +1,3 @@
|
|||
-
|
||||
id: 3
|
||||
normalized_federated_uri: "https://my.host.x/api/activitypub/user-id/18"
|
|
@ -366,6 +366,8 @@ func prepareMigrationTasks() []*migration {
|
|||
// Migration to Forgejo v10
|
||||
newMigration(303, "Gitea last drop", v1_23.GiteaLastDrop),
|
||||
newMigration(304, "Migrate `secret` column to store keying material", forgejo_migrations.MigrateTwoFactorToKeying),
|
||||
|
||||
newMigration(305, "Migrate `User.NormalizedFederatedURI` column to extract port & schema into FederatedHost", v1_23.MigrateNormalizedFederatedURI),
|
||||
}
|
||||
return preparedMigrations
|
||||
}
|
||||
|
|
54
models/migrations/v1_23/v305.go
Normal file
54
models/migrations/v1_23/v305.go
Normal file
|
@ -0,0 +1,54 @@
|
|||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_23 //nolint
|
||||
|
||||
import (
|
||||
"code.gitea.io/gitea/models/migrations/base"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
func MigrateNormalizedFederatedURI(x *xorm.Engine) error {
|
||||
// New Fields
|
||||
type FederatedUser struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 `xorm:"NOT NULL"`
|
||||
ExternalID string `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
|
||||
FederationHostID int64 `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
|
||||
NormalizedOriginalURL string
|
||||
}
|
||||
type User struct {
|
||||
NormalizedFederatedURI string
|
||||
}
|
||||
// TODO: add new fields to FederationHost
|
||||
if err := x.Sync(new(User), new(FederatedUser)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Migrate User.NormalizedFederatedURI -> FederatedUser.NormalizedOriginalUrl
|
||||
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 {
|
||||
return err
|
||||
}
|
||||
|
||||
// Migrate (Port, Schema) FederatedUser.NormalizedOriginalUrl -> FederationHost.(Port, Schema)
|
||||
// TODO
|
||||
|
||||
// Drop User.NormalizedFederatedURI field in extra transaction
|
||||
sessSchema := x.NewSession()
|
||||
defer sessSchema.Close()
|
||||
if err := sessSchema.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := base.DropTableColumns(sessSchema, "user", "normalized_federated_uri"); err != nil {
|
||||
return err
|
||||
}
|
||||
return sessSchema.Commit()
|
||||
}
|
74
models/migrations/v1_23/v305_test.go
Normal file
74
models/migrations/v1_23/v305_test.go
Normal file
|
@ -0,0 +1,74 @@
|
|||
// Copyright 2025 The Forgejo Authors.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package v1_23 //nolint
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
migration_tests "code.gitea.io/gitea/models/migrations/test"
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"xorm.io/xorm/schemas"
|
||||
)
|
||||
|
||||
func Test_MigrateNormalizedFederatedURI(t *testing.T) {
|
||||
// Old structs
|
||||
type User struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
NormalizedFederatedURI string
|
||||
}
|
||||
type FederatedUser struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 `xorm:"NOT NULL"`
|
||||
ExternalID string `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
|
||||
FederationHostID int64 `xorm:"UNIQUE(federation_user_mapping) NOT NULL"`
|
||||
}
|
||||
type FederationHost struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
HostFqdn string `xorm:"host_fqdn UNIQUE INDEX VARCHAR(255) NOT NULL"`
|
||||
SoftwareName string `xorm:"NOT NULL"`
|
||||
LatestActivity time.Time `xorm:"NOT NULL"`
|
||||
Created timeutil.TimeStamp `xorm:"created"`
|
||||
Updated timeutil.TimeStamp `xorm:"updated"`
|
||||
}
|
||||
|
||||
// Prepare TestEnv
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0,
|
||||
new(User),
|
||||
new(FederatedUser),
|
||||
new(FederationHost),
|
||||
)
|
||||
defer deferable()
|
||||
if x == nil || t.Failed() {
|
||||
return
|
||||
}
|
||||
|
||||
// test for expected results
|
||||
getColumn := func() *schemas.Column {
|
||||
tables, err := x.DBMetas()
|
||||
require.NoError(t, err)
|
||||
var table *schemas.Table
|
||||
for _, elem := range tables {
|
||||
if elem.Name == "user" {
|
||||
table = elem
|
||||
break
|
||||
}
|
||||
}
|
||||
require.Equal(t, "user", table.Name)
|
||||
return table.GetColumn("normalized_federated_uri")
|
||||
}
|
||||
|
||||
require.NotNil(t, getColumn(), "NormalizedFederatedURI column exists")
|
||||
require.NoError(t, MigrateNormalizedFederatedURI(x))
|
||||
require.Nil(t, getColumn(), "NormalizedFederatedURI column was deleted")
|
||||
// idempotent
|
||||
require.NoError(t, MigrateNormalizedFederatedURI(x))
|
||||
|
||||
// TODO: Find a good way to test
|
||||
// res, err := x.Query("SELECT normalized_original_url FROM federated_user WHERE user_id= ?", 3)
|
||||
// require.NoError(t, err)
|
||||
// assert.EqualValues(t, "https://my.host.x/api/activitypub/user-id/18", string(res[0]["normalized_original_url"]))
|
||||
}
|
Loading…
Add table
Reference in a new issue