Browse Source

Implement list/check/delete Repo Collaborator (#3689)

pull/3802/merge
Kim "BKC" Carlbäcker 8 years ago committed by 无闻
parent
commit
b6fc35f637
  1. 23
      models/repo_collaboration.go
  2. 6
      routers/api/v1/api.go
  3. 61
      routers/api/v1/repo/collaborators.go

23
models/repo_collaboration.go

@ -6,6 +6,8 @@ package models
import ( import (
"fmt" "fmt"
api "github.com/gogits/go-gogs-client"
) )
// Collaboration represent the relation between an individual and a repository. // Collaboration represent the relation between an individual and a repository.
@ -29,6 +31,16 @@ func (c *Collaboration) ModeI18nKey() string {
} }
} }
//IsCollaborator returns true if the user is a collaborator
func (repo *Repository) IsCollaborator(uid int64) (bool, error) {
collaboration := &Collaboration{
RepoID: repo.ID,
UserID: uid,
}
return x.Get(collaboration)
}
// AddCollaborator adds new collaboration to a repository with default access mode. // AddCollaborator adds new collaboration to a repository with default access mode.
func (repo *Repository) AddCollaborator(u *User) error { func (repo *Repository) AddCollaborator(u *User) error {
collaboration := &Collaboration{ collaboration := &Collaboration{
@ -77,6 +89,17 @@ type Collaborator struct {
Collaboration *Collaboration Collaboration *Collaboration
} }
func (c *Collaborator) APIFormat() *api.Collaborator {
return &api.Collaborator{
User: c.User.APIFormat(),
Permissions: api.Permission{
Admin: c.Collaboration.Mode >= ACCESS_MODE_ADMIN,
Push: c.Collaboration.Mode >= ACCESS_MODE_WRITE,
Pull: c.Collaboration.Mode >= ACCESS_MODE_READ,
},
}
}
func (repo *Repository) getCollaborators(e Engine) ([]*Collaborator, error) { func (repo *Repository) getCollaborators(e Engine) ([]*Collaborator, error) {
collaborations, err := repo.getCollaborations(e) collaborations, err := repo.getCollaborations(e)
if err != nil { if err != nil {

6
routers/api/v1/api.go

@ -246,7 +246,11 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Combo("/:id").Patch(bind(api.EditHookOption{}), repo.EditHook). m.Combo("/:id").Patch(bind(api.EditHookOption{}), repo.EditHook).
Delete(repo.DeleteHook) Delete(repo.DeleteHook)
}) })
m.Put("/collaborators/:collaborator", bind(api.AddCollaboratorOption{}), repo.AddCollaborator) m.Group("/collaborators", func() {
m.Get("", repo.ListCollaborators)
m.Combo("/:collaborator").Get(repo.IsCollaborator).Put(bind(api.AddCollaboratorOption{}), repo.AddCollaborator).
Delete(repo.DeleteCollaborator)
})
m.Get("/raw/*", context.RepoRef(), repo.GetRawFile) m.Get("/raw/*", context.RepoRef(), repo.GetRawFile)
m.Get("/archive/*", repo.GetArchive) m.Get("/archive/*", repo.GetArchive)
m.Get("/forks", repo.ListForks) m.Get("/forks", repo.ListForks)

61
routers/api/v1/repo/collaborators.go

@ -11,6 +11,24 @@ import (
"github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/context"
) )
func ListCollaborators(ctx *context.APIContext) {
collaborators, err := ctx.Repo.Repository.GetCollaborators()
if err != nil {
if models.IsErrUserNotExist(err) {
ctx.Error(422, "", err)
} else {
ctx.Error(500, "GetCollaborators", err)
}
return
}
apiCollaborators := make([]*api.Collaborator, len(collaborators))
for i := range collaborators {
apiCollaborators[i] = collaborators[i].APIFormat()
}
ctx.JSON(200, &apiCollaborators)
}
func AddCollaborator(ctx *context.APIContext, form api.AddCollaboratorOption) { func AddCollaborator(ctx *context.APIContext, form api.AddCollaboratorOption) {
collaborator, err := models.GetUserByName(ctx.Params(":collaborator")) collaborator, err := models.GetUserByName(ctx.Params(":collaborator"))
if err != nil { if err != nil {
@ -36,3 +54,46 @@ func AddCollaborator(ctx *context.APIContext, form api.AddCollaboratorOption) {
ctx.Status(204) ctx.Status(204)
} }
func IsCollaborator(ctx *context.APIContext) {
collaborator, err := models.GetUserByName(ctx.Params(":collaborator"))
if err != nil {
if models.IsErrUserNotExist(err) {
ctx.Error(422, "", err)
} else {
ctx.Error(500, "GetUserByName", err)
}
return
}
is, err := ctx.Repo.Repository.IsCollaborator(collaborator.ID)
if err != nil {
ctx.Error(500, "IsCollaboration", err)
return
}
if !is {
ctx.Status(404)
} else {
ctx.Status(204)
}
}
func DeleteCollaborator(ctx *context.APIContext) {
collaborator, err := models.GetUserByName(ctx.Params(":collaborator"))
if err != nil {
if models.IsErrUserNotExist(err) {
ctx.Error(422, "", err)
} else {
ctx.Error(500, "GetUserByName", err)
}
return
}
if err := ctx.Repo.Repository.DeleteCollaboration(collaborator.ID); err != nil {
ctx.Error(500, "DeleteCollaboration", err)
return
}
ctx.Status(204)
}

Loading…
Cancel
Save