]> source.dussan.org Git - gitea.git/commitdiff
Migrate reactions when migrating repository from github (#9599)
authorLunny Xiao <xiaolunwen@gmail.com>
Wed, 15 Jan 2020 11:14:07 +0000 (19:14 +0800)
committerAntoine GIRARD <sapk@users.noreply.github.com>
Wed, 15 Jan 2020 11:14:07 +0000 (12:14 +0100)
* Migrate reactions when migrating repository from github

* fix missed sleep

* fix tests

* update reactions when external user binding

* Fix test

* fix tests

* change the copy head

* fix test

* fix migrator add/delete reaction

18 files changed:
models/external_login_user.go
models/issue.go
models/issue_comment.go
models/issue_reaction.go
models/issue_reaction_test.go
models/migrate.go
models/migrations/migrations.go
models/migrations/v123.go [new file with mode: 0644]
models/user.go
modules/migrations/base/comment.go
modules/migrations/base/issue.go
modules/migrations/base/pullrequest.go
modules/migrations/base/reaction.go
modules/migrations/gitea.go
modules/migrations/github.go
modules/migrations/github_test.go
routers/api/v1/repo/issue_reaction.go
routers/repo/issue.go

index 265d855ccf0e69a3569309486ee343b856bc4441..6585e49fef5db2a41678bca693a3b177dd0d8628 100644 (file)
@@ -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)
 }
index b6408365f711191df9ba4f10af8e3cc91473bb96..1c6b930d2e40e816b823db4c67cfc0a5cb9ac8cf 100644 (file)
@@ -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
+}
index 699b8f048716134354a9c90bf90636846c1899ba..a2e19877469d7ae28e60093413e974b43bd62983 100644 (file)
@@ -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) {
index d421ab44e92d4fdf187b1583428a4e5fff15dc8c..5c3bf9d06e876d3be7db39ae437b3e9befd889dd 100644 (file)
@@ -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
index 723a6be5368484a80bf078a4fdb6d4cd738646d2..e7aa45e4c38100a6773d284a7d351cf7b6ea995d 100644 (file)
@@ -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)
 
index 53838fd65e7423cb7838fda732858371deafec73..fd28fd156fb79af66049f997c1d0d517d1469773 100644 (file)
@@ -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
index edea36cf7934076d0c4bacd10f8bc7c4141285ce..e86ca8e4fe100484adc62509678a9eaa5598f948 100644 (file)
@@ -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 (file)
index 0000000..e1b7723
--- /dev/null
@@ -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))
+}
index ea1d1108075656d81ddc188c9d542a512ca8424b..d7129fb09a64c340a7a9f9b024d359ae0d3f6338 100644 (file)
@@ -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 {
index 94cbabaae62f371b464a89db4ae208af706287e0..4a653e474b0f55d858f93004ff218fbf37455fe3 100644 (file)
@@ -16,5 +16,5 @@ type Comment struct {
        Created     time.Time
        Updated     time.Time
        Content     string
-       Reactions   *Reactions
+       Reactions   []*Reaction
 }
index b87a7fec622ec6202cba447303092ca0fcc30bf9..4e2bf25f1772cc88999e733fabdab4b615d325a8 100644 (file)
@@ -22,5 +22,5 @@ type Issue struct {
        Updated     time.Time
        Closed      *time.Time
        Labels      []*Label
-       Reactions   *Reactions
+       Reactions   []*Reaction
 }
index b1602b82186224411ec858d1827da7339aa27f0a..3a1e0f25bd3eaa6f697d396d657889e03b0c7538 100644 (file)
@@ -33,6 +33,7 @@ type PullRequest struct {
        Assignee       string
        Assignees      []string
        IsLocked       bool
+       Reactions      []*Reaction
 }
 
 // IsForkPullRequest returns true if the pull request from a forked repository but not the same repository
index fd7a9543d34b69b7ed20f05c8f45884dcf82a8c0..b79223d4cd8e76a23effb0b263507c04132d0c0d 100644 (file)
@@ -1,17 +1,12 @@
-// Copyright 2019 The Gitea Authors. All rights reserved.
-// Copyright 2018 Jonas Franz. All rights reserved.
+// 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 base
 
-// Reactions represents a summary of reactions.
-type Reactions struct {
-       TotalCount int
-       PlusOne    int
-       MinusOne   int
-       Laugh      int
-       Confused   int
-       Heart      int
-       Hooray     int
+// Reaction represents a reaction to an issue/pr/comment.
+type Reaction struct {
+       UserID   int64
+       UserName string
+       Content  string
 }
index 0cffd60e84e6cd98906414ece2285a76590aabdd..82664d0d1a30fe9c81684f5ee02e3062c18aa3a6 100644 (file)
@@ -361,7 +361,32 @@ func (g *GiteaLocalUploader) CreateIssues(issues ...*base.Issue) error {
                if issue.Closed != nil {
                        is.ClosedUnix = timeutil.TimeStamp(issue.Closed.Unix())
                }
-               // TODO: add reactions
+               // add reactions
+               for _, reaction := range issue.Reactions {
+                       userid, ok := g.userMap[reaction.UserID]
+                       if !ok && tp != "" {
+                               var err error
+                               userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
+                               if err != nil {
+                                       log.Error("GetUserIDByExternalUserID: %v", err)
+                               }
+                               if userid > 0 {
+                                       g.userMap[reaction.UserID] = userid
+                               }
+                       }
+                       var res = models.Reaction{
+                               Type:        reaction.Content,
+                               CreatedUnix: timeutil.TimeStampNow(),
+                       }
+                       if userid > 0 {
+                               res.UserID = userid
+                       } else {
+                               res.UserID = g.doer.ID
+                               res.OriginalAuthorID = reaction.UserID
+                               res.OriginalAuthor = reaction.UserName
+                       }
+                       is.Reactions = append(is.Reactions, &res)
+               }
                iss = append(iss, &is)
        }
 
@@ -420,9 +445,34 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
                        cm.OriginalAuthorID = comment.PosterID
                }
 
-               cms = append(cms, &cm)
+               // add reactions
+               for _, reaction := range comment.Reactions {
+                       userid, ok := g.userMap[reaction.UserID]
+                       if !ok && tp != "" {
+                               var err error
+                               userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
+                               if err != nil {
+                                       log.Error("GetUserIDByExternalUserID: %v", err)
+                               }
+                               if userid > 0 {
+                                       g.userMap[reaction.UserID] = userid
+                               }
+                       }
+                       var res = models.Reaction{
+                               Type:        reaction.Content,
+                               CreatedUnix: timeutil.TimeStampNow(),
+                       }
+                       if userid > 0 {
+                               res.UserID = userid
+                       } else {
+                               res.UserID = g.doer.ID
+                               res.OriginalAuthorID = reaction.UserID
+                               res.OriginalAuthor = reaction.UserName
+                       }
+                       cm.Reactions = append(cm.Reactions, &res)
+               }
 
-               // TODO: Reactions
+               cms = append(cms, &cm)
        }
 
        return models.InsertIssueComments(cms)
