summaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
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.go50
-rw-r--r--routers/api/v1/users.go15
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(),
}
}