mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	models/migrations: finish accessRefactor
This commit is contained in:
		@@ -110,7 +110,7 @@ func sessionRelease(sess *xorm.Session) {
 | 
			
		||||
	sess.Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func accessToCollaboration(x *xorm.Engine) error {
 | 
			
		||||
func accessToCollaboration(x *xorm.Engine) (err error) {
 | 
			
		||||
	type Collaboration struct {
 | 
			
		||||
		ID      int64 `xorm:"pk autoincr"`
 | 
			
		||||
		RepoID  int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
 | 
			
		||||
@@ -118,7 +118,9 @@ func accessToCollaboration(x *xorm.Engine) error {
 | 
			
		||||
		Created time.Time
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	x.Sync(new(Collaboration))
 | 
			
		||||
	if err = x.Sync(new(Collaboration)); err != nil {
 | 
			
		||||
		return fmt.Errorf("sync: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	results, err := x.Query("SELECT u.id AS `uid`, a.repo_name AS `repo`, a.mode AS `mode`, a.created as `created` FROM `access` a JOIN `user` u ON a.user_name=u.lower_name")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -210,7 +212,90 @@ func accessToCollaboration(x *xorm.Engine) error {
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func accessRefactor(x *xorm.Engine) error {
 | 
			
		||||
	//TODO
 | 
			
		||||
	return nil
 | 
			
		||||
func accessRefactor(x *xorm.Engine) (err error) {
 | 
			
		||||
	type (
 | 
			
		||||
		AccessMode int
 | 
			
		||||
		Access     struct {
 | 
			
		||||
			ID       int64 `xorm:"pk autoincr"`
 | 
			
		||||
			UserName string
 | 
			
		||||
			RepoName string
 | 
			
		||||
			UserID   int64 `xorm:"UNIQUE(s)"`
 | 
			
		||||
			RepoID   int64 `xorm:"UNIQUE(s)"`
 | 
			
		||||
			Mode     AccessMode
 | 
			
		||||
		}
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var rawSQL string
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.UseSQLite3, setting.UsePostgreSQL:
 | 
			
		||||
		rawSQL = "DROP INDEX IF EXISTS `UQE_access_S`"
 | 
			
		||||
	case setting.UseMySQL:
 | 
			
		||||
		rawSQL = "DROP INDEX `UQE_access_S` ON `access`"
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = x.Exec(rawSQL); err != nil &&
 | 
			
		||||
		!strings.Contains(err.Error(), "check that column/key exists") {
 | 
			
		||||
		return fmt.Errorf("drop index: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sessionRelease(sess)
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = sess.Sync2(new(Access)); err != nil {
 | 
			
		||||
		return fmt.Errorf("sync: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	accesses := make([]*Access, 0, 50)
 | 
			
		||||
	if err = sess.Iterate(new(Access), func(idx int, bean interface{}) error {
 | 
			
		||||
		a := bean.(*Access)
 | 
			
		||||
 | 
			
		||||
		// Update username to user ID.
 | 
			
		||||
		users, err := sess.Query("SELECT `id` FROM `user` WHERE lower_name=?", a.UserName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("query user: %v", err)
 | 
			
		||||
		} else if len(users) < 1 {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		a.UserID = com.StrTo(users[0]["id"]).MustInt64()
 | 
			
		||||
 | 
			
		||||
		// Update repository name(username/reponame) to repository ID.
 | 
			
		||||
		names := strings.Split(a.RepoName, "/")
 | 
			
		||||
		ownerName := names[0]
 | 
			
		||||
		repoName := names[1]
 | 
			
		||||
 | 
			
		||||
		// Check if user is the owner of the repository.
 | 
			
		||||
		ownerID := a.UserID
 | 
			
		||||
		if ownerName != a.UserName {
 | 
			
		||||
			users, err := sess.Query("SELECT `id` FROM `user` WHERE lower_name=?", ownerName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("query owner: %v", err)
 | 
			
		||||
			} else if len(users) < 1 {
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			ownerID = com.StrTo(users[0]["id"]).MustInt64()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		repos, err := sess.Query("SELECT `id` FROM `repository` WHERE owner_id=? AND lower_name=?", ownerID, repoName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("query repository: %v", err)
 | 
			
		||||
		} else if len(repos) < 1 {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		a.RepoID = com.StrTo(repos[0]["id"]).MustInt64()
 | 
			
		||||
 | 
			
		||||
		accesses = append(accesses, a)
 | 
			
		||||
		return nil
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return fmt.Errorf("iterate: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := range accesses {
 | 
			
		||||
		if _, err = sess.Id(accesses[i].ID).Update(accesses[i]); err != nil {
 | 
			
		||||
			return fmt.Errorf("update: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user