Skip to content

Commit 5ac6da3

Browse files
HarshitOnGitHubtechknowlogick
authored andcommitted
api: Add missing GET teams endpoints (#5382)
* 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.
1 parent 734834a commit 5ac6da3

File tree

10 files changed

+160
-12
lines changed

10 files changed

+160
-12
lines changed

Gopkg.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/org.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
522522
}
523523

524524
// Delete member in his/her teams.
525-
teams, err := getUserTeams(sess, org.ID, userID)
525+
teams, err := getUserOrgTeams(sess, org.ID, userID)
526526
if err != nil {
527527
return err
528528
}

models/org_team.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,14 @@ func GetTeamMembers(teamID int64) ([]*User, error) {
543543
return getTeamMembers(x, teamID)
544544
}
545545

546-
func getUserTeams(e Engine, orgID, userID int64) (teams []*Team, err error) {
546+
func getUserTeams(e Engine, userID int64) (teams []*Team, err error) {
547+
return teams, e.
548+
Join("INNER", "team_user", "team_user.team_id = team.id").
549+
Where("team_user.uid=?", userID).
550+
Find(&teams)
551+
}
552+
553+
func getUserOrgTeams(e Engine, orgID, userID int64) (teams []*Team, err error) {
547554
return teams, e.
548555
Join("INNER", "team_user", "team_user.team_id = team.id").
549556
Where("team.org_id = ?", orgID).
@@ -561,9 +568,14 @@ func getUserRepoTeams(e Engine, orgID, userID, repoID int64) (teams []*Team, err
561568
Find(&teams)
562569
}
563570

564-
// GetUserTeams returns all teams that user belongs to in given organization.
565-
func GetUserTeams(orgID, userID int64) ([]*Team, error) {
566-
return getUserTeams(x, orgID, userID)
571+
// GetUserOrgTeams returns all teams that user belongs to in given organization.
572+
func GetUserOrgTeams(orgID, userID int64) ([]*Team, error) {
573+
return getUserOrgTeams(x, orgID, userID)
574+
}
575+
576+
// GetUserTeams returns all teams that user belongs across all organizations.
577+
func GetUserTeams(userID int64) ([]*Team, error) {
578+
return getUserTeams(x, userID)
567579
}
568580

569581
// AddTeamMember adds new membership of given team to given organization,

models/org_team_test.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,23 @@ func TestGetTeamMembers(t *testing.T) {
284284
}
285285

286286
func TestGetUserTeams(t *testing.T) {
287+
assert.NoError(t, PrepareTestDatabase())
288+
test := func(userID int64) {
289+
teams, err := GetUserTeams(userID)
290+
assert.NoError(t, err)
291+
for _, team := range teams {
292+
AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID})
293+
}
294+
}
295+
test(2)
296+
test(5)
297+
test(NonexistentID)
298+
}
299+
300+
func TestGetUserOrgTeams(t *testing.T) {
287301
assert.NoError(t, PrepareTestDatabase())
288302
test := func(orgID, userID int64) {
289-
teams, err := GetUserTeams(orgID, userID)
303+
teams, err := GetUserOrgTeams(orgID, userID)
290304
assert.NoError(t, err)
291305
for _, team := range teams {
292306
assert.EqualValues(t, orgID, team.OrgID)

routers/api/v1/api.go

+3
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,8 @@ func RegisterRoutes(m *macaron.Macaron) {
463463
m.Get("/times", repo.ListMyTrackedTimes)
464464

465465
m.Get("/subscriptions", user.GetMyWatchedRepos)
466+
467+
m.Get("/teams", org.ListUserTeams)
466468
}, reqToken())
467469

468470
// Repositories
@@ -652,6 +654,7 @@ func RegisterRoutes(m *macaron.Macaron) {
652654
m.Group("/members", func() {
653655
m.Get("", org.GetTeamMembers)
654656
m.Combo("/:username").
657+
Get(org.GetTeamMember).
655658
Put(reqOrgOwnership(), org.AddTeamMember).
656659
Delete(reqOrgOwnership(), org.RemoveTeamMember)
657660
})

routers/api/v1/org/team.go

+65
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2016 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
23
// Use of this source code is governed by a MIT-style
34
// license that can be found in the LICENSE file.
45

@@ -42,6 +43,41 @@ func ListTeams(ctx *context.APIContext) {
4243
ctx.JSON(200, apiTeams)
4344
}
4445

46+
// ListUserTeams list all the teams a user belongs to
47+
func ListUserTeams(ctx *context.APIContext) {
48+
// swagger:operation GET /user/teams user userListTeams
49+
// ---
50+
// summary: List all the teams a user belongs to
51+
// produces:
52+
// - application/json
53+
// responses:
54+
// "200":
55+
// "$ref": "#/responses/TeamList"
56+
teams, err := models.GetUserTeams(ctx.User.ID)
57+
if err != nil {
58+
ctx.Error(500, "GetUserTeams", err)
59+
return
60+
}
61+
62+
cache := make(map[int64]*api.Organization)
63+
apiTeams := make([]*api.Team, len(teams))
64+
for i := range teams {
65+
apiOrg, ok := cache[teams[i].OrgID]
66+
if !ok {
67+
org, err := models.GetUserByID(teams[i].OrgID)
68+
if err != nil {
69+
ctx.Error(500, "GetUserByID", err)
70+
return
71+
}
72+
apiOrg = convert.ToOrganization(org)
73+
cache[teams[i].OrgID] = apiOrg
74+
}
75+
apiTeams[i] = convert.ToTeam(teams[i])
76+
apiTeams[i].Organization = apiOrg
77+
}
78+
ctx.JSON(200, apiTeams)
79+
}
80+
4581
// GetTeam api for get a team
4682
func GetTeam(ctx *context.APIContext) {
4783
// swagger:operation GET /teams/{id} organization orgGetTeam
@@ -221,6 +257,35 @@ func GetTeamMembers(ctx *context.APIContext) {
221257
ctx.JSON(200, members)
222258
}
223259

260+
// GetTeamMember api for get a particular member of team
261+
func GetTeamMember(ctx *context.APIContext) {
262+
// swagger:operation GET /teams/{id}/members/{username} organization orgListTeamMember
263+
// ---
264+
// summary: List a particular member of team
265+
// produces:
266+
// - application/json
267+
// parameters:
268+
// - name: id
269+
// in: path
270+
// description: id of the team
271+
// type: integer
272+
// format: int64
273+
// required: true
274+
// - name: username
275+
// in: path
276+
// description: username of the member to list
277+
// type: string
278+
// required: true
279+
// responses:
280+
// "200":
281+
// "$ref": "#/responses/User"
282+
u := user.GetUserByParams(ctx)
283+
if ctx.Written() {
284+
return
285+
}
286+
ctx.JSON(200, u.APIFormat())
287+
}
288+
224289
// AddTeamMember api for add a member to a team
225290
func AddTeamMember(ctx *context.APIContext) {
226291
// swagger:operation PUT /teams/{id}/members/{username} organization orgAddTeamMember

templates/swagger/v1_json.tmpl

+52
Original file line numberDiff line numberDiff line change
@@ -4629,6 +4629,38 @@
46294629
}
46304630
},
46314631
"/teams/{id}/members/{username}": {
4632+
"get": {
4633+
"produces": [
4634+
"application/json"
4635+
],
4636+
"tags": [
4637+
"organization"
4638+
],
4639+
"summary": "List a particular member of team",
4640+
"operationId": "orgListTeamMember",
4641+
"parameters": [
4642+
{
4643+
"type": "integer",
4644+
"format": "int64",
4645+
"description": "id of the team",
4646+
"name": "id",
4647+
"in": "path",
4648+
"required": true
4649+
},
4650+
{
4651+
"type": "string",
4652+
"description": "username of the member to list",
4653+
"name": "username",
4654+
"in": "path",
4655+
"required": true
4656+
}
4657+
],
4658+
"responses": {
4659+
"200": {
4660+
"$ref": "#/responses/User"
4661+
}
4662+
}
4663+
},
46324664
"put": {
46334665
"produces": [
46344666
"application/json"
@@ -5418,6 +5450,23 @@
54185450
}
54195451
}
54205452
},
5453+
"/user/teams": {
5454+
"get": {
5455+
"produces": [
5456+
"application/json"
5457+
],
5458+
"tags": [
5459+
"user"
5460+
],
5461+
"summary": "List all the teams a user belongs to",
5462+
"operationId": "userListTeams",
5463+
"responses": {
5464+
"200": {
5465+
"$ref": "#/responses/TeamList"
5466+
}
5467+
}
5468+
}
5469+
},
54215470
"/user/times": {
54225471
"get": {
54235472
"produces": [
@@ -7942,6 +7991,9 @@
79427991
"type": "string",
79437992
"x-go-name": "Name"
79447993
},
7994+
"organization": {
7995+
"$ref": "#/definitions/Organization"
7996+
},
79457997
"permission": {
79467998
"type": "string",
79477999
"enum": [

vendor/code.gitea.io/sdk/gitea/hook.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/code.gitea.io/sdk/gitea/org_team.go

+4-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/code.gitea.io/sdk/gitea/release.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)