Sfoglia il codice sorgente

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

Kim "BKC" Carlbäcker 8 anni fa
parent
commit
b6fc35f637

+ 23 - 0
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 {

+ 5 - 1
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 - 0
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)
+}