2019-10-14 09:10:42 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-10-14 09:10:42 +03:00
package migrations
import (
2019-12-15 12:51:28 +03:00
"context"
2021-11-10 08:13:16 +03:00
"code.gitea.io/gitea/models/db"
2021-11-28 17:11:58 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-10-14 09:10:42 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/structs"
2023-09-09 00:09:23 +03:00
"code.gitea.io/gitea/services/externalaccount"
2019-10-14 09:10:42 +03:00
)
// UpdateMigrationPosterID updates all migrated repositories' issues and comments posterID
2020-05-17 02:31:38 +03:00
func UpdateMigrationPosterID ( ctx context . Context ) error {
2019-10-14 09:10:42 +03:00
for _ , gitService := range structs . SupportedFullGitService {
2019-12-15 12:51:28 +03:00
select {
case <- ctx . Done ( ) :
2020-05-17 02:31:38 +03:00
log . Warn ( "UpdateMigrationPosterID aborted before %s" , gitService . Name ( ) )
2021-11-10 08:13:16 +03:00
return db . ErrCancelledf ( "during UpdateMigrationPosterID before %s" , gitService . Name ( ) )
2019-12-15 12:51:28 +03:00
default :
}
if err := updateMigrationPosterIDByGitService ( ctx , gitService ) ; err != nil {
2019-10-14 09:10:42 +03:00
log . Error ( "updateMigrationPosterIDByGitService failed: %v" , err )
}
}
2020-05-17 02:31:38 +03:00
return nil
2019-10-14 09:10:42 +03:00
}
2019-12-15 12:51:28 +03:00
func updateMigrationPosterIDByGitService ( ctx context . Context , tp structs . GitServiceType ) error {
2019-10-14 09:10:42 +03:00
provider := tp . Name ( )
if len ( provider ) == 0 {
return nil
}
const batchSize = 100
2023-11-24 06:49:41 +03:00
for page := 0 ; ; page ++ {
2019-12-15 12:51:28 +03:00
select {
case <- ctx . Done ( ) :
2020-05-17 02:31:38 +03:00
log . Warn ( "UpdateMigrationPosterIDByGitService(%s) cancelled" , tp . Name ( ) )
2019-12-15 12:51:28 +03:00
return nil
default :
}
2023-11-24 06:49:41 +03:00
users , err := db . Find [ user_model . ExternalLoginUser ] ( ctx , user_model . FindExternalUserOptions {
ListOptions : db . ListOptions {
PageSize : batchSize ,
Page : page ,
} ,
2019-10-14 09:10:42 +03:00
Provider : provider ,
2023-11-24 06:49:41 +03:00
OrderBy : "login_source_id ASC, external_id ASC" ,
2019-10-14 09:10:42 +03:00
} )
if err != nil {
return err
}
for _ , user := range users {
2019-12-15 12:51:28 +03:00
select {
case <- ctx . Done ( ) :
2020-05-17 02:31:38 +03:00
log . Warn ( "UpdateMigrationPosterIDByGitService(%s) cancelled" , tp . Name ( ) )
2019-12-15 12:51:28 +03:00
return nil
default :
}
2019-10-17 05:06:28 +03:00
externalUserID := user . ExternalID
2023-09-25 16:17:37 +03:00
if err := externalaccount . UpdateMigrationsByType ( ctx , tp , externalUserID , user . UserID ) ; err != nil {
2019-10-14 09:10:42 +03:00
log . Error ( "UpdateMigrationsByType type %s external user id %v to local user id %v failed: %v" , tp . Name ( ) , user . ExternalID , user . UserID , err )
}
}
if len ( users ) < batchSize {
break
}
}
return nil
}