code.gitea.io/gitea@v1.22.3/services/migrations/update.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package migrations
     5  
     6  import (
     7  	"context"
     8  
     9  	"code.gitea.io/gitea/models/db"
    10  	user_model "code.gitea.io/gitea/models/user"
    11  	"code.gitea.io/gitea/modules/log"
    12  	"code.gitea.io/gitea/modules/structs"
    13  	"code.gitea.io/gitea/services/externalaccount"
    14  )
    15  
    16  // UpdateMigrationPosterID updates all migrated repositories' issues and comments posterID
    17  func UpdateMigrationPosterID(ctx context.Context) error {
    18  	for _, gitService := range structs.SupportedFullGitService {
    19  		select {
    20  		case <-ctx.Done():
    21  			log.Warn("UpdateMigrationPosterID aborted before %s", gitService.Name())
    22  			return db.ErrCancelledf("during UpdateMigrationPosterID before %s", gitService.Name())
    23  		default:
    24  		}
    25  		if err := updateMigrationPosterIDByGitService(ctx, gitService); err != nil {
    26  			log.Error("updateMigrationPosterIDByGitService failed: %v", err)
    27  		}
    28  	}
    29  	return nil
    30  }
    31  
    32  func updateMigrationPosterIDByGitService(ctx context.Context, tp structs.GitServiceType) error {
    33  	provider := tp.Name()
    34  	if len(provider) == 0 {
    35  		return nil
    36  	}
    37  
    38  	const batchSize = 100
    39  	for page := 0; ; page++ {
    40  		select {
    41  		case <-ctx.Done():
    42  			log.Warn("UpdateMigrationPosterIDByGitService(%s) cancelled", tp.Name())
    43  			return nil
    44  		default:
    45  		}
    46  
    47  		users, err := db.Find[user_model.ExternalLoginUser](ctx, user_model.FindExternalUserOptions{
    48  			ListOptions: db.ListOptions{
    49  				PageSize: batchSize,
    50  				Page:     page,
    51  			},
    52  			Provider: provider,
    53  			OrderBy:  "login_source_id ASC, external_id ASC",
    54  		})
    55  		if err != nil {
    56  			return err
    57  		}
    58  
    59  		for _, user := range users {
    60  			select {
    61  			case <-ctx.Done():
    62  				log.Warn("UpdateMigrationPosterIDByGitService(%s) cancelled", tp.Name())
    63  				return nil
    64  			default:
    65  			}
    66  			externalUserID := user.ExternalID
    67  			if err := externalaccount.UpdateMigrationsByType(ctx, tp, externalUserID, user.UserID); err != nil {
    68  				log.Error("UpdateMigrationsByType type %s external user id %v to local user id %v failed: %v", tp.Name(), user.ExternalID, user.UserID, err)
    69  			}
    70  		}
    71  
    72  		if len(users) < batchSize {
    73  			break
    74  		}
    75  	}
    76  	return nil
    77  }