mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Split sendCreateCommentAction as two parts, one for update comment related informations, another for actions (#8784)
* Split sendCreateCommentAction as two parts, one for update comment related informations, another for actions * fix lint
This commit is contained in:
		@@ -535,6 +535,10 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = updateCommentInfos(e, opts, comment); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = sendCreateCommentAction(e, opts, comment); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -546,6 +550,56 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
 | 
			
		||||
	return comment, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateCommentInfos(e *xorm.Session, opts *CreateCommentOptions, comment *Comment) (err error) {
 | 
			
		||||
	// Check comment type.
 | 
			
		||||
	switch opts.Type {
 | 
			
		||||
	case CommentTypeCode:
 | 
			
		||||
		if comment.ReviewID != 0 {
 | 
			
		||||
			if comment.Review == nil {
 | 
			
		||||
				if err := comment.loadReview(e); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if comment.Review.Type <= ReviewTypePending {
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case CommentTypeComment:
 | 
			
		||||
		if _, err = e.Exec("UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check attachments
 | 
			
		||||
		attachments := make([]*Attachment, 0, len(opts.Attachments))
 | 
			
		||||
		for _, uuid := range opts.Attachments {
 | 
			
		||||
			attach, err := getAttachmentByUUID(e, uuid)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if IsErrAttachmentNotExist(err) {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				return fmt.Errorf("getAttachmentByUUID [%s]: %v", uuid, err)
 | 
			
		||||
			}
 | 
			
		||||
			attachments = append(attachments, attach)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for i := range attachments {
 | 
			
		||||
			attachments[i].IssueID = opts.Issue.ID
 | 
			
		||||
			attachments[i].CommentID = comment.ID
 | 
			
		||||
			// No assign value could be 0, so ignore AllCols().
 | 
			
		||||
			if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil {
 | 
			
		||||
				return fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case CommentTypeReopen, CommentTypeClose:
 | 
			
		||||
		if err = opts.Issue.updateClosedNum(e); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// update the issue's updated_unix column
 | 
			
		||||
	return updateIssueCols(e, opts.Issue, "updated_unix")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sendCreateCommentAction(e *xorm.Session, opts *CreateCommentOptions, comment *Comment) (err error) {
 | 
			
		||||
	// Compose comment action, could be plain comment, close or reopen issue/pull request.
 | 
			
		||||
	// This object will be used to notify watchers in the end of function.
 | 
			
		||||
@@ -575,56 +629,16 @@ func sendCreateCommentAction(e *xorm.Session, opts *CreateCommentOptions, commen
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case CommentTypeComment:
 | 
			
		||||
		act.OpType = ActionCommentIssue
 | 
			
		||||
 | 
			
		||||
		if _, err = e.Exec("UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check attachments
 | 
			
		||||
		attachments := make([]*Attachment, 0, len(opts.Attachments))
 | 
			
		||||
		for _, uuid := range opts.Attachments {
 | 
			
		||||
			attach, err := getAttachmentByUUID(e, uuid)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if IsErrAttachmentNotExist(err) {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				return fmt.Errorf("getAttachmentByUUID [%s]: %v", uuid, err)
 | 
			
		||||
			}
 | 
			
		||||
			attachments = append(attachments, attach)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for i := range attachments {
 | 
			
		||||
			attachments[i].IssueID = opts.Issue.ID
 | 
			
		||||
			attachments[i].CommentID = comment.ID
 | 
			
		||||
			// No assign value could be 0, so ignore AllCols().
 | 
			
		||||
			if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil {
 | 
			
		||||
				return fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case CommentTypeReopen:
 | 
			
		||||
		act.OpType = ActionReopenIssue
 | 
			
		||||
		if opts.Issue.IsPull {
 | 
			
		||||
			act.OpType = ActionReopenPullRequest
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err = opts.Issue.updateClosedNum(e); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case CommentTypeClose:
 | 
			
		||||
		act.OpType = ActionCloseIssue
 | 
			
		||||
		if opts.Issue.IsPull {
 | 
			
		||||
			act.OpType = ActionClosePullRequest
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err = opts.Issue.updateClosedNum(e); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// update the issue's updated_unix column
 | 
			
		||||
	if err = updateIssueCols(e, opts.Issue, "updated_unix"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// Notify watchers for whatever action comes in, ignore if no action type.
 | 
			
		||||
	if act.OpType > 0 {
 | 
			
		||||
 
 | 
			
		||||
@@ -129,13 +129,17 @@ func (r *Review) publish(e *xorm.Engine) error {
 | 
			
		||||
				go func(en *xorm.Engine, review *Review, comm *Comment) {
 | 
			
		||||
					sess := en.NewSession()
 | 
			
		||||
					defer sess.Close()
 | 
			
		||||
					if err := sendCreateCommentAction(sess, &CreateCommentOptions{
 | 
			
		||||
					opts := &CreateCommentOptions{
 | 
			
		||||
						Doer:    comm.Poster,
 | 
			
		||||
						Issue:   review.Issue,
 | 
			
		||||
						Repo:    review.Issue.Repo,
 | 
			
		||||
						Type:    comm.Type,
 | 
			
		||||
						Content: comm.Content,
 | 
			
		||||
					}, comm); err != nil {
 | 
			
		||||
					}
 | 
			
		||||
					if err := updateCommentInfos(sess, opts, comm); err != nil {
 | 
			
		||||
						log.Warn("updateCommentInfos: %v", err)
 | 
			
		||||
					}
 | 
			
		||||
					if err := sendCreateCommentAction(sess, opts, comm); err != nil {
 | 
			
		||||
						log.Warn("sendCreateCommentAction: %v", err)
 | 
			
		||||
					}
 | 
			
		||||
				}(e, r, comment)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user