Implement "conversation lock" for issue comments (#5073)
This commit is contained in:
parent
64ce159a6e
commit
44114b38e6
19 changed files with 435 additions and 4 deletions
|
@ -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))
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue