aboutsummaryrefslogtreecommitdiffstats
path: root/models/issue_reaction.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/issue_reaction.go')
-rw-r--r--models/issue_reaction.go34
1 files changed, 29 insertions, 5 deletions
diff --git a/models/issue_reaction.go b/models/issue_reaction.go
index 6896eeeafc..d421ab44e9 100644
--- a/models/issue_reaction.go
+++ b/models/issue_reaction.go
@@ -30,6 +30,8 @@ type Reaction struct {
type FindReactionsOptions struct {
IssueID int64
CommentID int64
+ UserID int64
+ Reaction string
}
func (opts *FindReactionsOptions) toConds() builder.Cond {
@@ -46,6 +48,12 @@ func (opts *FindReactionsOptions) toConds() builder.Cond {
} else if opts.CommentID == -1 {
cond = cond.And(builder.Eq{"reaction.comment_id": 0})
}
+ if opts.UserID > 0 {
+ cond = cond.And(builder.Eq{"reaction.user_id": opts.UserID})
+ }
+ if opts.Reaction != "" {
+ cond = cond.And(builder.Eq{"reaction.type": opts.Reaction})
+ }
return cond
}
@@ -80,9 +88,25 @@ func createReaction(e *xorm.Session, opts *ReactionOptions) (*Reaction, error) {
UserID: opts.Doer.ID,
IssueID: opts.Issue.ID,
}
+ findOpts := FindReactionsOptions{
+ IssueID: opts.Issue.ID,
+ CommentID: -1, // reaction to issue only
+ Reaction: opts.Type,
+ UserID: opts.Doer.ID,
+ }
if opts.Comment != nil {
reaction.CommentID = opts.Comment.ID
+ findOpts.CommentID = opts.Comment.ID
}
+
+ existingR, err := findReactions(e, findOpts)
+ if err != nil {
+ return nil, err
+ }
+ if len(existingR) > 0 {
+ return existingR[0], ErrReactionAlreadyExist{Reaction: opts.Type}
+ }
+
if _, err := e.Insert(reaction); err != nil {
return nil, err
}
@@ -99,23 +123,23 @@ type ReactionOptions struct {
}
// CreateReaction creates reaction for issue or comment.
-func CreateReaction(opts *ReactionOptions) (reaction *Reaction, err error) {
+func CreateReaction(opts *ReactionOptions) (*Reaction, error) {
if !setting.UI.ReactionsMap[opts.Type] {
return nil, ErrForbiddenIssueReaction{opts.Type}
}
sess := x.NewSession()
defer sess.Close()
- if err = sess.Begin(); err != nil {
+ if err := sess.Begin(); err != nil {
return nil, err
}
- reaction, err = createReaction(sess, opts)
+ reaction, err := createReaction(sess, opts)
if err != nil {
- return nil, err
+ return reaction, err
}
- if err = sess.Commit(); err != nil {
+ if err := sess.Commit(); err != nil {
return nil, err
}
return reaction, nil