gitea源码

hooks.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package admin
  4. import (
  5. "errors"
  6. "net/http"
  7. "code.gitea.io/gitea/models/webhook"
  8. "code.gitea.io/gitea/modules/optional"
  9. "code.gitea.io/gitea/modules/setting"
  10. api "code.gitea.io/gitea/modules/structs"
  11. "code.gitea.io/gitea/modules/util"
  12. "code.gitea.io/gitea/modules/web"
  13. "code.gitea.io/gitea/routers/api/v1/utils"
  14. "code.gitea.io/gitea/services/context"
  15. webhook_service "code.gitea.io/gitea/services/webhook"
  16. )
  17. // ListHooks list system's webhooks
  18. func ListHooks(ctx *context.APIContext) {
  19. // swagger:operation GET /admin/hooks admin adminListHooks
  20. // ---
  21. // summary: List system's webhooks
  22. // produces:
  23. // - application/json
  24. // parameters:
  25. // - name: page
  26. // in: query
  27. // description: page number of results to return (1-based)
  28. // type: integer
  29. // - name: limit
  30. // in: query
  31. // description: page size of results
  32. // type: integer
  33. // - type: string
  34. // enum:
  35. // - system
  36. // - default
  37. // - all
  38. // description: system, default or both kinds of webhooks
  39. // name: type
  40. // default: system
  41. // in: query
  42. //
  43. // responses:
  44. // "200":
  45. // "$ref": "#/responses/HookList"
  46. // for compatibility the default value is true
  47. isSystemWebhook := optional.Some(true)
  48. typeValue := ctx.FormString("type")
  49. switch typeValue {
  50. case "default":
  51. isSystemWebhook = optional.Some(false)
  52. case "all":
  53. isSystemWebhook = optional.None[bool]()
  54. }
  55. sysHooks, err := webhook.GetSystemOrDefaultWebhooks(ctx, isSystemWebhook)
  56. if err != nil {
  57. ctx.APIErrorInternal(err)
  58. return
  59. }
  60. hooks := make([]*api.Hook, len(sysHooks))
  61. for i, hook := range sysHooks {
  62. h, err := webhook_service.ToHook(setting.AppURL+"/-/admin", hook)
  63. if err != nil {
  64. ctx.APIErrorInternal(err)
  65. return
  66. }
  67. hooks[i] = h
  68. }
  69. ctx.JSON(http.StatusOK, hooks)
  70. }
  71. // GetHook get an organization's hook by id
  72. func GetHook(ctx *context.APIContext) {
  73. // swagger:operation GET /admin/hooks/{id} admin adminGetHook
  74. // ---
  75. // summary: Get a hook
  76. // produces:
  77. // - application/json
  78. // parameters:
  79. // - name: id
  80. // in: path
  81. // description: id of the hook to get
  82. // type: integer
  83. // format: int64
  84. // required: true
  85. // responses:
  86. // "200":
  87. // "$ref": "#/responses/Hook"
  88. hookID := ctx.PathParamInt64("id")
  89. hook, err := webhook.GetSystemOrDefaultWebhook(ctx, hookID)
  90. if err != nil {
  91. if errors.Is(err, util.ErrNotExist) {
  92. ctx.APIErrorNotFound()
  93. } else {
  94. ctx.APIErrorInternal(err)
  95. }
  96. return
  97. }
  98. h, err := webhook_service.ToHook("/-/admin/", hook)
  99. if err != nil {
  100. ctx.APIErrorInternal(err)
  101. return
  102. }
  103. ctx.JSON(http.StatusOK, h)
  104. }
  105. // CreateHook create a hook for an organization
  106. func CreateHook(ctx *context.APIContext) {
  107. // swagger:operation POST /admin/hooks admin adminCreateHook
  108. // ---
  109. // summary: Create a hook
  110. // consumes:
  111. // - application/json
  112. // produces:
  113. // - application/json
  114. // parameters:
  115. // - name: body
  116. // in: body
  117. // required: true
  118. // schema:
  119. // "$ref": "#/definitions/CreateHookOption"
  120. // responses:
  121. // "201":
  122. // "$ref": "#/responses/Hook"
  123. form := web.GetForm(ctx).(*api.CreateHookOption)
  124. utils.AddSystemHook(ctx, form)
  125. }
  126. // EditHook modify a hook of a repository
  127. func EditHook(ctx *context.APIContext) {
  128. // swagger:operation PATCH /admin/hooks/{id} admin adminEditHook
  129. // ---
  130. // summary: Update a hook
  131. // consumes:
  132. // - application/json
  133. // produces:
  134. // - application/json
  135. // parameters:
  136. // - name: id
  137. // in: path
  138. // description: id of the hook to update
  139. // type: integer
  140. // format: int64
  141. // required: true
  142. // - name: body
  143. // in: body
  144. // schema:
  145. // "$ref": "#/definitions/EditHookOption"
  146. // responses:
  147. // "200":
  148. // "$ref": "#/responses/Hook"
  149. form := web.GetForm(ctx).(*api.EditHookOption)
  150. // TODO in body params
  151. hookID := ctx.PathParamInt64("id")
  152. utils.EditSystemHook(ctx, form, hookID)
  153. }
  154. // DeleteHook delete a system hook
  155. func DeleteHook(ctx *context.APIContext) {
  156. // swagger:operation DELETE /admin/hooks/{id} admin adminDeleteHook
  157. // ---
  158. // summary: Delete a hook
  159. // produces:
  160. // - application/json
  161. // parameters:
  162. // - name: id
  163. // in: path
  164. // description: id of the hook to delete
  165. // type: integer
  166. // format: int64
  167. // required: true
  168. // responses:
  169. // "204":
  170. // "$ref": "#/responses/empty"
  171. hookID := ctx.PathParamInt64("id")
  172. if err := webhook.DeleteDefaultSystemWebhook(ctx, hookID); err != nil {
  173. if errors.Is(err, util.ErrNotExist) {
  174. ctx.APIErrorNotFound()
  175. } else {
  176. ctx.APIErrorInternal(err)
  177. }
  178. return
  179. }
  180. ctx.Status(http.StatusNoContent)
  181. }