]> source.dussan.org Git - gitea.git/commitdiff
api: Add missing GET teams endpoints (#5382)
authorHarshit Bansal <harshitbansal2015@gmail.com>
Thu, 17 Jan 2019 00:39:50 +0000 (06:09 +0530)
committertechknowlogick <hello@techknowlogick.com>
Thu, 17 Jan 2019 00:39:50 +0000 (19:39 -0500)
* api: Add an endpoint to list a particular member of team.

* models: Rename `GetUserTeams()` to `GetUserOrgTeams()` in `org_team` model.

`GetUserTeams()` sounds a bit misnomer since it actually returns
the teams that user belongs to in a given organization rather than
all the teams across all the organization that the user has joined.

* models: Add `GetUserTeams()`.

Returns all the teams that a user belongs to.

* api: Add an endpoint for GET '/user/teams'.

A GET request to this endpoint lists all the teams that a user
belongs to.

Gopkg.lock
models/org.go
models/org_team.go
models/org_team_test.go
routers/api/v1/api.go
routers/api/v1/org/team.go
templates/swagger/v1_json.tmpl
vendor/code.gitea.io/sdk/gitea/hook.go
vendor/code.gitea.io/sdk/gitea/org_team.go
vendor/code.gitea.io/sdk/gitea/release.go

index 88d3567b20575d5fbfe4aa351447c9afd3e80bfc..17e4397b15f68e064fb872e8faa8fe355f7f0677 100644 (file)
 
 [[projects]]
   branch = "master"
-  digest = "1:aed2bc1c4026233af8ad43cab9d9464a0e3b906d3d058d2d6e814f3e1ddfa528"
+  digest = "1:8a559f110defa54f847a3efa2734297571d960b476699579f2008e4a37b62a1a"
   name = "code.gitea.io/sdk"
   packages = ["gitea"]
   pruneopts = "NUT"
-  revision = "d95a6e0392218961d1bdd18020290a20bd61b063"
+  revision = "140e9fcba7583e1c6f22eb57676bb00794ef14a8"
 
 [[projects]]
   digest = "1:3fcef06a1a6561955c94af6c7757a6fa37605eb653f0d06ab960e5bb80092195"
index a98a1bd894ebea648a22bcd533a5e3ae76518ad0..3f17e3641fd3a5ded459fd7d177d8327ee6f48dd 100644 (file)
@@ -522,7 +522,7 @@ func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
        }
 
        // Delete member in his/her teams.
-       teams, err := getUserTeams(sess, org.ID, userID)
+       teams, err := getUserOrgTeams(sess, org.ID, userID)
        if err != nil {
                return err
        }
index 34e1b4db830a1746ab70caa079f1be630ae869f1..2ab807b49b3c75f2239f70a40e0540615ccfbf4c 100644 (file)
@@ -543,7 +543,14 @@ func GetTeamMembers(teamID int64) ([]*User, error) {
        return getTeamMembers(x, teamID)
 }
 
