mirror of https://github.com/gogs/gogs.git
Implement list/check/delete Repo Collaborator (#3689)
parent
e24d62e583
commit
b6fc35f637
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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…
Reference in New Issue