You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.6 KiB
134 lines
3.6 KiB
// staletea |
|
// Copyright (C) 2019 Jonas Franz |
|
// |
|
// This program is free software: you can redistribute it and/or modify |
|
// it under the terms of the GNU General Public License as published by |
|
// the Free Software Foundation, either version 3 of the License, or |
|
// (at your option) any later version. |
|
// |
|
// This program is distributed in the hope that it will be useful, |
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
// GNU General Public License for more details. |
|
|
|
// You should have received a copy of the GNU General Public License |
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
package models |
|
|
|
import ( |
|
"code.gitea.io/gitea/modules/structs" |
|
"github.com/go-xorm/xorm" |
|
"time" |
|
) |
|
|
|
// Repository represents a Gitea repository indexed at the local database |
|
type Repository struct { |
|
ID int64 `xorm:"pk"` |
|
UserID int64 `xorm:"index"` |
|
Owner string `xorm:"unique(owner_name)"` |
|
Name string `xorm:"unique(owner_name)"` |
|
|
|
Activated bool `xorm:"-"` |
|
} |
|
|
|
// FindRepositoriesByUserID returns all repos of an user |
|
func FindRepositoriesByUserID(userID int64) ([]*Repository, error) { |
|
return findRepositoriesByUserID(x, userID) |
|
} |
|
|
|
func findRepositoriesByUserID(e *xorm.Engine, userID int64) ([]*Repository, error) { |
|
repos := make([]*Repository, 0) |
|
if err := e.Where("user_id = ?", userID).Find(&repos); err != nil { |
|
return nil, err |
|
} |
|
for _, repo := range repos { |
|
repo.Activated = true |
|
} |
|
return repos, nil |
|
} |
|
|
|
// SetActivatedRepositories sets the given repositories as active for the owner. It will sync all issues in addition. |
|
func SetActivatedRepositories(repos []*Repository, owner *User) error { |
|
return setActivatedRepositories(x, repos, owner) |
|
} |
|
|
|
func setActivatedRepositories(e *xorm.Engine, repos []*Repository, owner *User) error { |
|
if err := deleteAllReposByUserID(e, owner.ID); err != nil { |
|
return err |
|
} |
|
if err := insertRepos(e, repos); err != nil { |
|
return err |
|
} |
|
for _, repo := range repos { |
|
go repo.SyncIssues(owner) |
|
} |
|
return nil |
|
} |
|
|
|
// DeleteAllReposByUserID deletes all repositories owned by userID |
|
func DeleteAllReposByUserID(userID int64) error { |
|
return deleteAllReposByUserID(x, userID) |
|
} |
|
|
|
func deleteAllReposByUserID(e *xorm.Engine, userID int64) error { |
|
if _, err := e.Where("user_id = ?", userID).Delete(new(Repository)); err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
// InsertRepos inserts repos into database |
|
func InsertRepos(repos []*Repository) error { |
|
return insertRepos(x, repos) |
|
} |
|
|
|
func insertRepos(e *xorm.Engine, repos []*Repository) error { |
|
_, err := e.Insert(repos) |
|
return err |
|
} |
|
|
|
// SyncIssues ... |
|
func (r *Repository) SyncIssues(user *User) error { |
|
return r.syncIssues(x, user) |
|
} |
|
|
|
func (r *Repository) syncIssues(e *xorm.Engine, user *User) error { |
|
page := 0 |
|
issues, err := user.GiteaClient().ListRepoIssues(r.Owner, r.Name, structs.ListIssueOption{ |
|
Page: page, |
|
State: "open", |
|
}) |
|
if err != nil { |
|
return err |
|
} |
|
currentIssues := issues |
|
for len(currentIssues) != 0 { |
|
page++ |
|
currentIssues, err = user.GiteaClient().ListRepoIssues(r.Owner, r.Name, structs.ListIssueOption{ |
|
Page: page, |
|
State: "open", |
|
}) |
|
if err != nil { |
|
return err |
|
} |
|
issues = append(issues, currentIssues...) |
|
} |
|
parsedIssues := make([]*Issue, len(issues)) |
|
now := time.Now() |
|
for index, issue := range issues { |
|
parsedIssues[index] = &Issue{ |
|
ID: issue.ID, |
|
Closed: issue.State == "closed", |
|
Excluded: false, // TODO check labels, |
|
IndexedAt: &now, |
|
MarkedAt: nil, |
|
Stale: false, |
|
UpdatedAt: &issue.Updated, |
|
RepoID: r.ID, |
|
} |
|
} |
|
e.In("id") |
|
_, err = e.Insert(parsedIssues) |
|
return err |
|
}
|
|
|