-func getUserTeams(e Engine, orgID, userID int64) (teams []*Team, err error) {
+func getUserTeams(e Engine, userID int64) (teams []*Team, err error) {
+       return teams, e.
+               Join("INNER", "team_user", "team_user.team_id = team.id").
+               Where("team_user.uid=?", userID).
+               Find(&teams)
+}
+
+func getUserOrgTeams(e Engine, orgID, userID int64) (teams []*Team, err error) {
        return teams, e.
                Join("INNER", "team_user", "team_user.team_id = team.id").
                Where("team.org_id = ?", orgID).
@@ -561,9 +568,14 @@ func getUserRepoTeams(e Engine, orgID, userID, repoID int64) (teams []*Team, err
                Find(&teams)
 }
 
-// GetUserTeams returns all teams that user belongs to in given organization.
-func GetUserTeams(orgID, userID int64) ([]*Team, error) {
-       return getUserTeams(x, orgID, userID)
+// GetUserOrgTeams returns all teams that user belongs to in given organization.
+func GetUserOrgTeams(orgID, userID int64) ([]*Team, error) {
+       return getUserOrgTeams(x, orgID, userID)
+}
+
+// GetUserTeams returns all teams that user belongs across all organizations.
+func GetUserTeams(userID int64) ([]*Team, error) {
+       return getUserTeams(x, userID)
 }
 
 // AddTeamMember adds new membership of given team to given organization,
index 87bfbb4841907d5f61ae04534635cd9b082f5ad2..a81f9c07497c4c26237be10cfd1c0e971dca793d 100644 (file)
@@ -284,9 +284,23 @@ func TestGetTeamMembers(t *testing.T) {
 }
 
 func TestGetUserTeams(t *testing.T) {
+       assert.NoError(t, PrepareTestDatabase())
+       test := func(userID int64) {
+               teams, err := GetUserTeams(userID)
+               assert.NoError(t, err)
+               for _, team := range teams {
+                       AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID})
+               }
+       }
+       test(2)
+       test(5)
+       test(NonexistentID)
+}
+
+func TestGetUserOrgTeams(t *testing.T) {
        assert.NoError(t, PrepareTestDatabase())
        test := func(orgID, userID int64) {
-               teams, err := GetUserTeams(orgID, userID)
+               teams, err := GetUserOrgTeams(orgID, userID)
                assert.NoError(t, err)
                for _, team := range teams {
                        assert.EqualValues(t, orgID, team.OrgID)
index dcc77969f1cb0f1ebd9ef78fc3ee4fb5495c6f9d..82c4b78de8e44639b784c3df9901e3b923b2f04e 100644 (file)
@@ -463,6 +463,8 @@ func RegisterRoutes(m *macaron.Macaron) {
                        m.Get("/times", repo.ListMyTrackedTimes)
 
                        m.Get("/subscriptions", user.GetMyWatchedRepos)
+
+                       m.Get("/teams", org.ListUserTeams)
                }, reqToken())
 
                // Repositories
@@ -652,6 +654,7 @@ func RegisterRoutes(m *macaron.Macaron) {
                        m.Group("/members", func() {
                                m.Get("", org.GetTeamMembers)
                                m.Combo("/:username").
+                                       Get(org.GetTeamMember).
                                        Put(reqOrgOwnership(), org.AddTeamMember).
                                        Delete(reqOrgOwnership(), org.RemoveTeamMember)
                        })
index a22d25eae3018f88b9d40555c415f836b037820e..a1916db00b2de20314a7afc1d731402bff608bb8 100644 (file)
@@ -1,4 +1,5 @@
 // Copyright 2016 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
 // Use of this source code is governed by a MIT-style
 // license that can be found in the LICENSE file.
 
@@ -42,6 +43,41 @@ func ListTeams(ctx *context.APIContext) {
        ctx.JSON(200, apiTeams)
 }
 
+// ListUserTeams list all the teams a user belongs to
+func ListUserTeams(ctx *context.APIContext) {
+       // swagger:operation GET /user/teams user userListTeams
+       // ---
+       // summary: List all the teams a user belongs to
+       // produces:
+       // - application/json
+       // responses:
+       //   "200":
+       //     "$ref": "#/responses/TeamList"
+       teams, err := models.GetUserTeams(ctx.User.ID)
+       if err != nil {
+               ctx.Error(500, "GetUserTeams", err)
+               return
+       }
+
+       cache := make(map[int64]*api.Organization)
+       apiTeams := make([]*api.Team, len(teams))
+       for i := range teams {
+               apiOrg, ok := cache[teams[i].OrgID]
+               if !ok {
+                       org, err := models.GetUserByID(teams[i].OrgID)
+                       if err != nil {
+                               ctx.Error(500, "GetUserByID", err)
+                               return
+                       }
+                       apiOrg = convert.ToOrganization(org)
+                       cache[teams[i].OrgID] = apiOrg
+               }
+               apiTeams[i] = convert.ToTeam(teams[i])
+               apiTeams[i].Organization = apiOrg
+       }
+       ctx.JSON(200, apiTeams)
+}
+
 // GetTeam api for get a team
 func GetTeam(ctx *context.APIContext) {
        // swagger:operation GET /teams/{id} organization orgGetTeam
@@ -221,6 +257,35 @@ func GetTeamMembers(ctx *context.APIContext) {
        ctx.JSON(200, members)
 }
 
+// GetTeamMember api for get a particular member of team
+func GetTeamMember(ctx *context.APIContext) {
+       // swagger:operation GET /teams/{id}/members/{username} organization orgListTeamMember
+       // ---
+       // summary: List a particular member of team
+       // produces:
+       // - application/json
+       // parameters:
+       // - name: id
+       //   in: path
+       //   description: id of the team
+       //   type: integer
+       //   format: int64
+       //   required: true
+       // - name: username
+       //   in: path
+       //   description: username of the member to list
+       //   type: string
+       //   required: true
+       // responses:
+       //   "200":
+       //     "$ref": "#/responses/User"
+       u := user.GetUserByParams(ctx)
+       if ctx.Written() {
+               return
+       }
+       ctx.JSON(200, u.APIFormat())
+}
+
 // AddTeamMember api for add a member to a team
 func AddTeamMember(ctx *context.APIContext) {
        // swagger:operation PUT /teams/{id}/members/{username} organization orgAddTeamMember
index 52633957c3412c313f1f1f875d4c53260de44388..153701d6dda9707db9725ee10f4479ca020e4c1f 100644 (file)
       }
     },
     "/teams/{id}/members/{username}": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "organization"
+        ],
+        "summary": "List a particular member of team",
+        "operationId": "orgListTeamMember",
+        "parameters": [
+          {
+            "type": "integer",
+            "format": "int64",
+            "description": "id of the team",
+            "name": "id",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "description": "username of the member to list",
+            "name": "username",
+            "in": "path",
+            "required": true
+          }
+        ],
+        "responses": {
+          "200": {
+            "$ref": "#/responses/User"
+          }
+        }
+      },
       "put": {
         "produces": [
           "application/json"
         }
       }
     },
+    "/user/teams": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "user"
+        ],
+        "summary": "List all the teams a user belongs to",
+        "operationId": "userListTeams",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/TeamList"
+          }
+        }
+      }
+    },
     "/user/times": {
       "get": {
         "produces": [
           "type": "string",
           "x-go-name": "Name"
         },
+        "organization": {
+          "$ref": "#/definitions/Organization"
+        },
         "permission": {
           "type": "string",
           "enum": [
index 80a5192d8eedae3af43d5a30ebf5ce9b6168decf..ee6e2b79d50eff5c5326ea0740e4ebd9fea525e5 100644 (file)
@@ -371,6 +371,7 @@ type PushPayload struct {
        After      string           `json:"after"`
        CompareURL string           `json:"compare_url"`
        Commits    []*PayloadCommit `json:"commits"`
+       HeadCommit *PayloadCommit   `json:"head_commit"`
        Repo       *Repository      `json:"repository"`
        Pusher     *User            `json:"pusher"`
        Sender     *User            `json:"sender"`
index f3e98b932e91c55712fd9daf6ffa1815a2f74fe2..9de0a8d0007604aef3a8e3d77237bb85e8f7c0fa 100644 (file)
@@ -7,9 +7,10 @@ package gitea
 
 // Team represents a team in an organization
 type Team struct {
-       ID          int64  `json:"id"`
-       Name        string `json:"name"`
-       Description string `json:"description"`
+       ID           int64         `json:"id"`
+       Name         string        `json:"name"`
+       Description  string        `json:"description"`
+       Organization *Organization `json:"organization"`
        // enum: none,read,write,admin,owner
        Permission string `json:"permission"`
        // enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki
index 396251dcac9d885f9012281119103c784756f1da..3605d2cd4ae0a961139c7b4435ae34b2d607ebe9 100644 (file)
@@ -53,7 +53,7 @@ func (c *Client) GetRelease(user, repo string, id int64) (*Release, error) {
 type CreateReleaseOption struct {
        // required: true
        TagName      string `json:"tag_name" binding:"Required"`
-       Target       string `json:"target_commitish"`
+       Target       string `json:"target_commitish" binding:"Required"`
        Title        string `json:"name"`
        Note         string `json:"body"`
        IsDraft      bool   `json:"draft"`