mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Implement "conversation lock" for issue comments (#5073)
This commit is contained in:
		@@ -57,6 +57,10 @@ type Issue struct {
 | 
			
		||||
	Reactions        ReactionList  `xorm:"-"`
 | 
			
		||||
	TotalTrackedTime int64         `xorm:"-"`
 | 
			
		||||
	Assignees        []*User       `xorm:"-"`
 | 
			
		||||
 | 
			
		||||
	// IsLocked limits commenting abilities to users on an issue
 | 
			
		||||
	// with write access
 | 
			
		||||
	IsLocked bool `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 
 | 
			
		||||
@@ -80,6 +80,10 @@ const (
 | 
			
		||||
	CommentTypeCode
 | 
			
		||||
	// Reviews a pull request by giving general feedback
 | 
			
		||||
	CommentTypeReview
 | 
			
		||||
	// Lock an issue, giving only collaborators access
 | 
			
		||||
	CommentTypeLock
 | 
			
		||||
	// Unlocks a previously locked issue
 | 
			
		||||
	CommentTypeUnlock
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CommentTag defines comment tag type
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								models/issue_lock.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								models/issue_lock.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
// Copyright 2019 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// IssueLockOptions defines options for locking and/or unlocking an issue/PR
 | 
			
		||||
type IssueLockOptions struct {
 | 
			
		||||
	Doer   *User
 | 
			
		||||
	Issue  *Issue
 | 
			
		||||
	Reason string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LockIssue locks an issue. This would limit commenting abilities to
 | 
			
		||||
// users with write access to the repo
 | 
			
		||||
func LockIssue(opts *IssueLockOptions) error {
 | 
			
		||||
	return updateIssueLock(opts, true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnlockIssue unlocks a previously locked issue.
 | 
			
		||||
func UnlockIssue(opts *IssueLockOptions) error {
 | 
			
		||||
	return updateIssueLock(opts, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateIssueLock(opts *IssueLockOptions, lock bool) error {
 | 
			
		||||
	if opts.Issue.IsLocked == lock {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts.Issue.IsLocked = lock
 | 
			
		||||
 | 
			
		||||
	var commentType CommentType
 | 
			
		||||
	if opts.Issue.IsLocked {
 | 
			
		||||
		commentType = CommentTypeLock
 | 
			
		||||
	} else {
 | 
			
		||||
		commentType = CommentTypeUnlock
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := UpdateIssueCols(opts.Issue, "is_locked"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := CreateComment(&CreateCommentOptions{
 | 
			
		||||
		Doer:    opts.Doer,
 | 
			
		||||
		Issue:   opts.Issue,
 | 
			
		||||
		Repo:    opts.Issue.Repo,
 | 
			
		||||
		Type:    commentType,
 | 
			
		||||
		Content: opts.Reason,
 | 
			
		||||
	})
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
@@ -213,6 +213,8 @@ var migrations = []Migration{
 | 
			
		||||
	NewMigration("rename repo is_bare to repo is_empty", renameRepoIsBareToIsEmpty),
 | 
			
		||||
	// v79 -> v80
 | 
			
		||||
	NewMigration("add can close issues via commit in any branch", addCanCloseIssuesViaCommitInAnyBranch),
 | 
			
		||||
	// v80 -> v81
 | 
			
		||||
	NewMigration("add is locked to issues", addIsLockedToIssues),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Migrate database to current version
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								models/migrations/v80.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								models/migrations/v80.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// Copyright 2019 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import "github.com/go-xorm/xorm"
 | 
			
		||||
 | 
			
		||||
func addIsLockedToIssues(x *xorm.Engine) error {
 | 
			
		||||
	// Issue see models/issue.go
 | 
			
		||||
	type Issue struct {
 | 
			
		||||
		ID       int64 `xorm:"pk autoincr"`
 | 
			
		||||
		IsLocked bool  `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return x.Sync2(new(Issue))
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user