@@ -581,10 +631,12 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
                UpdatedUnix: timeutil.TimeStamp(pr.Updated.Unix()),
        }
 
+       tp := g.gitServiceType.Name()
+
        userid, ok := g.userMap[pr.PosterID]
-       if !ok {
+       if !ok && tp != "" {
                var err error
-               userid, err = models.GetUserIDByExternalUserID("github", fmt.Sprintf("%v", pr.PosterID))
+               userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", pr.PosterID))
                if err != nil {
                        log.Error("GetUserIDByExternalUserID: %v", err)
                }
@@ -601,6 +653,33 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
                issue.OriginalAuthorID = pr.PosterID
        }
 
+       // add reactions
+       for _, reaction := range pr.Reactions {
+               userid, ok := g.userMap[reaction.UserID]
+               if !ok && tp != "" {
+                       var err error
+                       userid, err = models.GetUserIDByExternalUserID(tp, fmt.Sprintf("%v", reaction.UserID))
+                       if err != nil {
+                               log.Error("GetUserIDByExternalUserID: %v", err)
+                       }
+                       if userid > 0 {
+                               g.userMap[reaction.UserID] = userid
+                       }
+               }
+               var res = models.Reaction{
+                       Type:        reaction.Content,
+                       CreatedUnix: timeutil.TimeStampNow(),
+               }
+               if userid > 0 {
+                       res.UserID = userid
+               } else {
+                       res.UserID = g.doer.ID
+                       res.OriginalAuthorID = reaction.UserID
+                       res.OriginalAuthor = reaction.UserName
+               }
+               issue.Reactions = append(issue.Reactions, &res)
+       }
+
        var pullRequest = models.PullRequest{
                HeadRepoID: g.repo.ID,
                HeadBranch: head,
@@ -622,7 +701,6 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*models.PullR
                pullRequest.MergerID = g.doer.ID
        }
 
-       // TODO: reactions
        // TODO: assignees
 
        return &pullRequest, nil
index 9183c9318fb7e0e5eb8f1c2553830903ce544b7e..17e49d90d19052fc4e2b6a7baa6379f802e5eb14 100644 (file)
@@ -319,18 +319,6 @@ func (g *GithubDownloaderV3) GetReleases() ([]*base.Release, error) {
        return releases, nil
 }
 
-func convertGithubReactions(reactions *github.Reactions) *base.Reactions {
-       return &base.Reactions{
-               TotalCount: *reactions.TotalCount,
-               PlusOne:    *reactions.PlusOne,
-               MinusOne:   *reactions.MinusOne,
-               Laugh:      *reactions.Laugh,
-               Confused:   *reactions.Confused,
-               Heart:      *reactions.Heart,
-               Hooray:     *reactions.Hooray,
-       }
-}
-
 // GetIssues returns issues according start and limit
 func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, error) {
        opt := &github.IssueListByRepoOptions{
@@ -366,15 +354,36 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool,
                for _, l := range issue.Labels {
                        labels = append(labels, convertGithubLabel(&l))
                }
-               var reactions *base.Reactions
-               if issue.Reactions != nil {
-                       reactions = convertGithubReactions(issue.Reactions)
-               }
 
                var email string
                if issue.User.Email != nil {
                        email = *issue.User.Email
                }
+
+               // get reactions
+               var reactions []*base.Reaction
+               for i := 1; ; i++ {
+                       g.sleep()
+                       res, resp, err := g.client.Reactions.ListIssueReactions(g.ctx, g.repoOwner, g.repoName, issue.GetNumber(), &github.ListOptions{
+                               Page:    i,
+                               PerPage: perPage,
+                       })
+                       if err != nil {
+                               return nil, false, err
+                       }
+                       g.rate = &resp.Rate
+                       if len(res) == 0 {
+                               break
+                       }
+                       for _, reaction := range res {
+                               reactions = append(reactions, &base.Reaction{
+                                       UserID:   reaction.User.GetID(),
+                                       UserName: reaction.User.GetLogin(),
+                                       Content:  reaction.GetContent(),
+                               })
+                       }
+               }
+
                allIssues = append(allIssues, &base.Issue{
                        Title:       *issue.Title,
                        Number:      int64(*issue.Number),
@@ -418,9 +427,29 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er
                        if comment.User.Email != nil {
                                email = *comment.User.Email
                        }
-                       var reactions *base.Reactions
-                       if comment.Reactions != nil {
-                               reactions = convertGithubReactions(comment.Reactions)
+
+                       // get reactions
+                       var reactions []*base.Reaction
+                       for i := 1; ; i++ {
+                               g.sleep()
+                               res, resp, err := g.client.Reactions.ListIssueCommentReactions(g.ctx, g.repoOwner, g.repoName, comment.GetID(), &github.ListOptions{
+                                       Page:    i,
+                                       PerPage: 100,
+                               })
+                               if err != nil {
+                                       return nil, err
+                               }
+                               g.rate = &resp.Rate
+                               if len(res) == 0 {
+                                       break
+                               }
+                               for _, reaction := range res {
+                                       reactions = append(reactions, &base.Reaction{
+                                               UserID:   reaction.User.GetID(),
+                                               UserName: reaction.User.GetLogin(),
+                                               Content:  reaction.GetContent(),
+                                       })
+                               }
                        }
                        allComments = append(allComments, &base.Comment{
                                IssueIndex:  issueNumber,
@@ -473,8 +502,6 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
                        labels = append(labels, convertGithubLabel(l))
                }
 
-               // FIXME: This API missing reactions, we may need another extra request to get reactions
-
                var email string
                if pr.User.Email != nil {
                        email = *pr.User.Email
@@ -515,6 +542,30 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
                        headUserName = *pr.Head.User.Login
                }
 
+               // get reactions
+               var reactions []*base.Reaction
+               for i := 1; ; i++ {
+                       g.sleep()
+                       res, resp, err := g.client.Reactions.ListIssueReactions(g.ctx, g.repoOwner, g.repoName, pr.GetNumber(), &github.ListOptions{
+                               Page:    i,
+                               PerPage: perPage,
+                       })
+                       if err != nil {
+                               return nil, err
+                       }
+                       g.rate = &resp.Rate
+                       if len(res) == 0 {
+                               break
+                       }
+                       for _, reaction := range res {
+                               reactions = append(reactions, &base.Reaction{
+                                       UserID:   reaction.User.GetID(),
+                                       UserName: reaction.User.GetLogin(),
+                                       Content:  reaction.GetContent(),
+                               })
+                       }
+               }
+
                allPRs = append(allPRs, &base.PullRequest{
                        Title:          *pr.Title,
                        Number:         int64(*pr.Number),
@@ -545,7 +596,8 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq
                                RepoName:  *pr.Base.Repo.Name,
                                OwnerName: *pr.Base.User.Login,
                        },
-                       PatchURL: *pr.PatchURL,
+                       PatchURL:  *pr.PatchURL,
+                       Reactions: reactions,
                })
        }
 
index bf71ab4756ab041d8e585db71bace8097166ca59..10943e4019a494727fd7597c6f8a46fcc22e8784 100644 (file)
@@ -170,14 +170,12 @@ func TestGitHubDownloadRepo(t *testing.T) {
                                        Description: "Good for newcomers",
                                },
                        },
-                       Reactions: &base.Reactions{
-                               TotalCount: 1,
-                               PlusOne:    1,
-                               MinusOne:   0,
-                               Laugh:      0,
-                               Confused:   0,
-                               Heart:      0,
-                               Hooray:     0,
+                       Reactions: []*base.Reaction{
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "+1",
+                               },
                        },
                        Closed: &closed1,
                },
@@ -198,14 +196,37 @@ func TestGitHubDownloadRepo(t *testing.T) {
                                        Description: "This issue or pull request already exists",
                                },
                        },
-                       Reactions: &base.Reactions{
-                               TotalCount: 6,
-                               PlusOne:    1,
-                               MinusOne:   1,
-                               Laugh:      1,
-                               Confused:   1,
-                               Heart:      1,
-                               Hooray:     1,
+                       Reactions: []*base.Reaction{
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "heart",
+                               },
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "laugh",
+                               },
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "-1",
+                               },
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "confused",
+                               },
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "hooray",
+                               },
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "+1",
+                               },
                        },
                        Closed: &closed2,
                },
