diff options
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/repo.go (renamed from routers/api/v1/repos.go) | 110 | ||||
-rw-r--r-- | routers/api/v1/repo_hooks.go | 50 | ||||
-rw-r--r-- | routers/api/v1/users.go | 15 |
3 files changed, 163 insertions, 12 deletions
diff --git a/routers/api/v1/repos.go b/routers/api/v1/repo.go index 2dee512f2b..39a4c1d42c 100644 --- a/routers/api/v1/repos.go +++ b/routers/api/v1/repo.go @@ -15,10 +15,25 @@ import ( "github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/modules/setting" ) -type repo struct { - RepoLink string `json:"repolink"` +type ApiPermission struct { + Admin bool `json:"admin"` + Push bool `json:"push"` + Pull bool `json:"pull"` +} + +type ApiRepository struct { + Id int64 `json:"id"` + Owner ApiUser `json:"owner"` + FullName string `json:"full_name"` + Private bool `json:"private"` + Fork bool `json:"fork"` + HtmlUrl string `json:"html_url"` + CloneUrl string `json:"clone_url"` + SshUrl string `json:"ssh_url"` + Permissions ApiPermission `json:"permissions"` } func SearchRepos(ctx *middleware.Context) { @@ -60,7 +75,7 @@ func SearchRepos(ctx *middleware.Context) { return } - results := make([]*repo, len(repos)) + results := make([]*ApiRepository, len(repos)) for i := range repos { if err = repos[i].GetOwner(); err != nil { ctx.JSON(500, map[string]interface{}{ @@ -69,8 +84,9 @@ func SearchRepos(ctx *middleware.Context) { }) return } - results[i] = &repo{ - RepoLink: path.Join(repos[i].Owner.Name, repos[i].Name), + results[i] = &ApiRepository{ + Id: repos[i].Id, + FullName: path.Join(repos[i].Owner.Name, repos[i].Name), } } @@ -155,3 +171,87 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) { "error": err.Error(), }) } + +// /user/repos: https://developer.github.com/v3/repos/#list-your-repositories +func ListMyRepos(ctx *middleware.Context) { + if !ctx.IsSigned { + ctx.Error(403) + return + } + + ownRepos, err := models.GetRepositories(ctx.User.Id, true) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "ok": false, + "error": err.Error(), + }) + return + } + numOwnRepos := len(ownRepos) + + collaRepos, err := models.GetCollaborativeRepos(ctx.User.Name) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "ok": false, + "error": err.Error(), + }) + return + } + + sshUrlFmt := "%s@%s:%s/%s.git" + if setting.SshPort != 22 { + sshUrlFmt = "ssh://%s@%s:%d/%s/%s.git" + } + + repos := make([]*ApiRepository, numOwnRepos+len(collaRepos)) + // FIXME: make only one loop + for i := range ownRepos { + repos[i] = &ApiRepository{ + Id: ownRepos[i].Id, + Owner: ApiUser{ + Id: ctx.User.Id, + UserName: ctx.User.Name, + AvatarUrl: string(setting.Protocol) + ctx.User.AvatarLink(), + }, + FullName: ctx.User.Name + "/" + ownRepos[i].Name, + Private: ownRepos[i].IsPrivate, + Fork: ownRepos[i].IsFork, + HtmlUrl: setting.AppUrl + ctx.User.Name + "/" + ownRepos[i].Name, + SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, ctx.User.LowerName, ownRepos[i].LowerName), + Permissions: ApiPermission{true, true, true}, + } + repos[i].CloneUrl = repos[i].HtmlUrl + ".git" + } + for i := range collaRepos { + if err = collaRepos[i].GetOwner(); err != nil { + ctx.JSON(500, map[string]interface{}{ + "ok": false, + "error": err.Error(), + }) + return + } + j := i + numOwnRepos + repos[j] = &ApiRepository{ + Id: collaRepos[i].Id, + Owner: ApiUser{ + Id: collaRepos[i].Owner.Id, + UserName: collaRepos[i].Owner.Name, + AvatarUrl: string(setting.Protocol) + collaRepos[i].Owner.AvatarLink(), + }, + FullName: collaRepos[i].Owner.Name + "/" + collaRepos[i].Name, + Private: collaRepos[i].IsPrivate, + Fork: collaRepos[i].IsFork, + HtmlUrl: setting.AppUrl + collaRepos[i].Owner.Name + "/" + collaRepos[i].Name, + SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, collaRepos[i].Owner.LowerName, collaRepos[i].LowerName), + Permissions: ApiPermission{false, collaRepos[i].CanPush, true}, + } + repos[j].CloneUrl = repos[j].HtmlUrl + ".git" + + // FIXME: cache result to reduce DB query? + if collaRepos[i].Owner.IsOrganization() && collaRepos[i].Owner.IsOrgOwner(ctx.User.Id) { + repos[j].Permissions.Admin = true + } + } + + ctx.JSON(200, &repos) +} diff --git a/routers/api/v1/repo_hooks.go b/routers/api/v1/repo_hooks.go new file mode 100644 index 0000000000..b2f13c79de --- /dev/null +++ b/routers/api/v1/repo_hooks.go @@ -0,0 +1,50 @@ +// Copyright 2014 The Gogs 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 v1 + +import ( + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/middleware" +) + +type apiHookConfig struct { + Url string `json:"url"` + ContentType string `json:"content_type"` +} + +type ApiHook struct { + Id int64 `json:"id"` + Type string `json:"type"` + Events []string `json:"events"` + Active bool `json:"active"` + Config apiHookConfig `json:"config"` +} + +// /repos/:username/:reponame/hooks: https://developer.github.com/v3/repos/hooks/#list-hooks +func ListRepoHooks(ctx *middleware.Context) { + hooks, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "ok": false, + "error": err.Error(), + }) + return + } + + apiHooks := make([]*ApiHook, len(hooks)) + for i := range hooks { + apiHooks[i] = &ApiHook{ + Id: hooks[i].Id, + Type: hooks[i].HookTaskType.Name(), + Active: hooks[i].IsActive, + Config: apiHookConfig{hooks[i].Url, hooks[i].ContentType.Name()}, + } + + // Currently, onle have push event. + apiHooks[i].Events = []string{"push"} + } + + ctx.JSON(200, &apiHooks) +} diff --git a/routers/api/v1/users.go b/routers/api/v1/users.go index 062c3680fc..50b213eda2 100644 --- a/routers/api/v1/users.go +++ b/routers/api/v1/users.go @@ -11,9 +11,10 @@ import ( "github.com/gogits/gogs/modules/middleware" ) -type user struct { - UserName string `json:"username"` - AvatarLink string `json:"avatar"` +type ApiUser struct { + Id int64 `json:"id"` + UserName string `json:"username"` + AvatarUrl string `json:"avatar_url"` } func SearchUsers(ctx *middleware.Context) { @@ -34,11 +35,11 @@ func SearchUsers(ctx *middleware.Context) { return } - results := make([]*user, len(us)) + results := make([]*ApiUser, len(us)) for i := range us { - results[i] = &user{ - UserName: us[i].Name, - AvatarLink: us[i].AvatarLink(), + results[i] = &ApiUser{ + UserName: us[i].Name, + AvatarUrl: us[i].AvatarLink(), } } |