2019-01-17 17:23:22 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-01-17 17:23:22 +03:00
package indexer
import (
2022-11-19 11:12:33 +03:00
"context"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-12-08 22:15:35 +03:00
code_indexer "code.gitea.io/gitea/modules/indexer/code"
2019-02-21 03:54:05 +03:00
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
2020-02-11 12:34:17 +03:00
stats_indexer "code.gitea.io/gitea/modules/indexer/stats"
2019-02-19 17:39:39 +03:00
"code.gitea.io/gitea/modules/log"
2019-01-17 17:23:22 +03:00
"code.gitea.io/gitea/modules/notification/base"
2020-01-10 12:34:21 +03:00
"code.gitea.io/gitea/modules/repository"
2019-12-08 22:15:35 +03:00
"code.gitea.io/gitea/modules/setting"
2019-01-17 17:23:22 +03:00
)
type indexerNotifier struct {
base . NullNotifier
}
2022-01-20 20:46:10 +03:00
var _ base . Notifier = & indexerNotifier { }
2019-01-17 17:23:22 +03:00
// NewNotifier create a new indexerNotifier notifier
func NewNotifier ( ) base . Notifier {
return & indexerNotifier { }
}
2023-06-26 09:59:15 +03:00
func ( r * indexerNotifier ) NotifyAdoptRepository ( ctx context . Context , doer , u * user_model . User , repo * repo_model . Repository ) {
r . NotifyMigrateRepository ( ctx , doer , u , repo )
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyCreateIssueComment ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository ,
2022-06-13 12:37:59 +03:00
issue * issues_model . Issue , comment * issues_model . Comment , mentions [ ] * user_model . User ,
2022-02-23 23:16:07 +03:00
) {
2022-06-13 12:37:59 +03:00
if comment . Type == issues_model . CommentTypeComment {
2019-02-19 17:39:39 +03:00
if issue . Comments == nil {
2022-11-19 11:12:33 +03:00
if err := issue . LoadDiscussComments ( ctx ) ; err != nil {
log . Error ( "LoadDiscussComments failed: %v" , err )
2019-02-19 17:39:39 +03:00
return
}
} else {
issue . Comments = append ( issue . Comments , comment )
}
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( issue )
2019-01-17 17:23:22 +03:00
}
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyNewIssue ( ctx context . Context , issue * issues_model . Issue , mentions [ ] * user_model . User ) {
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( issue )
2019-01-17 17:23:22 +03:00
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyNewPullRequest ( ctx context . Context , pr * issues_model . PullRequest , mentions [ ] * user_model . User ) {
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( pr . Issue )
2019-01-17 17:23:22 +03:00
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyUpdateComment ( ctx context . Context , doer * user_model . User , c * issues_model . Comment , oldContent string ) {
2022-06-13 12:37:59 +03:00
if c . Type == issues_model . CommentTypeComment {
2019-02-19 17:39:39 +03:00
var found bool
if c . Issue . Comments != nil {
for i := 0 ; i < len ( c . Issue . Comments ) ; i ++ {
if c . Issue . Comments [ i ] . ID == c . ID {
c . Issue . Comments [ i ] = c
found = true
break
}
}
}
if ! found {
2022-11-19 11:12:33 +03:00
if err := c . Issue . LoadDiscussComments ( ctx ) ; err != nil {
log . Error ( "LoadDiscussComments failed: %v" , err )
2019-02-19 17:39:39 +03:00
return
}
}
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( c . Issue )
2019-01-17 17:23:22 +03:00
}
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyDeleteComment ( ctx context . Context , doer * user_model . User , comment * issues_model . Comment ) {
2022-06-13 12:37:59 +03:00
if comment . Type == issues_model . CommentTypeComment {
2022-11-19 11:12:33 +03:00
if err := comment . LoadIssue ( ctx ) ; err != nil {
2019-10-30 13:02:46 +03:00
log . Error ( "LoadIssue: %v" , err )
return
}
2019-02-19 17:39:39 +03:00
var found bool
if comment . Issue . Comments != nil {
for i := 0 ; i < len ( comment . Issue . Comments ) ; i ++ {
if comment . Issue . Comments [ i ] . ID == comment . ID {
comment . Issue . Comments = append ( comment . Issue . Comments [ : i ] , comment . Issue . Comments [ i + 1 : ] ... )
found = true
break
}
}
}
if ! found {
2022-11-19 11:12:33 +03:00
if err := comment . Issue . LoadDiscussComments ( ctx ) ; err != nil {
log . Error ( "LoadDiscussComments failed: %v" , err )
2019-02-19 17:39:39 +03:00
return
}
}
// reload comments to delete the old comment
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( comment . Issue )
2019-01-17 17:23:22 +03:00
}
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyDeleteRepository ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository ) {
issue_indexer . DeleteRepoIssueIndexer ( ctx , repo )
2019-12-08 22:15:35 +03:00
if setting . Indexer . RepoIndexerEnabled {
2021-11-02 06:14:24 +03:00
code_indexer . UpdateRepoIndexer ( repo )
2019-12-08 22:15:35 +03:00
}
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyMigrateRepository ( ctx context . Context , doer , u * user_model . User , repo * repo_model . Repository ) {
issue_indexer . UpdateRepoIndexer ( ctx , repo )
2019-12-08 22:15:35 +03:00
if setting . Indexer . RepoIndexerEnabled && ! repo . IsEmpty {
code_indexer . UpdateRepoIndexer ( repo )
}
2020-02-11 12:34:17 +03:00
if err := stats_indexer . UpdateRepoIndexer ( repo ) ; err != nil {
log . Error ( "stats_indexer.UpdateRepoIndexer(%d) failed: %v" , repo . ID , err )
}
2019-12-08 22:15:35 +03:00
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyPushCommits ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2023-05-26 04:04:48 +03:00
if ! opts . RefFullName . IsBranch ( ) {
return
}
if setting . Indexer . RepoIndexerEnabled && opts . RefFullName . BranchName ( ) == repo . DefaultBranch {
2019-12-08 22:15:35 +03:00
code_indexer . UpdateRepoIndexer ( repo )
}
2020-02-11 12:34:17 +03:00
if err := stats_indexer . UpdateRepoIndexer ( repo ) ; err != nil {
log . Error ( "stats_indexer.UpdateRepoIndexer(%d) failed: %v" , repo . ID , err )
}
2019-01-17 17:23:22 +03:00
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifySyncPushCommits ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2023-05-26 04:04:48 +03:00
if ! opts . RefFullName . IsBranch ( ) {
return
}
if setting . Indexer . RepoIndexerEnabled && opts . RefFullName . BranchName ( ) == repo . DefaultBranch {
2020-05-08 17:58:40 +03:00
code_indexer . UpdateRepoIndexer ( repo )
}
if err := stats_indexer . UpdateRepoIndexer ( repo ) ; err != nil {
log . Error ( "stats_indexer.UpdateRepoIndexer(%d) failed: %v" , repo . ID , err )
}
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyIssueChangeContent ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldContent string ) {
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( issue )
2019-01-17 17:23:22 +03:00
}
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyIssueChangeTitle ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldTitle string ) {
2019-02-21 03:54:05 +03:00
issue_indexer . UpdateIssueIndexer ( issue )
2019-01-17 17:23:22 +03:00
}
2020-09-08 19:29:51 +03:00
2022-11-19 11:12:33 +03:00
func ( r * indexerNotifier ) NotifyIssueChangeRef ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldRef string ) {
2020-09-08 19:29:51 +03:00
issue_indexer . UpdateIssueIndexer ( issue )
}