From 9cd16c5b12d093dd694e146d6c845ee4c405c774 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Thu, 17 Dec 2015 02:28:47 -0500 Subject: [PATCH] #1692 add organization APIs --- README.md | 2 +- cmd/serve.go | 2 +- docker/README.md | 2 +- gogs.go | 2 +- models/org.go | 11 ++- models/user.go | 4 +- modules/setting/setting.go | 4 +- routers/api/v1/admin/orgs.go | 44 ++++++++++++ routers/api/v1/admin/users.go | 6 +- routers/api/v1/api.go | 7 ++ routers/api/v1/{utils => convert}/convert.go | 38 ++++++---- routers/api/v1/org/org.go | 74 ++++++++++++++++++++ routers/api/v1/repo/hooks.go | 10 +-- routers/api/v1/repo/keys.go | 8 +-- routers/api/v1/repo/repo.go | 12 ++-- routers/api/v1/user/email.go | 9 ++- routers/api/v1/user/keys.go | 18 +++-- routers/repo/pull.go | 2 +- routers/user/home.go | 2 +- templates/.VERSION | 2 +- 20 files changed, 204 insertions(+), 55 deletions(-) create mode 100644 routers/api/v1/admin/orgs.go rename routers/api/v1/{utils => convert}/convert.go (63%) create mode 100644 routers/api/v1/org/org.go diff --git a/README.md b/README.md index 0ec648a20c..57366b0b9b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?bra ![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true) -##### Current version: 0.8.8 +##### Current version: 0.8.9 | Web | UI | Preview | |:-------------:|:-------:|:-------:| diff --git a/cmd/serve.go b/cmd/serve.go index f8a5394fde..69ee9b7b1d 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -110,7 +110,7 @@ func handleUpdateTask(uuid string, user, repoUser *models.User, reponame string, } // Ask for running deliver hook and test pull request tasks. - reqURL := setting.LocalUrl + repoUser.Name + "/" + reponame + "/tasks/trigger?branch=" + + reqURL := setting.LocalURL + repoUser.Name + "/" + reponame + "/tasks/trigger?branch=" + strings.TrimPrefix(task.RefName, "refs/heads/") + "&secret=" + base.EncodeMD5(repoUser.Salt) log.GitLogger.Trace("Trigger task: %s", reqURL) diff --git a/docker/README.md b/docker/README.md index 0e2b294794..d1250cdba6 100644 --- a/docker/README.md +++ b/docker/README.md @@ -52,7 +52,7 @@ Most of settings are obvious and easy to understand, but there are some settings - **Repository Root Path**: keep it as default value `/home/git/gogs-repositories` because `start.sh` already made a symbolic link for you. - **Run User**: keep it as default value `git` because `start.sh` already setup a user with name `git`. - **Domain**: fill in with Docker container IP(e.g. `192.168.99.100`). But if you want to access your Gogs instance from a different physical machine, please fill in with the hostname or IP address of the Docker host machine. -- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, but you expose it by `10022:22`, then use `10022` for this value. +- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, but you expose it by `10022:22`, then use `10022` for this value. **Builtin SSH server is not recommended inside Docker Container** - **HTTP Port**: Use port you want Gogs to listen on inside Docker container. For example, your Gogs listens on `3000` inside Docker, and you expose it by `10080:3000`, but you still use `3000` for this value. - **Application URL**: Use combination of **Domain** and **exposed HTTP Port** values(e.g. `http://192.168.99.100:10080/`). diff --git a/gogs.go b/gogs.go index 35e6abe74a..ca660508a6 100644 --- a/gogs.go +++ b/gogs.go @@ -18,7 +18,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.8.8.1216" +const APP_VER = "0.8.9.1217" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/org.go b/models/org.go index 6cc951bef0..fa26b59e66 100644 --- a/models/org.go +++ b/models/org.go @@ -274,10 +274,15 @@ func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) { return getOwnedOrgsByUserID(sess.Desc(desc), userID) } -// GetOrgUsersByUserId returns all organization-user relations by user ID. -func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) { +// GetOrgUsersByUserID returns all organization-user relations by user ID. +func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) { ous := make([]*OrgUser, 0, 10) - err := x.Where("uid=?", uid).Find(&ous) + sess := x.Where("uid=?", uid) + if !all { + // Only show public organizations + sess.And("is_public=?", true) + } + err := sess.Find(&ous) return ous, err } diff --git a/models/user.go b/models/user.go index 71729a4e3e..ebdc3c47fe 100644 --- a/models/user.go +++ b/models/user.go @@ -376,8 +376,8 @@ func (u *User) GetOwnedOrganizations() (err error) { } // GetOrganizations returns all organizations that user belongs to. -func (u *User) GetOrganizations() error { - ous, err := GetOrgUsersByUserId(u.Id) +func (u *User) GetOrganizations(all bool) error { + ous, err := GetOrgUsersByUserID(u.Id, all) if err != nil { return err } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 5beb37fd60..4b6136ac72 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -59,7 +59,7 @@ var ( Protocol Scheme Domain string HttpAddr, HttpPort string - LocalUrl string + LocalURL string DisableSSH bool StartSSHServer bool SSHDomain string @@ -302,7 +302,7 @@ func NewContext() { Domain = sec.Key("DOMAIN").MustString("localhost") HttpAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0") HttpPort = sec.Key("HTTP_PORT").MustString("3000") - LocalUrl = sec.Key("LOCAL_ROOT_URL").MustString("http://localhost:" + HttpPort + "/") + LocalURL = sec.Key("LOCAL_ROOT_URL").MustString("http://localhost:" + HttpPort + "/") DisableSSH = sec.Key("DISABLE_SSH").MustBool() if !DisableSSH { StartSSHServer = sec.Key("START_SSH_SERVER").MustBool() diff --git a/routers/api/v1/admin/orgs.go b/routers/api/v1/admin/orgs.go new file mode 100644 index 0000000000..5b5302ca15 --- /dev/null +++ b/routers/api/v1/admin/orgs.go @@ -0,0 +1,44 @@ +// Copyright 2015 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 admin + +import ( + api "github.com/gogits/go-gogs-client" + + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/api/v1/convert" + "github.com/gogits/gogs/routers/api/v1/user" +) + +// https://github.com/gogits/go-gogs-client/wiki/Administration-Organizations#create-a-new-organization +func CreateOrg(ctx *middleware.Context, form api.CreateOrgOption) { + u := user.GetUserByParams(ctx) + if ctx.Written() { + return + } + + org := &models.User{ + Name: form.UserName, + FullName: form.FullName, + Description: form.Description, + Website: form.Website, + Location: form.Location, + IsActive: true, + Type: models.ORGANIZATION, + } + if err := models.CreateOrganization(org, u); err != nil { + if models.IsErrUserAlreadyExist(err) || + models.IsErrNameReserved(err) || + models.IsErrNamePatternNotAllowed(err) { + ctx.APIError(422, "CreateOrganization", err) + } else { + ctx.APIError(500, "CreateOrganization", err) + } + return + } + + ctx.JSON(201, convert.ToApiOrganization(org)) +} diff --git a/routers/api/v1/admin/users.go b/routers/api/v1/admin/users.go index 1bd253681b..9a8c906f29 100644 --- a/routers/api/v1/admin/users.go +++ b/routers/api/v1/admin/users.go @@ -12,8 +12,8 @@ import ( "github.com/gogits/gogs/modules/mailer" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" + "github.com/gogits/gogs/routers/api/v1/convert" "github.com/gogits/gogs/routers/api/v1/user" - to "github.com/gogits/gogs/routers/api/v1/utils" ) func parseLoginSource(ctx *middleware.Context, u *models.User, sourceID int64, loginName string) { @@ -69,7 +69,7 @@ func CreateUser(ctx *middleware.Context, form api.CreateUserOption) { mailer.SendRegisterNotifyMail(ctx.Context, u) } - ctx.JSON(201, to.ApiUser(u)) + ctx.JSON(201, convert.ToApiUser(u)) } // https://github.com/gogits/go-gogs-client/wiki/Administration-Users#edit-an-existing-user @@ -118,7 +118,7 @@ func EditUser(ctx *middleware.Context, form api.EditUserOption) { } log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name) - ctx.JSON(200, to.ApiUser(u)) + ctx.JSON(200, convert.ToApiUser(u)) } // https://github.com/gogits/go-gogs-client/wiki/Administration-Users#delete-a-user diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index eeba713945..bc7c14006e 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -17,6 +17,7 @@ import ( "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/routers/api/v1/admin" "github.com/gogits/gogs/routers/api/v1/misc" + "github.com/gogits/gogs/routers/api/v1/org" "github.com/gogits/gogs/routers/api/v1/repo" "github.com/gogits/gogs/routers/api/v1/user" ) @@ -179,6 +180,11 @@ func RegisterRoutes(m *macaron.Macaron) { }, RepoAssignment()) }, ReqToken()) + // Organizations + m.Get("/user/orgs", org.ListMyOrgs) + m.Get("/users/:username/orgs", org.ListUserOrgs) + m.Combo("/orgs/:orgname").Get(org.Get).Patch(bind(api.EditOrgOption{}), org.Edit) + m.Any("/*", func(ctx *middleware.Context) { ctx.Error(404) }) @@ -191,6 +197,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Combo("").Patch(bind(api.EditUserOption{}), admin.EditUser). Delete(admin.DeleteUser) m.Post("/keys", admin.CreatePublicKey) + m.Post("/orgs", bind(api.CreateOrgOption{}), admin.CreateOrg) }) }) }, ReqAdmin()) diff --git a/routers/api/v1/utils/convert.go b/routers/api/v1/convert/convert.go similarity index 63% rename from routers/api/v1/utils/convert.go rename to routers/api/v1/convert/convert.go index 3871c0da11..b91abbdd39 100644 --- a/routers/api/v1/utils/convert.go +++ b/routers/api/v1/convert/convert.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package utils +package convert import ( "fmt" @@ -15,8 +15,8 @@ import ( "github.com/gogits/gogs/modules/setting" ) -// ApiUser converts user to its API format. -func ApiUser(u *models.User) *api.User { +// ToApiUser converts user to its API format. +func ToApiUser(u *models.User) *api.User { return &api.User{ ID: u.Id, UserName: u.Name, @@ -26,7 +26,7 @@ func ApiUser(u *models.User) *api.User { } } -func ApiEmail(email *models.EmailAddress) *api.Email { +func ToApiEmail(email *models.EmailAddress) *api.Email { return &api.Email{ Email: email.Email, Verified: email.IsActivated, @@ -34,12 +34,12 @@ func ApiEmail(email *models.EmailAddress) *api.Email { } } -// ApiRepository converts repository to API format. -func ApiRepository(owner *models.User, repo *models.Repository, permission api.Permission) *api.Repository { +// ToApiRepository converts repository to API format. +func ToApiRepository(owner *models.User, repo *models.Repository, permission api.Permission) *api.Repository { cl := repo.CloneLink() return &api.Repository{ Id: repo.ID, - Owner: *ApiUser(owner), + Owner: *ToApiUser(owner), FullName: owner.Name + "/" + repo.Name, Private: repo.IsPrivate, Fork: repo.IsFork, @@ -50,8 +50,8 @@ func ApiRepository(owner *models.User, repo *models.Repository, permission api.P } } -// ApiPublicKey converts public key to its API format. -func ApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey { +// ToApiPublicKey converts public key to its API format. +func ToApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey { return &api.PublicKey{ ID: key.ID, Key: key.Content, @@ -61,8 +61,8 @@ func ApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey { } } -// ApiHook converts webhook to its API format. -func ApiHook(repoLink string, w *models.Webhook) *api.Hook { +// ToApiHook converts webhook to its API format. +func ToApiHook(repoLink string, w *models.Webhook) *api.Hook { config := map[string]string{ "url": w.URL, "content_type": w.ContentType.Name(), @@ -87,8 +87,8 @@ func ApiHook(repoLink string, w *models.Webhook) *api.Hook { } } -// ApiDeployKey converts deploy key to its API format. -func ApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey { +// ToApiDeployKey converts deploy key to its API format. +func ToApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey { return &api.DeployKey{ ID: key.ID, Key: key.Content, @@ -98,3 +98,15 @@ func ApiDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey { ReadOnly: true, // All deploy keys are read-only. } } + +func ToApiOrganization(org *models.User) *api.Organization { + return &api.Organization{ + ID: org.Id, + AvatarUrl: org.AvatarLink(), + UserName: org.Name, + FullName: org.FullName, + Description: org.Description, + Website: org.Website, + Location: org.Location, + } +} diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go new file mode 100644 index 0000000000..2c6d6fd3f8 --- /dev/null +++ b/routers/api/v1/org/org.go @@ -0,0 +1,74 @@ +// Copyright 2015 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 org + +import ( + api "github.com/gogits/go-gogs-client" + + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/api/v1/convert" + "github.com/gogits/gogs/routers/api/v1/user" +) + +func listUserOrgs(ctx *middleware.Context, u *models.User, all bool) { + if err := u.GetOrganizations(all); err != nil { + ctx.APIError(500, "GetOrganizations", err) + return + } + + apiOrgs := make([]*api.Organization, len(u.Orgs)) + for i := range u.Orgs { + apiOrgs[i] = convert.ToApiOrganization(u.Orgs[i]) + } + ctx.JSON(200, &apiOrgs) +} + +// https://github.com/gogits/go-gogs-client/wiki/Organizations#list-your-organizations +func ListMyOrgs(ctx *middleware.Context) { + listUserOrgs(ctx, ctx.User, true) +} + +// https://github.com/gogits/go-gogs-client/wiki/Organizations#list-user-organizations +func ListUserOrgs(ctx *middleware.Context) { + u := user.GetUserByParams(ctx) + if ctx.Written() { + return + } + listUserOrgs(ctx, u, false) +} + +// https://github.com/gogits/go-gogs-client/wiki/Organizations#get-an-organization +func Get(ctx *middleware.Context) { + org := user.GetUserByParamsName(ctx, ":orgname") + if ctx.Written() { + return + } + ctx.JSON(200, convert.ToApiOrganization(org)) +} + +// https://github.com/gogits/go-gogs-client/wiki/Organizations#edit-an-organization +func Edit(ctx *middleware.Context, form api.EditOrgOption) { + org := user.GetUserByParamsName(ctx, ":orgname") + if ctx.Written() { + return + } + + if !org.IsOwnedBy(ctx.User.Id) { + ctx.Error(403) + return + } + + org.FullName = form.FullName + org.Description = form.Description + org.Website = form.Website + org.Location = form.Location + if err := models.UpdateUser(org); err != nil { + ctx.APIError(500, "UpdateUser", err) + return + } + + ctx.JSON(200, convert.ToApiOrganization(org)) +} diff --git a/routers/api/v1/repo/hooks.go b/routers/api/v1/repo/hooks.go index 1ec7088670..e0893a014c 100644 --- a/routers/api/v1/repo/hooks.go +++ b/routers/api/v1/repo/hooks.go @@ -13,7 +13,7 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/middleware" - to "github.com/gogits/gogs/routers/api/v1/utils" + "github.com/gogits/gogs/routers/api/v1/convert" ) // https://github.com/gogits/go-gogs-client/wiki/Repositories#list-hooks @@ -26,7 +26,7 @@ func ListHooks(ctx *middleware.Context) { apiHooks := make([]*api.Hook, len(hooks)) for i := range hooks { - apiHooks[i] = to.ApiHook(ctx.Repo.RepoLink, hooks[i]) + apiHooks[i] = convert.ToApiHook(ctx.Repo.RepoLink, hooks[i]) } ctx.JSON(200, &apiHooks) @@ -94,7 +94,7 @@ func CreateHook(ctx *middleware.Context, form api.CreateHookOption) { return } - ctx.JSON(201, to.ApiHook(ctx.Repo.RepoLink, w)) + ctx.JSON(201, convert.ToApiHook(ctx.Repo.RepoLink, w)) } // https://github.com/gogits/go-gogs-client/wiki/Repositories#edit-a-hook @@ -104,7 +104,7 @@ func EditHook(ctx *middleware.Context, form api.EditHookOption) { if models.IsErrWebhookNotExist(err) { ctx.Error(404) } else { - ctx.APIError(500, "GetWebhookById", err) + ctx.APIError(500, "GetWebhookByID", err) } return } @@ -161,5 +161,5 @@ func EditHook(ctx *middleware.Context, form api.EditHookOption) { return } - ctx.JSON(200, to.ApiHook(ctx.Repo.RepoLink, w)) + ctx.JSON(200, convert.ToApiHook(ctx.Repo.RepoLink, w)) } diff --git a/routers/api/v1/repo/keys.go b/routers/api/v1/repo/keys.go index b0d8f9146d..2ec0b754f2 100644 --- a/routers/api/v1/repo/keys.go +++ b/routers/api/v1/repo/keys.go @@ -12,7 +12,7 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" - to "github.com/gogits/gogs/routers/api/v1/utils" + "github.com/gogits/gogs/routers/api/v1/convert" ) func composeDeployKeysAPILink(repoPath string) string { @@ -34,7 +34,7 @@ func ListDeployKeys(ctx *middleware.Context) { ctx.APIError(500, "GetContent", err) return } - apiKeys[i] = to.ApiDeployKey(apiLink, keys[i]) + apiKeys[i] = convert.ToApiDeployKey(apiLink, keys[i]) } ctx.JSON(200, &apiKeys) @@ -58,7 +58,7 @@ func GetDeployKey(ctx *middleware.Context) { } apiLink := composeDeployKeysAPILink(ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name) - ctx.JSON(200, to.ApiDeployKey(apiLink, key)) + ctx.JSON(200, convert.ToApiDeployKey(apiLink, key)) } func HandleCheckKeyStringError(ctx *middleware.Context, err error) { @@ -96,7 +96,7 @@ func CreateDeployKey(ctx *middleware.Context, form api.CreateKeyOption) { key.Content = content apiLink := composeDeployKeysAPILink(ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name) - ctx.JSON(201, to.ApiDeployKey(apiLink, key)) + ctx.JSON(201, convert.ToApiDeployKey(apiLink, key)) } // https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#remove-a-deploy-key diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index c0d897b5d4..7790377910 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -16,7 +16,7 @@ import ( "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" - to "github.com/gogits/gogs/routers/api/v1/utils" + "github.com/gogits/gogs/routers/api/v1/convert" ) // https://github.com/gogits/go-gogs-client/wiki/Repositories#search-repositories @@ -97,12 +97,12 @@ func ListMyRepos(ctx *middleware.Context) { repos := make([]*api.Repository, numOwnRepos+len(accessibleRepos)) for i := range ownRepos { - repos[i] = to.ApiRepository(ctx.User, ownRepos[i], api.Permission{true, true, true}) + repos[i] = convert.ToApiRepository(ctx.User, ownRepos[i], api.Permission{true, true, true}) } i := numOwnRepos for repo, access := range accessibleRepos { - repos[i] = to.ApiRepository(repo.Owner, repo, api.Permission{ + repos[i] = convert.ToApiRepository(repo.Owner, repo, api.Permission{ Admin: access >= models.ACCESS_MODE_ADMIN, Push: access >= models.ACCESS_MODE_WRITE, Pull: true, @@ -139,7 +139,7 @@ func createRepo(ctx *middleware.Context, owner *models.User, opt api.CreateRepoO return } - ctx.JSON(201, to.ApiRepository(owner, repo, api.Permission{true, true, true})) + ctx.JSON(201, convert.ToApiRepository(owner, repo, api.Permission{true, true, true})) } // https://github.com/gogits/go-gogs-client/wiki/Repositories#create @@ -239,7 +239,7 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) { } log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName) - ctx.JSON(201, to.ApiRepository(ctxUser, repo, api.Permission{true, true, true})) + ctx.JSON(201, convert.ToApiRepository(ctxUser, repo, api.Permission{true, true, true})) } func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) { @@ -273,7 +273,7 @@ func Get(ctx *middleware.Context) { return } - ctx.JSON(200, to.ApiRepository(owner, repo, api.Permission{true, true, true})) + ctx.JSON(200, convert.ToApiRepository(owner, repo, api.Permission{true, true, true})) } // https://github.com/gogits/go-gogs-client/wiki/Repositories#delete diff --git a/routers/api/v1/user/email.go b/routers/api/v1/user/email.go index 449560e782..fd9193bd74 100644 --- a/routers/api/v1/user/email.go +++ b/routers/api/v1/user/email.go @@ -10,9 +10,10 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" - to "github.com/gogits/gogs/routers/api/v1/utils" + "github.com/gogits/gogs/routers/api/v1/convert" ) +// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#list-email-addresses-for-a-user func ListEmails(ctx *middleware.Context) { emails, err := models.GetEmailAddresses(ctx.User.Id) if err != nil { @@ -21,11 +22,12 @@ func ListEmails(ctx *middleware.Context) { } apiEmails := make([]*api.Email, len(emails)) for i := range emails { - apiEmails[i] = to.ApiEmail(emails[i]) + apiEmails[i] = convert.ToApiEmail(emails[i]) } ctx.JSON(200, &apiEmails) } +// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#add-email-addresses func AddEmail(ctx *middleware.Context, form api.CreateEmailOption) { if len(form.Emails) == 0 { ctx.Status(422) @@ -52,11 +54,12 @@ func AddEmail(ctx *middleware.Context, form api.CreateEmailOption) { apiEmails := make([]*api.Email, len(emails)) for i := range emails { - apiEmails[i] = to.ApiEmail(emails[i]) + apiEmails[i] = convert.ToApiEmail(emails[i]) } ctx.JSON(201, &apiEmails) } +// https://github.com/gogits/go-gogs-client/wiki/Users-Emails#delete-email-addresses func DeleteEmail(ctx *middleware.Context, form api.CreateEmailOption) { if len(form.Emails) == 0 { ctx.Status(204) diff --git a/routers/api/v1/user/keys.go b/routers/api/v1/user/keys.go index 213631e146..8ba73d9934 100644 --- a/routers/api/v1/user/keys.go +++ b/routers/api/v1/user/keys.go @@ -10,13 +10,12 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" + "github.com/gogits/gogs/routers/api/v1/convert" "github.com/gogits/gogs/routers/api/v1/repo" - to "github.com/gogits/gogs/routers/api/v1/utils" ) -// GetUserByParams returns user whose name is presented in URL paramenter. -func GetUserByParams(ctx *middleware.Context) *models.User { - user, err := models.GetUserByName(ctx.Params(":username")) +func GetUserByParamsName(ctx *middleware.Context, name string) *models.User { + user, err := models.GetUserByName(ctx.Params(name)) if err != nil { if models.IsErrUserNotExist(err) { ctx.Error(404) @@ -28,6 +27,11 @@ func GetUserByParams(ctx *middleware.Context) *models.User { return user } +// GetUserByParams returns user whose name is presented in URL paramenter. +func GetUserByParams(ctx *middleware.Context) *models.User { + return GetUserByParamsName(ctx, ":username") +} + func composePublicKeysAPILink() string { return setting.AppUrl + "api/v1/user/keys/" } @@ -42,7 +46,7 @@ func listPublicKeys(ctx *middleware.Context, uid int64) { apiLink := composePublicKeysAPILink() apiKeys := make([]*api.PublicKey, len(keys)) for i := range keys { - apiKeys[i] = to.ApiPublicKey(apiLink, keys[i]) + apiKeys[i] = convert.ToApiPublicKey(apiLink, keys[i]) } ctx.JSON(200, &apiKeys) @@ -75,7 +79,7 @@ func GetPublicKey(ctx *middleware.Context) { } apiLink := composePublicKeysAPILink() - ctx.JSON(200, to.ApiPublicKey(apiLink, key)) + ctx.JSON(200, convert.ToApiPublicKey(apiLink, key)) } // CreateUserPublicKey creates new public key to given user by ID. @@ -92,7 +96,7 @@ func CreateUserPublicKey(ctx *middleware.Context, form api.CreateKeyOption, uid return } apiLink := composePublicKeysAPILink() - ctx.JSON(201, to.ApiPublicKey(apiLink, key)) + ctx.JSON(201, convert.ToApiPublicKey(apiLink, key)) } // https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#create-a-public-key diff --git a/routers/repo/pull.go b/routers/repo/pull.go index f543fc31c6..ee018ebda7 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -54,7 +54,7 @@ func getForkRepository(ctx *middleware.Context) *models.Repository { } ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name - if err := ctx.User.GetOrganizations(); err != nil { + if err := ctx.User.GetOrganizations(true); err != nil { ctx.Handle(500, "GetOrganizations", err) return nil } diff --git a/routers/user/home.go b/routers/user/home.go index 8b25d799f1..cd1d0fac5c 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -44,7 +44,7 @@ func getDashboardContextUser(ctx *middleware.Context) *models.User { } ctx.Data["ContextUser"] = ctxUser - if err := ctx.User.GetOrganizations(); err != nil { + if err := ctx.User.GetOrganizations(true); err != nil { ctx.Handle(500, "GetOrganizations", err) return nil } diff --git a/templates/.VERSION b/templates/.VERSION index 1d848e80f1..d042bc8d87 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.8.8.1216 \ No newline at end of file +0.8.9.1217 \ No newline at end of file