2019-05-06 20:12:51 -05:00
// 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
2020-01-23 12:28:15 -05:00
import (
2022-01-17 13:31:58 -05:00
"context"
2021-09-19 06:49:59 -05:00
"code.gitea.io/gitea/models/db"
2020-01-23 12:28:15 -05:00
"code.gitea.io/gitea/modules/structs"
"xorm.io/builder"
)
2019-05-06 20:12:51 -05:00
2019-06-29 08:38:22 -05:00
// InsertMilestones creates milestones of repository.
func InsertMilestones ( ms ... * Milestone ) ( err error ) {
if len ( ms ) == 0 {
return nil
}
2021-11-21 10:41:00 -05:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2019-05-06 20:12:51 -05:00
return err
}
2021-11-21 10:41:00 -05:00
defer committer . Close ( )
sess := db . GetEngine ( ctx )
2019-05-06 20:12:51 -05:00
2019-06-29 08:38:22 -05:00
// to return the id, so we should not use batch insert
for _ , m := range ms {
if _ , err = sess . NoAutoTime ( ) . Insert ( m ) ; err != nil {
return err
}
}
2021-11-21 10:41:00 -05:00
if _ , err = db . Exec ( ctx , "UPDATE `repository` SET num_milestones = num_milestones + ? WHERE id = ?" , len ( ms ) , ms [ 0 ] . RepoID ) ; err != nil {
2019-05-06 20:12:51 -05:00
return err
}
2021-11-21 10:41:00 -05:00
return committer . Commit ( )
2019-05-06 20:12:51 -05:00
}
2019-06-29 08:38:22 -05:00
// InsertIssues insert issues to database
func InsertIssues ( issues ... * Issue ) error {
2021-11-21 10:41:00 -05:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2019-06-29 08:38:22 -05:00
return err
}
2021-11-21 10:41:00 -05:00
defer committer . Close ( )
2019-06-29 08:38:22 -05:00
for _ , issue := range issues {
2022-01-17 13:31:58 -05:00
if err := insertIssue ( ctx , issue ) ; err != nil {
2019-05-06 20:12:51 -05:00
return err
}
}
2022-01-17 13:31:58 -05:00
err = UpdateRepoStats ( ctx , issues [ 0 ] . RepoID )
if err != nil {
return err
}
2021-11-21 10:41:00 -05:00
return committer . Commit ( )
2019-06-29 08:38:22 -05:00
}
2022-01-17 13:31:58 -05:00
func insertIssue ( ctx context . Context , issue * Issue ) error {
sess := db . GetEngine ( ctx )
2019-05-06 20:12:51 -05:00
if _ , err := sess . NoAutoTime ( ) . Insert ( issue ) ; err != nil {
return err
}
2021-03-14 13:52:12 -05:00
issueLabels := make ( [ ] IssueLabel , 0 , len ( issue . Labels ) )
2019-06-29 08:38:22 -05:00
for _ , label := range issue . Labels {
2019-05-06 20:12:51 -05:00
issueLabels = append ( issueLabels , IssueLabel {
IssueID : issue . ID ,
2019-06-29 08:38:22 -05:00
LabelID : label . ID ,
2019-05-06 20:12:51 -05:00
} )
}
2020-04-17 12:42:57 -05:00
if len ( issueLabels ) > 0 {
if _ , err := sess . Insert ( issueLabels ) ; err != nil {
return err
}
2019-05-06 20:12:51 -05:00
}
2019-08-03 13:38:42 -05:00
2020-01-15 06:14:07 -05:00
for _ , reaction := range issue . Reactions {
reaction . IssueID = issue . ID
}
2020-04-17 12:42:57 -05:00
if len ( issue . Reactions ) > 0 {
if _ , err := sess . Insert ( issue . Reactions ) ; err != nil {
return err
}
2020-01-15 06:14:07 -05:00
}
2019-05-06 20:12:51 -05:00
return nil
}
2019-06-29 08:38:22 -05:00
// InsertIssueComments inserts many comments of issues.
func InsertIssueComments ( comments [ ] * Comment ) error {
if len ( comments ) == 0 {
return nil
}
2021-03-14 13:52:12 -05:00
issueIDs := make ( map [ int64 ] bool )
2019-06-29 08:38:22 -05:00
for _ , comment := range comments {
issueIDs [ comment . IssueID ] = true
}
2021-11-21 10:41:00 -05:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2019-05-06 20:12:51 -05:00
return err
}
2021-11-21 10:41:00 -05:00
defer committer . Close ( )
2020-01-15 06:14:07 -05:00
for _ , comment := range comments {
2021-11-21 10:41:00 -05:00
if _ , err := db . GetEngine ( ctx ) . NoAutoTime ( ) . Insert ( comment ) ; err != nil {
2020-01-15 06:14:07 -05:00
return err
}
for _ , reaction := range comment . Reactions {
reaction . IssueID = comment . IssueID
reaction . CommentID = comment . ID
}
2020-04-17 12:42:57 -05:00
if len ( comment . Reactions ) > 0 {
2021-11-21 10:41:00 -05:00
if err := db . Insert ( ctx , comment . Reactions ) ; err != nil {
2020-04-17 12:42:57 -05:00
return err
}
2020-01-15 06:14:07 -05:00
}
2019-05-06 20:12:51 -05:00
}
2020-01-15 06:14:07 -05:00
2019-06-29 08:38:22 -05:00
for issueID := range issueIDs {
2022-01-03 10:35:01 -05:00
if _ , err := db . Exec ( ctx , "UPDATE issue set num_comments = (SELECT count(*) FROM comment WHERE issue_id = ? AND `type`=?) WHERE id = ?" , issueID , CommentTypeComment , issueID ) ; err != nil {
2019-06-29 08:38:22 -05:00
return err
}
2019-05-06 20:12:51 -05:00
}
2021-11-21 10:41:00 -05:00
return committer . Commit ( )
2019-05-06 20:12:51 -05:00
}
2019-06-29 08:38:22 -05:00
// InsertPullRequests inserted pull requests
func InsertPullRequests ( prs ... * PullRequest ) error {
2021-11-21 10:41:00 -05:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2019-05-06 20:12:51 -05:00
return err
}
2021-11-21 10:41:00 -05:00
defer committer . Close ( )
sess := db . GetEngine ( ctx )
2019-06-29 08:38:22 -05:00
for _ , pr := range prs {
2022-01-17 13:31:58 -05:00
if err := insertIssue ( ctx , pr . Issue ) ; err != nil {
2019-06-29 08:38:22 -05:00
return err
}
pr . IssueID = pr . Issue . ID
if _ , err := sess . NoAutoTime ( ) . Insert ( pr ) ; err != nil {
return err
}
2019-05-06 20:12:51 -05:00
}
2019-06-29 08:38:22 -05:00
2022-01-17 13:31:58 -05:00
err = UpdateRepoStats ( ctx , prs [ 0 ] . Issue . RepoID )
if err != nil {
return err
}
2021-11-21 10:41:00 -05:00
return committer . Commit ( )
2019-05-06 20:12:51 -05:00
}
2019-06-29 08:38:22 -05:00
// InsertReleases migrates release
func InsertReleases ( rels ... * Release ) error {
2021-11-21 10:41:00 -05:00
ctx , committer , err := db . TxContext ( )
if err != nil {
2019-05-06 20:12:51 -05:00
return err
}
2021-11-21 10:41:00 -05:00
defer committer . Close ( )
sess := db . GetEngine ( ctx )
2019-05-06 20:12:51 -05:00
2019-06-29 08:38:22 -05:00
for _ , rel := range rels {
2019-05-06 20:12:51 -05:00
if _ , err := sess . NoAutoTime ( ) . Insert ( rel ) ; err != nil {
return err
}
2020-04-17 12:42:57 -05:00
if len ( rel . Attachments ) > 0 {
for i := range rel . Attachments {
rel . Attachments [ i ] . ReleaseID = rel . ID
}
2019-05-06 20:12:51 -05:00
2020-04-17 12:42:57 -05:00
if _ , err := sess . NoAutoTime ( ) . Insert ( rel . Attachments ) ; err != nil {
return err
}
2019-06-29 08:38:22 -05:00
}
2019-05-06 20:12:51 -05:00
}
2021-11-21 10:41:00 -05:00
return committer . Commit ( )
2019-05-06 20:12:51 -05:00
}
2020-01-23 12:28:15 -05:00
2020-02-17 19:42:13 -05:00
func migratedIssueCond ( tp structs . GitServiceType ) builder . Cond {
return builder . In ( "issue_id" ,
builder . Select ( "issue.id" ) .
From ( "issue" ) .
InnerJoin ( "repository" , "issue.repo_id = repository.id" ) .
Where ( builder . Eq {
"repository.original_service_type" : tp ,
} ) ,
)
}
2020-01-23 12:28:15 -05:00
// UpdateReviewsMigrationsByType updates reviews' migrations information via given git service type and original id and poster id
func UpdateReviewsMigrationsByType ( tp structs . GitServiceType , originalAuthorID string , posterID int64 ) error {
2021-09-23 10:45:36 -05:00
_ , err := db . GetEngine ( db . DefaultContext ) . Table ( "review" ) .
2020-02-17 19:42:13 -05:00
Where ( "original_author_id = ?" , originalAuthorID ) .
And ( migratedIssueCond ( tp ) ) .
2020-01-23 12:28:15 -05:00
Update ( map [ string ] interface { } {
2020-02-17 19:42:13 -05:00
"reviewer_id" : posterID ,
2020-01-23 12:28:15 -05:00
"original_author" : "" ,
"original_author_id" : 0 ,
} )
return err
}
2021-11-28 09:11:58 -05:00
// UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
func UpdateMigrationsByType ( tp structs . GitServiceType , externalUserID string , userID int64 ) error {
if err := UpdateIssuesMigrationsByType ( tp , externalUserID , userID ) ; err != nil {
return err
}
if err := UpdateCommentsMigrationsByType ( tp , externalUserID , userID ) ; err != nil {
return err
}
if err := UpdateReleasesMigrationsByType ( tp , externalUserID , userID ) ; err != nil {
return err
}
if err := UpdateReactionsMigrationsByType ( tp , externalUserID , userID ) ; err != nil {
return err
}
return UpdateReviewsMigrationsByType ( tp , externalUserID , userID )
}