You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

team.go 18 kB

API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package org
  6. import (
  7. "net/http"
  8. "strings"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/context"
  11. "code.gitea.io/gitea/modules/convert"
  12. "code.gitea.io/gitea/modules/log"
  13. api "code.gitea.io/gitea/modules/structs"
  14. "code.gitea.io/gitea/routers/api/v1/user"
  15. "code.gitea.io/gitea/routers/api/v1/utils"
  16. )
  17. // ListTeams list all the teams of an organization
  18. func ListTeams(ctx *context.APIContext) {
  19. // swagger:operation GET /orgs/{org}/teams organization orgListTeams
  20. // ---
  21. // summary: List an organization's teams
  22. // produces:
  23. // - application/json
  24. // parameters:
  25. // - name: org
  26. // in: path
  27. // description: name of the organization
  28. // type: string
  29. // required: true
  30. // - name: page
  31. // in: query
  32. // description: page number of results to return (1-based)
  33. // type: integer
  34. // - name: limit
  35. // in: query
  36. // description: page size of results, maximum page size is 50
  37. // type: integer
  38. // responses:
  39. // "200":
  40. // "$ref": "#/responses/TeamList"
  41. org := ctx.Org.Organization
  42. if err := org.GetTeams(&models.SearchTeamOptions{
  43. ListOptions: utils.GetListOptions(ctx),
  44. }); err != nil {
  45. ctx.Error(http.StatusInternalServerError, "GetTeams", err)
  46. return
  47. }
  48. apiTeams := make([]*api.Team, len(org.Teams))
  49. for i := range org.Teams {
  50. if err := org.Teams[i].GetUnits(); err != nil {
  51. ctx.Error(http.StatusInternalServerError, "GetUnits", err)
  52. return
  53. }
  54. apiTeams[i] = convert.ToTeam(org.Teams[i])
  55. }
  56. ctx.JSON(http.StatusOK, apiTeams)
  57. }
  58. // ListUserTeams list all the teams a user belongs to
  59. func ListUserTeams(ctx *context.APIContext) {
  60. // swagger:operation GET /user/teams user userListTeams
  61. // ---
  62. // summary: List all the teams a user belongs to
  63. // produces:
  64. // - application/json
  65. // parameters:
  66. // - name: page
  67. // in: query
  68. // description: page number of results to return (1-based)
  69. // type: integer
  70. // - name: limit
  71. // in: query
  72. // description: page size of results, maximum page size is 50
  73. // type: integer
  74. // responses:
  75. // "200":
  76. // "$ref": "#/responses/TeamList"
  77. teams, err := models.GetUserTeams(ctx.User.ID, utils.GetListOptions(ctx))
  78. if err != nil {
  79. ctx.Error(http.StatusInternalServerError, "GetUserTeams", err)
  80. return
  81. }
  82. cache := make(map[int64]*api.Organization)
  83. apiTeams := make([]*api.Team, len(teams))
  84. for i := range teams {
  85. apiOrg, ok := cache[teams[i].OrgID]
  86. if !ok {
  87. org, err := models.GetUserByID(teams[i].OrgID)
  88. if err != nil {
  89. ctx.Error(http.StatusInternalServerError, "GetUserByID", err)
  90. return
  91. }
  92. apiOrg = convert.ToOrganization(org)
  93. cache[teams[i].OrgID] = apiOrg
  94. }
  95. apiTeams[i] = convert.ToTeam(teams[i])
  96. apiTeams[i].Organization = apiOrg
  97. }
  98. ctx.JSON(http.StatusOK, apiTeams)
  99. }
  100. // GetTeam api for get a team
  101. func GetTeam(ctx *context.APIContext) {
  102. // swagger:operation GET /teams/{id} organization orgGetTeam
  103. // ---
  104. // summary: Get a team
  105. // produces:
  106. // - application/json
  107. // parameters:
  108. // - name: id
  109. // in: path
  110. // description: id of the team to get
  111. // type: integer
  112. // format: int64
  113. // required: true
  114. // responses:
  115. // "200":
  116. // "$ref": "#/responses/Team"
  117. ctx.JSON(http.StatusOK, convert.ToTeam(ctx.Org.Team))
  118. }
  119. // CreateTeam api for create a team
  120. func CreateTeam(ctx *context.APIContext, form api.CreateTeamOption) {
  121. // swagger:operation POST /orgs/{org}/teams organization orgCreateTeam
  122. // ---
  123. // summary: Create a team
  124. // consumes:
  125. // - application/json
  126. // produces:
  127. // - application/json
  128. // parameters:
  129. // - name: org
  130. // in: path
  131. // description: name of the organization
  132. // type: string
  133. // required: true
  134. // - name: body
  135. // in: body
  136. // schema:
  137. // "$ref": "#/definitions/CreateTeamOption"
  138. // responses:
  139. // "201":
  140. // "$ref": "#/responses/Team"
  141. // "422":
  142. // "$ref": "#/responses/validationError"
  143. team := &models.Team{
  144. OrgID: ctx.Org.Organization.ID,
  145. Name: form.Name,
  146. Description: form.Description,
  147. IncludesAllRepositories: form.IncludesAllRepositories,
  148. CanCreateOrgRepo: form.CanCreateOrgRepo,
  149. Authorize: models.ParseAccessMode(form.Permission),
  150. }
  151. unitTypes := models.FindUnitTypes(form.Units...)
  152. if team.Authorize < models.AccessModeOwner {
  153. var units = make([]*models.TeamUnit, 0, len(form.Units))
  154. for _, tp := range unitTypes {
  155. units = append(units, &models.TeamUnit{
  156. OrgID: ctx.Org.Organization.ID,
  157. Type: tp,
  158. })
  159. }
  160. team.Units = units
  161. }
  162. if err := models.NewTeam(team); err != nil {
  163. if models.IsErrTeamAlreadyExist(err) {
  164. ctx.Error(http.StatusUnprocessableEntity, "", err)
  165. } else {
  166. ctx.Error(http.StatusInternalServerError, "NewTeam", err)
  167. }
  168. return
  169. }
  170. ctx.JSON(http.StatusCreated, convert.ToTeam(team))
  171. }
  172. // EditTeam api for edit a team
  173. func EditTeam(ctx *context.APIContext, form api.EditTeamOption) {
  174. // swagger:operation PATCH /teams/{id} organization orgEditTeam
  175. // ---
  176. // summary: Edit a team
  177. // consumes:
  178. // - application/json
  179. // produces:
  180. // - application/json
  181. // parameters:
  182. // - name: id
  183. // in: path
  184. // description: id of the team to edit
  185. // type: integer
  186. // required: true
  187. // - name: body
  188. // in: body
  189. // schema:
  190. // "$ref": "#/definitions/EditTeamOption"
  191. // responses:
  192. // "200":
  193. // "$ref": "#/responses/Team"
  194. team := ctx.Org.Team
  195. if err := team.GetUnits(); err != nil {
  196. ctx.InternalServerError(err)
  197. return
  198. }
  199. if form.CanCreateOrgRepo != nil {
  200. team.CanCreateOrgRepo = *form.CanCreateOrgRepo
  201. }
  202. if len(form.Name) > 0 {
  203. team.Name = form.Name
  204. }
  205. if form.Description != nil {
  206. team.Description = *form.Description
  207. }
  208. isAuthChanged := false
  209. isIncludeAllChanged := false
  210. if !team.IsOwnerTeam() && len(form.Permission) != 0 {
  211. // Validate permission level.
  212. auth := models.ParseAccessMode(form.Permission)
  213. if team.Authorize != auth {
  214. isAuthChanged = true
  215. team.Authorize = auth
  216. }
  217. if form.IncludesAllRepositories != nil {
  218. isIncludeAllChanged = true
  219. team.IncludesAllRepositories = *form.IncludesAllRepositories
  220. }
  221. }
  222. if team.Authorize < models.AccessModeOwner {
  223. if len(form.Units) > 0 {
  224. var units = make([]*models.TeamUnit, 0, len(form.Units))
  225. unitTypes := models.FindUnitTypes(form.Units...)
  226. for _, tp := range unitTypes {
  227. units = append(units, &models.TeamUnit{
  228. OrgID: ctx.Org.Team.OrgID,
  229. Type: tp,
  230. })
  231. }
  232. team.Units = units
  233. }
  234. }
  235. if err := models.UpdateTeam(team, isAuthChanged, isIncludeAllChanged); err != nil {
  236. ctx.Error(http.StatusInternalServerError, "EditTeam", err)
  237. return
  238. }
  239. ctx.JSON(http.StatusOK, convert.ToTeam(team))
  240. }
  241. // DeleteTeam api for delete a team
  242. func DeleteTeam(ctx *context.APIContext) {
  243. // swagger:operation DELETE /teams/{id} organization orgDeleteTeam
  244. // ---
  245. // summary: Delete a team
  246. // parameters:
  247. // - name: id
  248. // in: path
  249. // description: id of the team to delete
  250. // type: integer
  251. // format: int64
  252. // required: true
  253. // responses:
  254. // "204":
  255. // description: team deleted
  256. if err := models.DeleteTeam(ctx.Org.Team); err != nil {
  257. ctx.Error(http.StatusInternalServerError, "DeleteTeam", err)
  258. return
  259. }
  260. ctx.Status(http.StatusNoContent)
  261. }
  262. // GetTeamMembers api for get a team's members
  263. func GetTeamMembers(ctx *context.APIContext) {
  264. // swagger:operation GET /teams/{id}/members organization orgListTeamMembers
  265. // ---
  266. // summary: List a team's members
  267. // produces:
  268. // - application/json
  269. // parameters:
  270. // - name: id
  271. // in: path
  272. // description: id of the team
  273. // type: integer
  274. // format: int64
  275. // required: true
  276. // - name: page
  277. // in: query
  278. // description: page number of results to return (1-based)
  279. // type: integer
  280. // - name: limit
  281. // in: query
  282. // description: page size of results, maximum page size is 50
  283. // type: integer
  284. // responses:
  285. // "200":
  286. // "$ref": "#/responses/UserList"
  287. isMember, err := models.IsOrganizationMember(ctx.Org.Team.OrgID, ctx.User.ID)
  288. if err != nil {
  289. ctx.Error(http.StatusInternalServerError, "IsOrganizationMember", err)
  290. return
  291. } else if !isMember && !ctx.User.IsAdmin {
  292. ctx.NotFound()
  293. return
  294. }
  295. team := ctx.Org.Team
  296. if err := team.GetMembers(&models.SearchMembersOptions{
  297. ListOptions: utils.GetListOptions(ctx),
  298. }); err != nil {
  299. ctx.Error(http.StatusInternalServerError, "GetTeamMembers", err)
  300. return
  301. }
  302. members := make([]*api.User, len(team.Members))
  303. for i, member := range team.Members {
  304. members[i] = convert.ToUser(member, ctx.IsSigned, ctx.User.IsAdmin)
  305. }
  306. ctx.JSON(http.StatusOK, members)
  307. }
  308. // GetTeamMember api for get a particular member of team
  309. func GetTeamMember(ctx *context.APIContext) {
  310. // swagger:operation GET /teams/{id}/members/{username} organization orgListTeamMember
  311. // ---
  312. // summary: List a particular member of team
  313. // produces:
  314. // - application/json
  315. // parameters:
  316. // - name: id
  317. // in: path
  318. // description: id of the team
  319. // type: integer
  320. // format: int64
  321. // required: true
  322. // - name: username
  323. // in: path
  324. // description: username of the member to list
  325. // type: string
  326. // required: true
  327. // responses:
  328. // "200":
  329. // "$ref": "#/responses/User"
  330. // "404":
  331. // "$ref": "#/responses/notFound"
  332. u := user.GetUserByParams(ctx)
  333. if ctx.Written() {
  334. return
  335. }
  336. teamID := ctx.ParamsInt64("teamid")
  337. isTeamMember, err := models.IsUserInTeams(u.ID, []int64{teamID})
  338. if err != nil {
  339. ctx.Error(http.StatusInternalServerError, "IsUserInTeams", err)
  340. return
  341. } else if !isTeamMember {
  342. ctx.NotFound()
  343. return
  344. }
  345. ctx.JSON(http.StatusOK, convert.ToUser(u, ctx.IsSigned, ctx.User.IsAdmin))
  346. }
  347. // AddTeamMember api for add a member to a team
  348. func AddTeamMember(ctx *context.APIContext) {
  349. // swagger:operation PUT /teams/{id}/members/{username} organization orgAddTeamMember
  350. // ---
  351. // summary: Add a team member
  352. // produces:
  353. // - application/json
  354. // parameters:
  355. // - name: id
  356. // in: path
  357. // description: id of the team
  358. // type: integer
  359. // format: int64
  360. // required: true
  361. // - name: username
  362. // in: path
  363. // description: username of the user to add
  364. // type: string
  365. // required: true
  366. // responses:
  367. // "204":
  368. // "$ref": "#/responses/empty"
  369. // "404":
  370. // "$ref": "#/responses/notFound"
  371. u := user.GetUserByParams(ctx)
  372. if ctx.Written() {
  373. return
  374. }
  375. if err := ctx.Org.Team.AddMember(u.ID); err != nil {
  376. ctx.Error(http.StatusInternalServerError, "AddMember", err)
  377. return
  378. }
  379. ctx.Status(http.StatusNoContent)
  380. }
  381. // RemoveTeamMember api for remove one member from a team
  382. func RemoveTeamMember(ctx *context.APIContext) {
  383. // swagger:operation DELETE /teams/{id}/members/{username} organization orgRemoveTeamMember
  384. // ---
  385. // summary: Remove a team member
  386. // produces:
  387. // - application/json
  388. // parameters:
  389. // - name: id
  390. // in: path
  391. // description: id of the team
  392. // type: integer
  393. // format: int64
  394. // required: true
  395. // - name: username
  396. // in: path
  397. // description: username of the user to remove
  398. // type: string
  399. // required: true
  400. // responses:
  401. // "204":
  402. // "$ref": "#/responses/empty"
  403. // "404":
  404. // "$ref": "#/responses/notFound"
  405. u := user.GetUserByParams(ctx)
  406. if ctx.Written() {
  407. return
  408. }
  409. if err := ctx.Org.Team.RemoveMember(u.ID); err != nil {
  410. ctx.Error(http.StatusInternalServerError, "RemoveMember", err)
  411. return
  412. }
  413. ctx.Status(http.StatusNoContent)
  414. }
  415. // GetTeamRepos api for get a team's repos
  416. func GetTeamRepos(ctx *context.APIContext) {
  417. // swagger:operation GET /teams/{id}/repos organization orgListTeamRepos
  418. // ---
  419. // summary: List a team's repos
  420. // produces:
  421. // - application/json
  422. // parameters:
  423. // - name: id
  424. // in: path
  425. // description: id of the team
  426. // type: integer
  427. // format: int64
  428. // required: true
  429. // - name: page
  430. // in: query
  431. // description: page number of results to return (1-based)
  432. // type: integer
  433. // - name: limit
  434. // in: query
  435. // description: page size of results, maximum page size is 50
  436. // type: integer
  437. // responses:
  438. // "200":
  439. // "$ref": "#/responses/RepositoryList"
  440. team := ctx.Org.Team
  441. if err := team.GetRepositories(&models.SearchTeamOptions{
  442. ListOptions: utils.GetListOptions(ctx),
  443. }); err != nil {
  444. ctx.Error(http.StatusInternalServerError, "GetTeamRepos", err)
  445. }
  446. repos := make([]*api.Repository, len(team.Repos))
  447. for i, repo := range team.Repos {
  448. access, err := models.AccessLevel(ctx.User, repo)
  449. if err != nil {
  450. ctx.Error(http.StatusInternalServerError, "GetTeamRepos", err)
  451. return
  452. }
  453. repos[i] = repo.APIFormat(access)
  454. }
  455. ctx.JSON(http.StatusOK, repos)
  456. }
  457. // getRepositoryByParams get repository by a team's organization ID and repo name
  458. func getRepositoryByParams(ctx *context.APIContext) *models.Repository {
  459. repo, err := models.GetRepositoryByName(ctx.Org.Team.OrgID, ctx.Params(":reponame"))
  460. if err != nil {
  461. if models.IsErrRepoNotExist(err) {
  462. ctx.NotFound()
  463. } else {
  464. ctx.Error(http.StatusInternalServerError, "GetRepositoryByName", err)
  465. }
  466. return nil
  467. }
  468. return repo
  469. }
  470. // AddTeamRepository api for adding a repository to a team
  471. func AddTeamRepository(ctx *context.APIContext) {
  472. // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamRepository
  473. // ---
  474. // summary: Add a repository to a team
  475. // produces:
  476. // - application/json
  477. // parameters:
  478. // - name: id
  479. // in: path
  480. // description: id of the team
  481. // type: integer
  482. // format: int64
  483. // required: true
  484. // - name: org
  485. // in: path
  486. // description: organization that owns the repo to add
  487. // type: string
  488. // required: true
  489. // - name: repo
  490. // in: path
  491. // description: name of the repo to add
  492. // type: string
  493. // required: true
  494. // responses:
  495. // "204":
  496. // "$ref": "#/responses/empty"
  497. // "403":
  498. // "$ref": "#/responses/forbidden"
  499. repo := getRepositoryByParams(ctx)
  500. if ctx.Written() {
  501. return
  502. }
  503. if access, err := models.AccessLevel(ctx.User, repo); err != nil {
  504. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  505. return
  506. } else if access < models.AccessModeAdmin {
  507. ctx.Error(http.StatusForbidden, "", "Must have admin-level access to the repository")
  508. return
  509. }
  510. if err := ctx.Org.Team.AddRepository(repo); err != nil {
  511. ctx.Error(http.StatusInternalServerError, "AddRepository", err)
  512. return
  513. }
  514. ctx.Status(http.StatusNoContent)
  515. }
  516. // RemoveTeamRepository api for removing a repository from a team
  517. func RemoveTeamRepository(ctx *context.APIContext) {
  518. // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgRemoveTeamRepository
  519. // ---
  520. // summary: Remove a repository from a team
  521. // description: This does not delete the repository, it only removes the
  522. // repository from the team.
  523. // produces:
  524. // - application/json
  525. // parameters:
  526. // - name: id
  527. // in: path
  528. // description: id of the team
  529. // type: integer
  530. // format: int64
  531. // required: true
  532. // - name: org
  533. // in: path
  534. // description: organization that owns the repo to remove
  535. // type: string
  536. // required: true
  537. // - name: repo
  538. // in: path
  539. // description: name of the repo to remove
  540. // type: string
  541. // required: true
  542. // responses:
  543. // "204":
  544. // "$ref": "#/responses/empty"
  545. // "403":
  546. // "$ref": "#/responses/forbidden"
  547. repo := getRepositoryByParams(ctx)
  548. if ctx.Written() {
  549. return
  550. }
  551. if access, err := models.AccessLevel(ctx.User, repo); err != nil {
  552. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  553. return
  554. } else if access < models.AccessModeAdmin {
  555. ctx.Error(http.StatusForbidden, "", "Must have admin-level access to the repository")
  556. return
  557. }
  558. if err := ctx.Org.Team.RemoveRepository(repo.ID); err != nil {
  559. ctx.Error(http.StatusInternalServerError, "RemoveRepository", err)
  560. return
  561. }
  562. ctx.Status(http.StatusNoContent)
  563. }
  564. // SearchTeam api for searching teams
  565. func SearchTeam(ctx *context.APIContext) {
  566. // swagger:operation GET /orgs/{org}/teams/search organization teamSearch
  567. // ---
  568. // summary: Search for teams within an organization
  569. // produces:
  570. // - application/json
  571. // parameters:
  572. // - name: org
  573. // in: path
  574. // description: name of the organization
  575. // type: string
  576. // required: true
  577. // - name: q
  578. // in: query
  579. // description: keywords to search
  580. // type: string
  581. // - name: include_desc
  582. // in: query
  583. // description: include search within team description (defaults to true)
  584. // type: boolean
  585. // - name: page
  586. // in: query
  587. // description: page number of results to return (1-based)
  588. // type: integer
  589. // - name: limit
  590. // in: query
  591. // description: page size of results, maximum page size is 50
  592. // type: integer
  593. // responses:
  594. // "200":
  595. // description: "SearchResults of a successful search"
  596. // schema:
  597. // type: object
  598. // properties:
  599. // ok:
  600. // type: boolean
  601. // data:
  602. // type: array
  603. // items:
  604. // "$ref": "#/definitions/Team"
  605. opts := &models.SearchTeamOptions{
  606. UserID: ctx.User.ID,
  607. Keyword: strings.TrimSpace(ctx.Query("q")),
  608. OrgID: ctx.Org.Organization.ID,
  609. IncludeDesc: (ctx.Query("include_desc") == "" || ctx.QueryBool("include_desc")),
  610. ListOptions: utils.GetListOptions(ctx),
  611. }
  612. teams, _, err := models.SearchTeam(opts)
  613. if err != nil {
  614. log.Error("SearchTeam failed: %v", err)
  615. ctx.JSON(http.StatusInternalServerError, map[string]interface{}{
  616. "ok": false,
  617. "error": "SearchTeam internal failure",
  618. })
  619. return
  620. }
  621. apiTeams := make([]*api.Team, len(teams))
  622. for i := range teams {
  623. if err := teams[i].GetUnits(); err != nil {
  624. log.Error("Team GetUnits failed: %v", err)
  625. ctx.JSON(http.StatusInternalServerError, map[string]interface{}{
  626. "ok": false,
  627. "error": "SearchTeam failed to get units",
  628. })
  629. return
  630. }
  631. apiTeams[i] = convert.ToTeam(teams[i])
  632. }
  633. ctx.JSON(http.StatusOK, map[string]interface{}{
  634. "ok": true,
  635. "data": apiTeams,
  636. })
  637. }