@@ -223,14 +244,12 @@ func TestGitHubDownloadRepo(t *testing.T) {
                        Created:    time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
                        Updated:    time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
                        Content:    "This is a comment",
-                       Reactions: &base.Reactions{
-                               TotalCount: 1,
-                               PlusOne:    1,
-                               MinusOne:   0,
-                               Laugh:      0,
-                               Confused:   0,
-                               Heart:      0,
-                               Hooray:     0,
+                       Reactions: []*base.Reaction{
+                               {
+                                       UserID:   1669571,
+                                       UserName: "mrsdizzie",
+                                       Content:  "+1",
+                               },
                        },
                },
                {
@@ -240,15 +259,7 @@ func TestGitHubDownloadRepo(t *testing.T) {
                        Created:    time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
                        Updated:    time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
                        Content:    "A second comment",
-                       Reactions: &base.Reactions{
-                               TotalCount: 0,
-                               PlusOne:    0,
-                               MinusOne:   0,
-                               Laugh:      0,
-                               Confused:   0,
-                               Heart:      0,
-                               Hooray:     0,
-                       },
+                       Reactions:  nil,
                },
        }, comments[:2])
 
@@ -331,6 +342,18 @@ func TestGitHubDownloadRepo(t *testing.T) {
                        },
                        Merged:         false,
                        MergeCommitSHA: "565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae",
