mirror of https://github.com/go-gitea/gitea
parent
78e6b21c1a
commit
c0015979a6
@ -0,0 +1,81 @@ |
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package webhook |
||||
|
||||
import ( |
||||
"context" |
||||
"fmt" |
||||
|
||||
"code.gitea.io/gitea/models/db" |
||||
"code.gitea.io/gitea/modules/util" |
||||
) |
||||
|
||||
// GetDefaultWebhooks returns all admin-default webhooks.
|
||||
func GetDefaultWebhooks(ctx context.Context) ([]*Webhook, error) { |
||||
webhooks := make([]*Webhook, 0, 5) |
||||
return webhooks, db.GetEngine(ctx). |
||||
Where("repo_id=? AND org_id=? AND is_system_webhook=?", 0, 0, false). |
||||
Find(&webhooks) |
||||
} |
||||
|
||||
// GetSystemOrDefaultWebhook returns admin system or default webhook by given ID.
|
||||
func GetSystemOrDefaultWebhook(ctx context.Context, id int64) (*Webhook, error) { |
||||
webhook := &Webhook{ID: id} |
||||
has, err := db.GetEngine(ctx). |
||||
Where("repo_id=? AND org_id=?", 0, 0). |
||||
Get(webhook) |
||||
if err != nil { |
||||
return nil, err |
||||
} else if !has { |
||||
return nil, ErrWebhookNotExist{ID: id} |
||||
} |
||||
return webhook, nil |
||||
} |
||||
|
||||
// GetSystemWebhooks returns all admin system webhooks.
|
||||
func GetSystemWebhooks(ctx context.Context, isActive util.OptionalBool) ([]*Webhook, error) { |
||||
webhooks := make([]*Webhook, 0, 5) |
||||
if isActive.IsNone() { |
||||
return webhooks, db.GetEngine(ctx). |
||||
Where("repo_id=? AND org_id=? AND is_system_webhook=?", 0, 0, true). |
||||
Find(&webhooks) |
||||
} |
||||
return webhooks, db.GetEngine(ctx). |
||||
Where("repo_id=? AND org_id=? AND is_system_webhook=? AND is_active = ?", 0, 0, true, isActive.IsTrue()). |
||||
Find(&webhooks) |
||||
} |
||||
|
||||
// DeleteDefaultSystemWebhook deletes an admin-configured default or system webhook (where Org and Repo ID both 0)
|
||||
func DeleteDefaultSystemWebhook(ctx context.Context, id int64) error { |
||||
return db.WithTx(ctx, func(ctx context.Context) error { |
||||
count, err := db.GetEngine(ctx). |
||||
Where("repo_id=? AND org_id=?", 0, 0). |
||||
Delete(&Webhook{ID: id}) |
||||
if err != nil { |
||||
return err |
||||
} else if count == 0 { |
||||
return ErrWebhookNotExist{ID: id} |
||||
} |
||||
|
||||
_, err = db.DeleteByBean(ctx, &HookTask{HookID: id}) |
||||
return err |
||||
}) |
||||
} |
||||
|
||||
// CopyDefaultWebhooksToRepo creates copies of the default webhooks in a new repo
|
||||
func CopyDefaultWebhooksToRepo(ctx context.Context, repoID int64) error { |
||||
ws, err := GetDefaultWebhooks(ctx) |
||||
if err != nil { |
||||
return fmt.Errorf("GetDefaultWebhooks: %v", err) |
||||
} |
||||
|
||||
for _, w := range ws { |
||||
w.ID = 0 |
||||
w.RepoID = repoID |
||||
if err := CreateWebhook(ctx, w); err != nil { |
||||
return fmt.Errorf("CreateWebhook: %v", err) |
||||
} |
||||
} |
||||
return nil |
||||
} |
@ -0,0 +1,174 @@ |
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package admin |
||||
|
||||
import ( |
||||
"net/http" |
||||
|
||||
"code.gitea.io/gitea/models/webhook" |
||||
"code.gitea.io/gitea/modules/context" |
||||
"code.gitea.io/gitea/modules/setting" |
||||
api "code.gitea.io/gitea/modules/structs" |
||||
"code.gitea.io/gitea/modules/util" |
||||
"code.gitea.io/gitea/modules/web" |
||||
"code.gitea.io/gitea/routers/api/v1/utils" |
||||
webhook_service "code.gitea.io/gitea/services/webhook" |
||||
) |
||||
|
||||
// ListHooks list system's webhooks
|
||||
func ListHooks(ctx *context.APIContext) { |
||||
// swagger:operation GET /admin/hooks admin adminListHooks
|
||||
// ---
|
||||
// summary: List system's webhooks
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: page
|
||||
// in: query
|
||||
// description: page number of results to return (1-based)
|
||||
// type: integer
|
||||
// - name: limit
|
||||
// in: query
|
||||
// description: page size of results
|
||||
// type: integer
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/HookList"
|
||||
|
||||
sysHooks, err := webhook.GetSystemWebhooks(ctx, util.OptionalBoolNone) |
||||
if err != nil { |
||||
ctx.Error(http.StatusInternalServerError, "GetSystemWebhooks", err) |
||||
return |
||||
} |
||||
hooks := make([]*api.Hook, len(sysHooks)) |
||||
for i, hook := range sysHooks { |
||||
h, err := webhook_service.ToHook(setting.AppURL+"/admin", hook) |
||||
if err != nil { |
||||
ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) |
||||
return |
||||
} |
||||
hooks[i] = h |
||||
} |
||||
ctx.JSON(http.StatusOK, hooks) |
||||
} |
||||
|
||||
// GetHook get an organization's hook by id
|
||||
func GetHook(ctx *context.APIContext) { |
||||
// swagger:operation GET /admin/hooks/{id} admin adminGetHook
|
||||
// ---
|
||||
// summary: Get a hook
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: id
|
||||
// in: path
|
||||
// description: id of the hook to get
|
||||
// type: integer
|
||||
// format: int64
|
||||
// required: true
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/Hook"
|
||||
|
||||
hookID := ctx.ParamsInt64(":id") |
||||
hook, err := webhook.GetSystemOrDefaultWebhook(ctx, hookID) |
||||
if err != nil { |
||||
ctx.Error(http.StatusInternalServerError, "GetSystemOrDefaultWebhook", err) |
||||
return |
||||
} |
||||
h, err := webhook_service.ToHook("/admin/", hook) |
||||
if err != nil { |
||||
ctx.Error(http.StatusInternalServerError, "convert.ToHook", err) |
||||
return |
||||
} |
||||
ctx.JSON(http.StatusOK, h) |
||||
} |
||||
|
||||
// CreateHook create a hook for an organization
|
||||
func CreateHook(ctx *context.APIContext) { |
||||
// swagger:operation POST /admin/hooks admin adminCreateHook
|
||||
// ---
|
||||
// summary: Create a hook
|
||||
// consumes:
|
||||
// - application/json
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: body
|
||||
// in: body
|
||||
// required: true
|
||||
// schema:
|
||||
// "$ref": "#/definitions/CreateHookOption"
|
||||
// responses:
|
||||
// "201":
|
||||
// "$ref": "#/responses/Hook"
|
||||
|
||||
form := web.GetForm(ctx).(*api.CreateHookOption) |
||||
// TODO in body params
|
||||
if !utils.CheckCreateHookOption(ctx, form) { |
||||
return |
||||
} |
||||
utils.AddSystemHook(ctx, form) |
||||
} |
||||
|
||||
// EditHook modify a hook of a repository
|
||||
func EditHook(ctx *context.APIContext) { |
||||
// swagger:operation PATCH /admin/hooks/{id} admin adminEditHook
|
||||
// ---
|
||||
// summary: Update a hook
|
||||
// consumes:
|
||||
// - application/json
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: id
|
||||
// in: path
|
||||
// description: id of the hook to update
|
||||
// type: integer
|
||||
// format: int64
|
||||
// required: true
|
||||
// - name: body
|
||||
// in: body
|
||||
// schema:
|
||||
// "$ref": "#/definitions/EditHookOption"
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/Hook"
|
||||
|
||||
form := web.GetForm(ctx).(*api.EditHookOption) |
||||
|
||||
// TODO in body params
|
||||
hookID := ctx.ParamsInt64(":id") |
||||
utils.EditSystemHook(ctx, form, hookID) |
||||
} |
||||
|
||||
// DeleteHook delete a system hook
|
||||
func DeleteHook(ctx *context.APIContext) { |
||||
// swagger:operation DELETE /amdin/hooks/{id} admin adminDeleteHook
|
||||
// ---
|
||||
// summary: Delete a hook
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: id
|
||||
// in: path
|
||||
// description: id of the hook to delete
|
||||
// type: integer
|
||||
// format: int64
|
||||
// required: true
|
||||
// responses:
|
||||
// "204":
|
||||
// "$ref": "#/responses/empty"
|
||||
|
||||
hookID := ctx.ParamsInt64(":id") |
||||
if err := webhook.DeleteDefaultSystemWebhook(ctx, hookID); err != nil { |
||||
if webhook.IsErrWebhookNotExist(err) { |
||||
ctx.NotFound() |
||||
} else { |
||||
ctx.Error(http.StatusInternalServerError, "DeleteDefaultSystemWebhook", err) |
||||
} |
||||
return |
||||
} |
||||
ctx.Status(http.StatusNoContent) |
||||
} |
Loading…
Reference in new issue