|  | 
|  | 1 | +package shallow | 
|  | 2 | + | 
|  | 3 | +import ( | 
|  | 4 | +	"context" | 
|  | 5 | +	"database/sql" | 
|  | 6 | +	"fmt" | 
|  | 7 | + | 
|  | 8 | +	"github.com/src-d/ghsync/models" | 
|  | 9 | + | 
|  | 10 | +	"github.com/google/go-github/github" | 
|  | 11 | +	"gopkg.in/src-d/go-kallax.v1" | 
|  | 12 | +	"gopkg.in/src-d/go-log.v1" | 
|  | 13 | +) | 
|  | 14 | + | 
|  | 15 | +type PullRequestSyncer struct { | 
|  | 16 | +	db     *sql.DB | 
|  | 17 | +	store  *models.PullRequestStore | 
|  | 18 | +	client *github.Client | 
|  | 19 | +} | 
|  | 20 | + | 
|  | 21 | +func NewPullRequestSyncer(db *sql.DB, c *github.Client) *PullRequestSyncer { | 
|  | 22 | +	return &PullRequestSyncer{ | 
|  | 23 | +		db:     db, | 
|  | 24 | +		store:  models.NewPullRequestStore(db), | 
|  | 25 | +		client: c, | 
|  | 26 | +	} | 
|  | 27 | +} | 
|  | 28 | + | 
|  | 29 | +func (s *PullRequestSyncer) Sync(owner, repo string, logger log.Logger) error { | 
|  | 30 | +	opts := &github.PullRequestListOptions{} | 
|  | 31 | +	opts.ListOptions.PerPage = listOptionsPerPage | 
|  | 32 | +	opts.State = "all" | 
|  | 33 | + | 
|  | 34 | +	logger.Infof("starting to retrieve PRs") | 
|  | 35 | + | 
|  | 36 | +	// TODO transaction for faster times | 
|  | 37 | + | 
|  | 38 | +	// Get the list of all PRs | 
|  | 39 | +	for { | 
|  | 40 | +		prs, r, err := s.client.PullRequests.List(context.TODO(), owner, repo, opts) | 
|  | 41 | +		if err != nil { | 
|  | 42 | +			return err | 
|  | 43 | +		} | 
|  | 44 | + | 
|  | 45 | +		for _, pr := range prs { | 
|  | 46 | +			logger := logger.With(log.Fields{"pr": pr.GetNumber()}) | 
|  | 47 | + | 
|  | 48 | +			_, err := s.store.FindOne(models.NewPullRequestQuery(). | 
|  | 49 | +				Where(kallax.And( | 
|  | 50 | +					kallax.Eq(models.Schema.Issue.RepositoryOwner, owner), | 
|  | 51 | +					kallax.Eq(models.Schema.Issue.RepositoryName, repo), | 
|  | 52 | +					kallax.Eq(models.Schema.Issue.Number, pr.GetNumber()), | 
|  | 53 | +				)), | 
|  | 54 | +			) | 
|  | 55 | + | 
|  | 56 | +			if err != nil && err != kallax.ErrNotFound { | 
|  | 57 | +				logger.Errorf(err, "failed to read the resource from the DB") | 
|  | 58 | +				return fmt.Errorf("failed to read the resource from the DB: %v", err) | 
|  | 59 | +			} | 
|  | 60 | + | 
|  | 61 | +			if err == nil { | 
|  | 62 | +				logger.Infof("resource already exists, skipping") | 
|  | 63 | +				continue | 
|  | 64 | +			} | 
|  | 65 | + | 
|  | 66 | +			record := models.NewPullRequest() | 
|  | 67 | +			record.PullRequest = *pr | 
|  | 68 | + | 
|  | 69 | +			err = s.store.Insert(record) | 
|  | 70 | +			if err != nil { | 
|  | 71 | +				logger.Errorf(err, "failed to write the resource into the DB") | 
|  | 72 | +				return fmt.Errorf("failed to write the resource into the DB: %v", err) | 
|  | 73 | +			} | 
|  | 74 | + | 
|  | 75 | +			logger.Debugf("resource written in the DB") | 
|  | 76 | +		} | 
|  | 77 | + | 
|  | 78 | +		if r.NextPage == 0 { | 
|  | 79 | +			break | 
|  | 80 | +		} | 
|  | 81 | + | 
|  | 82 | +		opts.Page = r.NextPage | 
|  | 83 | +	} | 
|  | 84 | + | 
|  | 85 | +	logger.Infof("finished to retrieve PRs") | 
|  | 86 | + | 
|  | 87 | +	return nil | 
|  | 88 | +} | 
0 commit comments