mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
205 lines
4.8 KiB
Go
205 lines
4.8 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package admin
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/hanzoai/git/models/webhook"
|
|
"github.com/hanzoai/git/modules/optional"
|
|
"github.com/hanzoai/git/modules/setting"
|
|
api "github.com/hanzoai/git/modules/structs"
|
|
"github.com/hanzoai/git/modules/util"
|
|
"github.com/hanzoai/git/modules/web"
|
|
"github.com/hanzoai/git/routers/api/v1/utils"
|
|
"github.com/hanzoai/git/services/context"
|
|
webhook_service "github.com/hanzoai/git/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
|
|
// - type: string
|
|
// enum:
|
|
// - system
|
|
// - default
|
|
// - all
|
|
// description: system, default or both kinds of webhooks
|
|
// name: type
|
|
// default: system
|
|
// in: query
|
|
//
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/HookList"
|
|
|
|
// for compatibility the default value is true
|
|
isSystemWebhook := optional.Some(true)
|
|
typeValue := ctx.FormString("type")
|
|
switch typeValue {
|
|
case "default":
|
|
isSystemWebhook = optional.Some(false)
|
|
case "all":
|
|
isSystemWebhook = optional.None[bool]()
|
|
}
|
|
listOptions := utils.GetListOptions(ctx)
|
|
opts := &webhook.ListSystemWebhookOptions{
|
|
ListOptions: listOptions,
|
|
IsSystem: isSystemWebhook,
|
|
}
|
|
|
|
sysHooks, total, err := webhook.GetGlobalWebhooks(ctx, opts)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(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.APIErrorInternal(err)
|
|
return
|
|
}
|
|
hooks[i] = h
|
|
}
|
|
ctx.SetLinkHeader(total, listOptions.PageSize)
|
|
ctx.SetTotalCountHeader(total)
|
|
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.PathParamInt64("id")
|
|
hook, err := webhook.GetSystemOrDefaultWebhook(ctx, hookID)
|
|
if err != nil {
|
|
if errors.Is(err, util.ErrNotExist) {
|
|
ctx.APIErrorNotFound()
|
|
} else {
|
|
ctx.APIErrorInternal(err)
|
|
}
|
|
return
|
|
}
|
|
h, err := webhook_service.ToHook("/-/admin/", hook)
|
|
if err != nil {
|
|
ctx.APIErrorInternal(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)
|
|
|
|
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.PathParamInt64("id")
|
|
utils.EditSystemHook(ctx, form, hookID)
|
|
}
|
|
|
|
// DeleteHook delete a system hook
|
|
func DeleteHook(ctx *context.APIContext) {
|
|
// swagger:operation DELETE /admin/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.PathParamInt64("id")
|
|
if err := webhook.DeleteDefaultSystemWebhook(ctx, hookID); err != nil {
|
|
if errors.Is(err, util.ErrNotExist) {
|
|
ctx.APIErrorNotFound()
|
|
} else {
|
|
ctx.APIErrorInternal(err)
|
|
}
|
|
return
|
|
}
|
|
ctx.Status(http.StatusNoContent)
|
|
}
|