浏览代码

Merge pull request #74 from achilleas-k/api/team-ced

LGTM
Michael Sonntag 5 年之前
父节点
当前提交
2835f9926a
共有 2 个文件被更改,包括 103 次插入3 次删除
  1. 12 3
      internal/route/api/v1/api.go
  2. 91 0
      internal/route/api/v1/org/team.go

+ 12 - 3
internal/route/api/v1/api.go

@@ -5,14 +5,15 @@
 package v1
 
 import (
+	"net/http"
+	"strings"
+
 	admin2 "github.com/G-Node/gogs/internal/route/api/v1/admin"
 	misc2 "github.com/G-Node/gogs/internal/route/api/v1/misc"
 	org2 "github.com/G-Node/gogs/internal/route/api/v1/org"
 	repo2 "github.com/G-Node/gogs/internal/route/api/v1/repo"
 	search2 "github.com/G-Node/gogs/internal/route/api/v1/search"
 	user2 "github.com/G-Node/gogs/internal/route/api/v1/user"
-	"net/http"
-	"strings"
 
 	"github.com/go-macaron/binding"
 	"gopkg.in/macaron.v1"
@@ -368,7 +369,15 @@ func RegisterRoutes(m *macaron.Macaron) {
 			m.Combo("").
 				Get(org2.Get).
 				Patch(bind(api.EditOrgOption{}), org2.Edit)
-			m.Get("/teams", org2.ListTeams)
+			m.Group("/teams", func() {
+				m.Combo("").
+					Get(org2.ListTeams).
+					Post(bind(api.CreateTeamOption{}), org2.CreateTeam)
+				m.Combo("/:team").
+					Get(org2.GetTeam).
+					Patch(bind(api.CreateTeamOption{}), org2.EditTeam).
+					Delete(org2.DeleteTeam)
+			})
 		}, orgAssignment(true))
 
 		m.Group("/admin", func() {

+ 91 - 0
internal/route/api/v1/org/team.go

@@ -5,6 +5,10 @@
 package org
 
 import (
+	"net/http"
+
+	"github.com/G-Node/gogs/internal/db"
+	"github.com/G-Node/gogs/internal/db/errors"
 	convert2 "github.com/G-Node/gogs/internal/route/api/v1/convert"
 	api "github.com/gogs/go-gogs-client"
 
@@ -24,3 +28,90 @@ func ListTeams(c *context.APIContext) {
 	}
 	c.JSON(200, apiTeams)
 }
+
+func CreateTeam(c *context.APIContext, opt api.CreateTeamOption) {
+	org := c.Org.Organization
+	if !org.IsOwnedBy(c.User.ID) {
+		c.Error(http.StatusForbidden, "", "given user is not owner of organization")
+		return
+	}
+	team := &db.Team{
+		OrgID:       org.ID,
+		Name:        opt.Name,
+		Description: opt.Description,
+		Authorize:   db.ParseAccessMode(opt.Permission),
+	}
+	if err := db.NewTeam(team); err != nil {
+		if db.IsErrTeamAlreadyExist(err) {
+			c.Error(http.StatusUnprocessableEntity, "", err)
+		} else {
+			c.ServerError("NewTeam", err)
+		}
+		return
+	}
+
+	c.JSON(http.StatusCreated, convert2.ToTeam(team))
+}
+
+func GetTeam(c *context.APIContext) {
+	teamname := c.Params(":team")
+	org := c.Org.Organization
+	team, err := org.GetTeam(teamname)
+	if err != nil {
+		c.NotFoundOrServerError("GetTeamByName", errors.IsTeamNotExist, err)
+		return
+	}
+	c.JSON(200, convert2.ToTeam(team))
+}
+
+func EditTeam(c *context.APIContext, opt api.CreateTeamOption) {
+	teamname := c.Params(":team")
+	org := c.Org.Organization
+	if !org.IsOwnedBy(c.User.ID) {
+		c.Error(http.StatusForbidden, "", "given user is not owner of organization")
+		return
+	}
+	oldteam, err := org.GetTeam(teamname)
+	if err != nil {
+		c.NotFoundOrServerError("EditTeamByName", errors.IsTeamNotExist, err)
+		return
+	}
+	newperm := oldteam.Authorize
+	newname := oldteam.Name
+	if !oldteam.IsOwnerTeam() {
+		// Not allowed to change Owner team perms or name
+		newperm = db.ParseAccessMode(opt.Permission)
+		newname = opt.Name
+	}
+	team := &db.Team{
+		ID:          oldteam.ID,
+		OrgID:       org.ID,
+		Name:        newname,
+		Description: opt.Description,
+		Authorize:   newperm,
+	}
+	if err := db.UpdateTeam(team, oldteam.Authorize != team.Authorize); err != nil {
+		c.NotFoundOrServerError("EditTeamByName", errors.IsTeamNotExist, err)
+		return
+	}
+	c.JSON(http.StatusCreated, convert2.ToTeam(team))
+}
+
+func DeleteTeam(c *context.APIContext) {
+	teamname := c.Params(":team")
+	org := c.Org.Organization
+	team, err := org.GetTeam(teamname)
+	if err != nil {
+		c.NotFoundOrServerError("DeleteTeamByName", errors.IsTeamNotExist, err)
+		return
+	}
+	if team.IsOwnerTeam() {
+		c.Error(http.StatusMethodNotAllowed, "", "cannot delete Owners team")
+		return
+	}
+	if err := db.DeleteTeam(team); err != nil {
+		c.NotFoundOrServerError("DeleteTeamByName", errors.IsTeamNotExist, err)
+		return
+	}
+	c.NoContent()
+}