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 (
"fmt"
api "github.com/gogits/go-gogs-client"
)
// 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.
func (repo *Repository) AddCollaborator(u *User) error {
collaboration := &Collaboration{
@ -77,6 +89,17 @@ type Collaborator struct {
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) {
collaborations, err := repo.getCollaborations(e)
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).
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("/archive/*", repo.GetArchive)
m.Get("/forks", repo.ListForks)

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

@ -11,6 +11,24 @@ import (
"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) {
collaborator, err := models.GetUserByName(ctx.Params(":collaborator"))
if err != nil {
@ -36,3 +54,46 @@ func AddCollaborator(ctx *context.APIContext, form api.AddCollaboratorOption) {
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