diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/external_login_user.go | 6 | ||||
-rw-r--r-- | models/issue.go | 19 | ||||
-rw-r--r-- | models/issue_comment.go | 8 | ||||
-rw-r--r-- | models/issue_reaction.go | 38 | ||||
-rw-r--r-- | models/issue_reaction_test.go | 3 | ||||
-rw-r--r-- | models/migrate.go | 22 | ||||
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v123.go | 18 | ||||
-rw-r--r-- | models/user.go | 9 |
9 files changed, 102 insertions, 23 deletions
diff --git a/models/external_login_user.go b/models/external_login_user.go index 265d855ccf..6585e49fef 100644 --- a/models/external_login_user.go +++ b/models/external_login_user.go @@ -177,5 +177,9 @@ func UpdateMigrationsByType(tp structs.GitServiceType, externalUserID string, us return err } - return UpdateReleasesMigrationsByType(tp, externalUserID, userID) + if err := UpdateReleasesMigrationsByType(tp, externalUserID, userID); err != nil { + return err + } + + return UpdateReactionsMigrationsByType(tp, externalUserID, userID) } diff --git a/models/issue.go b/models/issue.go index b6408365f7..1c6b930d2e 100644 --- a/models/issue.go +++ b/models/issue.go @@ -218,8 +218,11 @@ func (issue *Issue) loadReactions(e Engine) (err error) { if err != nil { return err } + if err = issue.loadRepo(e); err != nil { + return err + } // Load reaction user data - if _, err := ReactionList(reactions).loadUsers(e); err != nil { + if _, err := ReactionList(reactions).loadUsers(e, issue.Repo); err != nil { return err } @@ -1836,3 +1839,17 @@ func UpdateIssuesMigrationsByType(gitServiceType structs.GitServiceType, origina }) return err } + +// UpdateReactionsMigrationsByType updates all migrated repositories' reactions from gitServiceType to replace originalAuthorID to posterID +func UpdateReactionsMigrationsByType(gitServiceType structs.GitServiceType, originalAuthorID string, userID int64) error { + _, err := x.Table("reaction"). + Join("INNER", "issue", "issue.id = reaction.issue_id"). + Where("issue.repo_id IN (SELECT id FROM repository WHERE original_service_type = ?)", gitServiceType). + And("reaction.original_author_id = ?", originalAuthorID). + Update(map[string]interface{}{ + "user_id": userID, + "original_author": "", + "original_author_id": 0, + }) + return err +} diff --git a/models/issue_comment.go b/models/issue_comment.go index 699b8f0487..a2e1987746 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -425,7 +425,7 @@ func (c *Comment) LoadDepIssueDetails() (err error) { return err } -func (c *Comment) loadReactions(e Engine) (err error) { +func (c *Comment) loadReactions(e Engine, repo *Repository) (err error) { if c.Reactions != nil { return nil } @@ -437,15 +437,15 @@ func (c *Comment) loadReactions(e Engine) (err error) { return err } // Load reaction user data - if _, err := c.Reactions.LoadUsers(); err != nil { + if _, err := c.Reactions.loadUsers(e, repo); err != nil { return err } return nil } // LoadReactions loads comment reactions -func (c *Comment) LoadReactions() error { - return c.loadReactions(x) +func (c *Comment) LoadReactions(repo *Repository) error { + return c.loadReactions(x, repo) } func (c *Comment) loadReview(e Engine) (err error) { diff --git a/models/issue_reaction.go b/models/issue_reaction.go index d421ab44e9..5c3bf9d06e 100644 --- a/models/issue_reaction.go +++ b/models/issue_reaction.go @@ -17,13 +17,15 @@ import ( // Reaction represents a reactions on issues and comments. type Reaction struct { - ID int64 `xorm:"pk autoincr"` - Type string `xorm:"INDEX UNIQUE(s) NOT NULL"` - IssueID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` - CommentID int64 `xorm:"INDEX UNIQUE(s)"` - UserID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` - User *User `xorm:"-"` - CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + ID int64 `xorm:"pk autoincr"` + Type string `xorm:"INDEX UNIQUE(s) NOT NULL"` + IssueID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` + CommentID int64 `xorm:"INDEX UNIQUE(s)"` + UserID int64 `xorm:"INDEX UNIQUE(s) NOT NULL"` + OriginalAuthorID int64 `xorm:"INDEX UNIQUE(s) NOT NULL DEFAULT(0)"` + OriginalAuthor string + User *User `xorm:"-"` + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` } // FindReactionsOptions describes the conditions to Find reactions @@ -49,7 +51,10 @@ func (opts *FindReactionsOptions) toConds() builder.Cond { cond = cond.And(builder.Eq{"reaction.comment_id": 0}) } if opts.UserID > 0 { - cond = cond.And(builder.Eq{"reaction.user_id": opts.UserID}) + cond = cond.And(builder.Eq{ + "reaction.user_id": opts.UserID, + "reaction.original_author_id": 0, + }) } if opts.Reaction != "" { cond = cond.And(builder.Eq{"reaction.type": opts.Reaction}) @@ -173,7 +178,7 @@ func deleteReaction(e *xorm.Session, opts *ReactionOptions) error { if opts.Comment != nil { reaction.CommentID = opts.Comment.ID } - _, err := e.Delete(reaction) + _, err := e.Where("original_author_id = 0").Delete(reaction) return err } @@ -233,7 +238,7 @@ func (list ReactionList) HasUser(userID int64) bool { return false } for _, reaction := range list { - if reaction.UserID == userID { + if reaction.OriginalAuthor == "" && reaction.UserID == userID { return true } } @@ -252,6 +257,9 @@ func (list ReactionList) GroupByType() map[string]ReactionList { func (list ReactionList) getUserIDs() []int64 { userIDs := make(map[int64]struct{}, len(list)) for _, reaction := range list { + if reaction.OriginalAuthor != "" { + continue + } if _, ok := userIDs[reaction.UserID]; !ok { userIDs[reaction.UserID] = struct{}{} } @@ -259,7 +267,7 @@ func (list ReactionList) getUserIDs() []int64 { return keysInt64(userIDs) } -func (list ReactionList) loadUsers(e Engine) ([]*User, error) { +func (list ReactionList) loadUsers(e Engine, repo *Repository) ([]*User, error) { if len(list) == 0 { return nil, nil } @@ -274,7 +282,9 @@ func (list ReactionList) loadUsers(e Engine) ([]*User, error) { } for _, reaction := range list { - if user, ok := userMaps[reaction.UserID]; ok { + if reaction.OriginalAuthor != "" { + reaction.User = NewReplaceUser(fmt.Sprintf("%s(%s)", reaction.OriginalAuthor, repo.OriginalServiceType.Name())) + } else if user, ok := userMaps[reaction.UserID]; ok { reaction.User = user } else { reaction.User = NewGhostUser() @@ -284,8 +294,8 @@ func (list ReactionList) loadUsers(e Engine) ([]*User, error) { } // LoadUsers loads reactions' all users -func (list ReactionList) LoadUsers() ([]*User, error) { - return list.loadUsers(x) +func (list ReactionList) LoadUsers(repo *Repository) ([]*User, error) { + return list.loadUsers(x, repo) } // GetFirstUsers returns first reacted user display names separated by comma diff --git a/models/issue_reaction_test.go b/models/issue_reaction_test.go index 723a6be536..e7aa45e4c3 100644 --- a/models/issue_reaction_test.go +++ b/models/issue_reaction_test.go @@ -132,6 +132,7 @@ func TestIssueCommentDeleteReaction(t *testing.T) { user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) issue1 := AssertExistsAndLoadBean(t, &Issue{ID: 1}).(*Issue) + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: issue1.RepoID}).(*Repository) comment1 := AssertExistsAndLoadBean(t, &Comment{ID: 1}).(*Comment) @@ -140,7 +141,7 @@ func TestIssueCommentDeleteReaction(t *testing.T) { addReaction(t, user3, issue1, comment1, "heart") addReaction(t, user4, issue1, comment1, "+1") - err := comment1.LoadReactions() + err := comment1.LoadReactions(repo1) assert.NoError(t, err) assert.Len(t, comment1.Reactions, 4) diff --git a/models/migrate.go b/models/migrate.go index 53838fd65e..fd28fd156f 100644 --- a/models/migrate.go +++ b/models/migrate.go @@ -63,6 +63,13 @@ func insertIssue(sess *xorm.Session, issue *Issue) error { return err } + for _, reaction := range issue.Reactions { + reaction.IssueID = issue.ID + } + if _, err := sess.Insert(issue.Reactions); err != nil { + return err + } + cols := make([]string, 0) if !issue.IsPull { sess.ID(issue.RepoID).Incr("num_issues") @@ -130,9 +137,20 @@ func InsertIssueComments(comments []*Comment) error { if err := sess.Begin(); err != nil { return err } - if _, err := sess.NoAutoTime().Insert(comments); err != nil { - return err + for _, comment := range comments { + if _, err := sess.NoAutoTime().Insert(comment); err != nil { + return err + } + + for _, reaction := range comment.Reactions { + reaction.IssueID = comment.IssueID + reaction.CommentID = comment.ID + } + if _, err := sess.Insert(comment.Reactions); err != nil { + return err + } } + for issueID := range issueIDs { if _, err := sess.Exec("UPDATE issue set num_comments = (SELECT count(*) FROM comment WHERE issue_id = ?) WHERE id = ?", issueID, issueID); err != nil { return err diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index edea36cf79..e86ca8e4fe 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -300,6 +300,8 @@ var migrations = []Migration{ NewMigration("add is_restricted column for users table", addIsRestricted), // v122 -> v123 NewMigration("Add Require Signed Commits to ProtectedBranch", addRequireSignedCommits), + // v123 -> v124 + NewMigration("Add original informations for reactions", addReactionOriginals), } // Migrate database to current version diff --git a/models/migrations/v123.go b/models/migrations/v123.go new file mode 100644 index 0000000000..e1b772381e --- /dev/null +++ b/models/migrations/v123.go @@ -0,0 +1,18 @@ +// Copyright 2020 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 migrations + +import ( + "xorm.io/xorm" +) + +func addReactionOriginals(x *xorm.Engine) error { + type Reaction struct { + OriginalAuthorID int64 `xorm:"INDEX NOT NULL DEFAULT(0)"` + OriginalAuthor string + } + + return x.Sync2(new(Reaction)) +} diff --git a/models/user.go b/models/user.go index ea1d110807..d7129fb09a 100644 --- a/models/user.go +++ b/models/user.go @@ -793,6 +793,15 @@ func NewGhostUser() *User { } } +// NewReplaceUser creates and returns a fake user for external user +func NewReplaceUser(name string) *User { + return &User{ + ID: -1, + Name: name, + LowerName: strings.ToLower(name), + } +} + // IsGhost check if user is fake user for a deleted account func (u *User) IsGhost() bool { if u == nil { |