+                       Reactions: []*base.Reaction{
+                               {
+                                       UserID:   81045,
+                                       UserName: "lunny",
+                                       Content:  "heart",
+                               },
+                               {
+                                       UserID:   81045,
+                                       UserName: "lunny",
+                                       Content:  "+1",
+                               },
+                       },
                },
        }, prs)
 }
index b943ea6980abf5e69d6c63abd2f14a6e4a1a2192..40632dcab70ad181848482a107bd935c4365165a 100644 (file)
@@ -65,7 +65,7 @@ func GetIssueCommentReactions(ctx *context.APIContext) {
                ctx.Error(http.StatusInternalServerError, "FindIssueReactions", err)
                return
        }
-       _, err = reactions.LoadUsers()
+       _, err = reactions.LoadUsers(ctx.Repo.Repository)
        if err != nil {
                ctx.Error(http.StatusInternalServerError, "ReactionList.LoadUsers()", err)
                return
@@ -271,7 +271,7 @@ func GetIssueReactions(ctx *context.APIContext) {
                ctx.Error(http.StatusInternalServerError, "FindIssueReactions", err)
                return
        }
-       _, err = reactions.LoadUsers()
+       _, err = reactions.LoadUsers(ctx.Repo.Repository)
        if err != nil {
                ctx.Error(http.StatusInternalServerError, "ReactionList.LoadUsers()", err)
                return
index afc115c6e2cc90915255488809304bed81bb6d73..2fb42b0f22ccd49c5d71411ee77c1ea07042439b 100644 (file)
@@ -1608,7 +1608,7 @@ func ChangeCommentReaction(ctx *context.Context, form auth.ReactionForm) {
                }
                // Reload new reactions
                comment.Reactions = nil
-               if err = comment.LoadReactions(); err != nil {
+               if err = comment.LoadReactions(ctx.Repo.Repository); err != nil {
                        log.Info("comment.LoadReactions: %s", err)
                        break
                }
@@ -1622,7 +1622,7 @@ func ChangeCommentReaction(ctx *context.Context, form auth.ReactionForm) {
 
                // Reload new reactions
                comment.Reactions = nil
-               if err = comment.LoadReactions(); err != nil {
+               if err = comment.LoadReactions(ctx.Repo.Repository); err != nil {
                        log.Info("comment.LoadReactions: %s", err)
                        break
                }