Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package org
  5. import (
  6. api "code.gitea.io/sdk/gitea"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/routers/api/v1/convert"
  10. "code.gitea.io/gitea/routers/api/v1/user"
  11. )
  12. // ListTeams list all the teams of an organization
  13. func ListTeams(ctx *context.APIContext) {
  14. // swagger:operation GET /orgs/{org}/teams organization orgListTeams
  15. // ---
  16. // summary: List an organization's teams
  17. // produces:
  18. // - application/json
  19. // parameters:
  20. // - name: org
  21. // in: path
  22. // description: name of the organization
  23. // type: string
  24. // required: true
  25. // responses:
  26. // "200":
  27. // "$ref": "#/responses/TeamList"
  28. org := ctx.Org.Organization
  29. if err := org.GetTeams(); err != nil {
  30. ctx.Error(500, "GetTeams", err)
  31. return
  32. }
  33. apiTeams := make([]*api.Team, len(org.Teams))
  34. for i := range org.Teams {
  35. apiTeams[i] = convert.ToTeam(org.Teams[i])
  36. }
  37. ctx.JSON(200, apiTeams)
  38. }
  39. // GetTeam api for get a team
  40. func GetTeam(ctx *context.APIContext) {
  41. // swagger:operation GET /teams/{id} organization orgGetTeam
  42. // ---
  43. // summary: Get a team
  44. // produces:
  45. // - application/json
  46. // parameters:
  47. // - name: id
  48. // in: path
  49. // description: id of the team to get
  50. // type: integer
  51. // format: int64
  52. // required: true
  53. // responses:
  54. // "200":
  55. // "$ref": "#/responses/Team"
  56. ctx.JSON(200, convert.ToTeam(ctx.Org.Team))
  57. }
  58. // CreateTeam api for create a team
  59. func CreateTeam(ctx *context.APIContext, form api.CreateTeamOption) {
  60. // swagger:operation POST /orgs/{org}/teams organization orgCreateTeam
  61. // ---
  62. // summary: Create a team
  63. // consumes:
  64. // - application/json
  65. // produces:
  66. // - application/json
  67. // parameters:
  68. // - name: org
  69. // in: path
  70. // description: name of the organization
  71. // type: string
  72. // required: true
  73. // - name: body
  74. // in: body
  75. // schema:
  76. // "$ref": "#/definitions/CreateTeamOption"
  77. // responses:
  78. // "201":
  79. // "$ref": "#/responses/Team"
  80. team := &models.Team{
  81. OrgID: ctx.Org.Organization.ID,
  82. Name: form.Name,
  83. Description: form.Description,
  84. Authorize: models.ParseAccessMode(form.Permission),
  85. }
  86. if err := models.NewTeam(team); err != nil {
  87. if models.IsErrTeamAlreadyExist(err) {
  88. ctx.Error(422, "", err)
  89. } else {
  90. ctx.Error(500, "NewTeam", err)
  91. }
  92. return
  93. }
  94. ctx.JSON(201, convert.ToTeam(team))
  95. }
  96. // EditTeam api for edit a team
  97. func EditTeam(ctx *context.APIContext, form api.EditTeamOption) {
  98. // swagger:operation PATCH /teams/{id} organization orgEditTeam
  99. // ---
  100. // summary: Edit a team
  101. // consumes:
  102. // - application/json
  103. // produces:
  104. // - application/json
  105. // parameters:
  106. // - name: id
  107. // in: path
  108. // description: id of the team to edit
  109. // type: integer
  110. // required: true
  111. // - name: body
  112. // in: body
  113. // schema:
  114. // "$ref": "#/definitions/EditTeamOption"
  115. // responses:
  116. // "200":
  117. // "$ref": "#/responses/Team"
  118. team := ctx.Org.Team
  119. team.Name = form.Name
  120. team.Description = form.Description
  121. team.Authorize = models.ParseAccessMode(form.Permission)
  122. if err := models.UpdateTeam(team, true); err != nil {
  123. ctx.Error(500, "EditTeam", err)
  124. return
  125. }
  126. ctx.JSON(200, convert.ToTeam(team))
  127. }
  128. // DeleteTeam api for delete a team
  129. func DeleteTeam(ctx *context.APIContext) {
  130. // swagger:operation DELETE /teams/{id} organization orgDeleteTeam
  131. // ---
  132. // summary: Delete a team
  133. // parameters:
  134. // - name: id
  135. // in: path
  136. // description: id of the team to delete
  137. // type: integer
  138. // format: int64
  139. // required: true
  140. // responses:
  141. // "204":
  142. // description: team deleted
  143. if err := models.DeleteTeam(ctx.Org.Team); err != nil {
  144. ctx.Error(500, "DeleteTeam", err)
  145. return
  146. }
  147. ctx.Status(204)
  148. }
  149. // GetTeamMembers api for get a team's members
  150. func GetTeamMembers(ctx *context.APIContext) {
  151. // swagger:operation GET /teams/{id}/members organization orgListTeamMembers
  152. // ---
  153. // summary: List a team's members
  154. // produces:
  155. // - application/json
  156. // parameters:
  157. // - name: id
  158. // in: path
  159. // description: id of the team
  160. // type: integer
  161. // format: int64
  162. // required: true
  163. // responses:
  164. // "200":
  165. // "$ref": "#/responses/UserList"
  166. isMember, err := models.IsOrganizationMember(ctx.Org.Team.OrgID, ctx.User.ID)
  167. if err != nil {
  168. ctx.Error(500, "IsOrganizationMember", err)
  169. return
  170. } else if !isMember {
  171. ctx.Status(404)
  172. return
  173. }
  174. team := ctx.Org.Team
  175. if err := team.GetMembers(); err != nil {
  176. ctx.Error(500, "GetTeamMembers", err)
  177. return
  178. }
  179. members := make([]*api.User, len(team.Members))
  180. for i, member := range team.Members {
  181. members[i] = member.APIFormat()
  182. }
  183. ctx.JSON(200, members)
  184. }
  185. // AddTeamMember api for add a member to a team
  186. func AddTeamMember(ctx *context.APIContext) {
  187. // swagger:operation PUT /teams/{id}/members/{username} organization orgAddTeamMember
  188. // ---
  189. // summary: Add a team member
  190. // produces:
  191. // - application/json
  192. // parameters:
  193. // - name: id
  194. // in: path
  195. // description: id of the team
  196. // type: integer
  197. // format: int64
  198. // required: true
  199. // - name: username
  200. // in: path
  201. // description: username of the user to add
  202. // type: string
  203. // required: true
  204. // responses:
  205. // "204":
  206. // "$ref": "#/responses/empty"
  207. u := user.GetUserByParams(ctx)
  208. if ctx.Written() {
  209. return
  210. }
  211. if err := ctx.Org.Team.AddMember(u.ID); err != nil {
  212. ctx.Error(500, "AddMember", err)
  213. return
  214. }
  215. ctx.Status(204)
  216. }
  217. // RemoveTeamMember api for remove one member from a team
  218. func RemoveTeamMember(ctx *context.APIContext) {
  219. // swagger:operation DELETE /teams/{id}/members/{username} organization orgRemoveTeamMember
  220. // ---
  221. // summary: Remove a team member
  222. // produces:
  223. // - application/json
  224. // parameters:
  225. // - name: id
  226. // in: path
  227. // description: id of the team
  228. // type: integer
  229. // format: int64
  230. // required: true
  231. // - name: username
  232. // in: path
  233. // description: username of the user to remove
  234. // type: string
  235. // required: true
  236. // responses:
  237. // "204":
  238. // "$ref": "#/responses/empty"
  239. u := user.GetUserByParams(ctx)
  240. if ctx.Written() {
  241. return
  242. }
  243. if err := ctx.Org.Team.RemoveMember(u.ID); err != nil {
  244. ctx.Error(500, "RemoveMember", err)
  245. return
  246. }
  247. ctx.Status(204)
  248. }
  249. // GetTeamRepos api for get a team's repos
  250. func GetTeamRepos(ctx *context.APIContext) {
  251. // swagger:operation GET /teams/{id}/repos organization orgListTeamRepos
  252. // ---
  253. // summary: List a team's repos
  254. // produces:
  255. // - application/json
  256. // parameters:
  257. // - name: id
  258. // in: path
  259. // description: id of the team
  260. // type: integer
  261. // format: int64
  262. // required: true
  263. // responses:
  264. // "200":
  265. // "$ref": "#/responses/RepositoryList"
  266. team := ctx.Org.Team
  267. if err := team.GetRepositories(); err != nil {
  268. ctx.Error(500, "GetTeamRepos", err)
  269. }
  270. repos := make([]*api.Repository, len(team.Repos))
  271. for i, repo := range team.Repos {
  272. access, err := models.AccessLevel(ctx.User.ID, repo)
  273. if err != nil {
  274. ctx.Error(500, "GetTeamRepos", err)
  275. return
  276. }
  277. repos[i] = repo.APIFormat(access)
  278. }
  279. ctx.JSON(200, repos)
  280. }
  281. // getRepositoryByParams get repository by a team's organization ID and repo name
  282. func getRepositoryByParams(ctx *context.APIContext) *models.Repository {
  283. repo, err := models.GetRepositoryByName(ctx.Org.Team.OrgID, ctx.Params(":reponame"))
  284. if err != nil {
  285. if models.IsErrRepoNotExist(err) {
  286. ctx.Status(404)
  287. } else {
  288. ctx.Error(500, "GetRepositoryByName", err)
  289. }
  290. return nil
  291. }
  292. return repo
  293. }
  294. // AddTeamRepository api for adding a repository to a team
  295. func AddTeamRepository(ctx *context.APIContext) {
  296. // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamRepository
  297. // ---
  298. // summary: Add a repository to a team
  299. // produces:
  300. // - application/json
  301. // parameters:
  302. // - name: id
  303. // in: path
  304. // description: id of the team
  305. // type: integer
  306. // format: int64
  307. // required: true
  308. // - name: org
  309. // in: path
  310. // description: organization that owns the repo to add
  311. // type: string
  312. // required: true
  313. // - name: repo
  314. // in: path
  315. // description: name of the repo to add
  316. // type: string
  317. // required: true
  318. // responses:
  319. // "204":
  320. // "$ref": "#/responses/empty"
  321. repo := getRepositoryByParams(ctx)
  322. if ctx.Written() {
  323. return
  324. }
  325. if access, err := models.AccessLevel(ctx.User.ID, repo); err != nil {
  326. ctx.Error(500, "AccessLevel", err)
  327. return
  328. } else if access < models.AccessModeAdmin {
  329. ctx.Error(403, "", "Must have admin-level access to the repository")
  330. return
  331. }
  332. if err := ctx.Org.Team.AddRepository(repo); err != nil {
  333. ctx.Error(500, "AddRepository", err)
  334. return
  335. }
  336. ctx.Status(204)
  337. }
  338. // RemoveTeamRepository api for removing a repository from a team
  339. func RemoveTeamRepository(ctx *context.APIContext) {
  340. // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgRemoveTeamRepository
  341. // ---
  342. // summary: Remove a repository from a team
  343. // description: This does not delete the repository, it only removes the
  344. // repository from the team.
  345. // produces:
  346. // - application/json
  347. // parameters:
  348. // - name: id
  349. // in: path
  350. // description: id of the team
  351. // type: integer
  352. // format: int64
  353. // required: true
  354. // - name: org
  355. // in: path
  356. // description: organization that owns the repo to remove
  357. // type: string
  358. // required: true
  359. // - name: repo
  360. // in: path
  361. // description: name of the repo to remove
  362. // type: string
  363. // required: true
  364. // responses:
  365. // "204":
  366. // "$ref": "#/responses/empty"
  367. repo := getRepositoryByParams(ctx)
  368. if ctx.Written() {
  369. return
  370. }
  371. if access, err := models.AccessLevel(ctx.User.ID, repo); err != nil {
  372. ctx.Error(500, "AccessLevel", err)
  373. return
  374. } else if access < models.AccessModeAdmin {
  375. ctx.Error(403, "", "Must have admin-level access to the repository")
  376. return
  377. }
  378. if err := ctx.Org.Team.RemoveRepository(repo.ID); err != nil {
  379. ctx.Error(500, "RemoveRepository", err)
  380. return
  381. }
  382. ctx.Status(204)
  383. }