2019-09-06 10:20:09 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2019-09-06 10:20:09 +08:00
2022-12-10 10:46:31 +08:00
package issue
2019-09-06 10:20:09 +08:00
import (
2022-11-19 09:12:33 +01:00
"context"
2022-12-10 10:46:31 +08:00
"fmt"
2022-11-19 09:12:33 +01:00
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2022-06-13 17:37:59 +08:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2019-10-30 18:02:46 +08:00
"code.gitea.io/gitea/modules/notification"
2021-10-11 06:40:03 +08:00
"code.gitea.io/gitea/modules/timeutil"
2019-09-06 10:20:09 +08:00
)
2022-12-10 10:46:31 +08:00
// CreateRefComment creates a commit reference comment to issue.
2023-07-22 22:14:27 +08:00
func CreateRefComment ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , issue * issues_model . Issue , content , commitSHA string ) error {
2022-12-10 10:46:31 +08:00
if len ( commitSHA ) == 0 {
return fmt . Errorf ( "cannot create reference with empty commit SHA" )
}
// Check if same reference from same commit has already existed.
2023-07-22 22:14:27 +08:00
has , err := db . GetEngine ( ctx ) . Get ( & issues_model . Comment {
2022-12-10 10:46:31 +08:00
Type : issues_model . CommentTypeCommitRef ,
IssueID : issue . ID ,
CommitSHA : commitSHA ,
} )
if err != nil {
return fmt . Errorf ( "check reference comment: %w" , err )
} else if has {
return nil
}
2023-08-04 21:34:34 +08:00
_ , err = issues_model . CreateComment ( ctx , & issues_model . CreateCommentOptions {
2022-12-10 10:46:31 +08:00
Type : issues_model . CommentTypeCommitRef ,
Doer : doer ,
Repo : repo ,
Issue : issue ,
CommitSHA : commitSHA ,
Content : content ,
} )
return err
}
2019-09-25 01:39:50 +08:00
// CreateIssueComment creates a plain issue comment.
2022-11-19 09:12:33 +01:00
func CreateIssueComment ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , issue * issues_model . Issue , content string , attachments [ ] string ) ( * issues_model . Comment , error ) {
2023-08-04 21:34:34 +08:00
comment , err := issues_model . CreateComment ( ctx , & issues_model . CreateCommentOptions {
2022-06-13 17:37:59 +08:00
Type : issues_model . CommentTypeComment ,
2019-09-25 01:39:50 +08:00
Doer : doer ,
Repo : repo ,
Issue : issue ,
Content : content ,
Attachments : attachments ,
} )
if err != nil {
return nil , err
}
2021-10-11 06:40:03 +08:00
2022-11-19 09:12:33 +01:00
mentions , err := issues_model . FindAndUpdateIssueMentions ( ctx , issue , doer , comment . Content )
2021-01-02 18:04:02 +01:00
if err != nil {
return nil , err
}
2021-10-11 06:40:03 +08:00
2022-11-19 09:12:33 +01:00
notification . NotifyCreateIssueComment ( ctx , doer , repo , issue , comment , mentions )
2019-10-30 18:02:46 +08:00
2019-09-25 01:39:50 +08:00
return comment , nil
}
// UpdateComment updates information of comment.
2022-11-19 09:12:33 +01:00
func UpdateComment ( ctx context . Context , c * issues_model . Comment , doer * user_model . User , oldContent string ) error {
2023-04-20 14:39:44 +08:00
needsContentHistory := c . Content != oldContent && c . Type . HasContentSupport ( )
2021-11-22 13:20:16 +01:00
if needsContentHistory {
2022-11-19 09:12:33 +01:00
hasContentHistory , err := issues_model . HasIssueContentHistory ( ctx , c . IssueID , c . ID )
2021-11-22 13:20:16 +01:00
if err != nil {
return err
}
if ! hasContentHistory {
2022-11-19 09:12:33 +01:00
if err = issues_model . SaveIssueContentHistory ( ctx , c . PosterID , c . IssueID , c . ID ,
2021-11-22 13:20:16 +01:00
c . CreatedUnix , oldContent , true ) ; err != nil {
return err
}
}
}
2022-06-13 17:37:59 +08:00
if err := issues_model . UpdateComment ( c , doer ) ; err != nil {
2019-09-25 01:39:50 +08:00
return err
}
2021-11-22 13:20:16 +01:00
if needsContentHistory {
2022-11-19 09:12:33 +01:00
err := issues_model . SaveIssueContentHistory ( ctx , doer . ID , c . IssueID , c . ID , timeutil . TimeStampNow ( ) , c . Content , false )
2021-10-11 06:40:03 +08:00
if err != nil {
return err
}
}
2022-11-19 09:12:33 +01:00
notification . NotifyUpdateComment ( ctx , doer , c , oldContent )
2019-09-25 01:39:50 +08:00
return nil
}
// DeleteComment deletes the comment
2022-11-19 09:12:33 +01:00
func DeleteComment ( ctx context . Context , doer * user_model . User , comment * issues_model . Comment ) error {
2023-01-08 09:34:58 +08:00
err := db . WithTx ( ctx , func ( ctx context . Context ) error {
2022-11-19 09:12:33 +01:00
return issues_model . DeleteComment ( ctx , comment )
} )
2022-06-13 17:37:59 +08:00
if err != nil {
return err
}
2019-09-25 01:39:50 +08:00
2022-11-19 09:12:33 +01:00
notification . NotifyDeleteComment ( ctx , doer , comment )
2019-09-25 01:39:50 +08:00
return nil
}