@@ -222,6 +222,30 @@ func (repo *Repository) MustOwner() *user_model.User { | |||
return repo.mustOwner(db.DefaultContext) | |||
} | |||
// LoadAttributes loads attributes of the repository. | |||
func (repo *Repository) LoadAttributes(ctx context.Context) error { | |||
// Load owner | |||
if err := repo.GetOwner(ctx); err != nil { | |||
return fmt.Errorf("load owner: %w", err) | |||
} | |||
// Load primary language | |||
stats := make(LanguageStatList, 0, 1) | |||
if err := db.GetEngine(ctx). | |||
Where("`repo_id` = ? AND `is_primary` = ? AND `language` != ?", repo.ID, true, "other"). | |||
Find(&stats); err != nil { | |||
return fmt.Errorf("find primary languages: %w", err) | |||
} | |||
stats.LoadAttributes() | |||
for _, st := range stats { | |||
if st.RepoID == repo.ID { | |||
repo.PrimaryLanguage = st | |||
break | |||
} | |||
} | |||
return nil | |||
} | |||
// FullName returns the repository full name | |||
func (repo *Repository) FullName() string { | |||
return repo.OwnerName + "/" + repo.Name |
@@ -623,7 +623,7 @@ func FindUserAccessibleRepoIDs(user *user_model.User) ([]int64, error) { | |||
} | |||
// GetUserRepositories returns a list of repositories of given user. | |||
func GetUserRepositories(opts *SearchRepoOptions) ([]*repo_model.Repository, int64, error) { | |||
func GetUserRepositories(opts *SearchRepoOptions) (RepositoryList, int64, error) { | |||
if len(opts.OrderBy) == 0 { | |||
opts.OrderBy = "updated_unix DESC" | |||
} | |||
@@ -646,6 +646,6 @@ func GetUserRepositories(opts *SearchRepoOptions) ([]*repo_model.Repository, int | |||
} | |||
sess = sess.Where(cond).OrderBy(opts.OrderBy.String()) | |||
repos := make([]*repo_model.Repository, 0, opts.PageSize) | |||
repos := make(RepositoryList, 0, opts.PageSize) | |||
return repos, count, db.SetSessionPagination(sess, opts).Find(&repos) | |||
} |
@@ -125,6 +125,13 @@ func innerToRepo(repo *repo_model.Repository, mode perm.AccessMode, isParent boo | |||
} | |||
} | |||
var language string | |||
if repo.PrimaryLanguage != nil { | |||
language = repo.PrimaryLanguage.Language | |||
} | |||
repoAPIURL := repo.APIURL() | |||
return &api.Repository{ | |||
ID: repo.ID, | |||
Owner: ToUserWithAccessMode(repo.Owner, mode), | |||
@@ -144,6 +151,8 @@ func innerToRepo(repo *repo_model.Repository, mode perm.AccessMode, isParent boo | |||
CloneURL: cloneLink.HTTPS, | |||
OriginalURL: repo.SanitizedOriginalURL(), | |||
Website: repo.Website, | |||
Language: language, | |||
LanguagesURL: repoAPIURL + "/languages", | |||
Stars: repo.NumStars, | |||
Forks: repo.NumForks, | |||
Watchers: repo.NumWatches, |
@@ -59,6 +59,8 @@ type Repository struct { | |||
Parent *Repository `json:"parent"` | |||
Mirror bool `json:"mirror"` | |||
Size int `json:"size"` | |||
Language string `json:"language"` | |||
LanguagesURL string `json:"languages_url"` | |||
HTMLURL string `json:"html_url"` | |||
SSHURL string `json:"ssh_url"` | |||
CloneURL string `json:"clone_url"` |
@@ -533,6 +533,11 @@ func Get(ctx *context.APIContext) { | |||
// "200": | |||
// "$ref": "#/responses/Repository" | |||
if err := ctx.Repo.Repository.LoadAttributes(ctx); err != nil { | |||
ctx.Error(http.StatusInternalServerError, "Repository.LoadAttributes", err) | |||
return | |||
} | |||
ctx.JSON(http.StatusOK, convert.ToRepo(ctx.Repo.Repository, ctx.Repo.AccessMode)) | |||
} | |||
@@ -32,6 +32,11 @@ func listUserRepos(ctx *context.APIContext, u *user_model.User, private bool) { | |||
return | |||
} | |||
if err := repos.LoadAttributes(); err != nil { | |||
ctx.Error(http.StatusInternalServerError, "RepositoryList.LoadAttributes", err) | |||
return | |||
} | |||
apiRepos := make([]*api.Repository, 0, len(repos)) | |||
for i := range repos { | |||
access, err := models.AccessLevel(ctx.User, repos[i]) |
@@ -17188,6 +17188,14 @@ | |||
"internal_tracker": { | |||
"$ref": "#/definitions/InternalTracker" | |||
}, | |||
"language": { | |||
"type": "string", | |||
"x-go-name": "Language" | |||
}, | |||
"languages_url": { | |||
"type": "string", | |||
"x-go-name": "LanguagesURL" | |||
}, | |||
"mirror": { | |||
"type": "boolean", | |||
"x-go-name": "Mirror" |