From 949a93f08df2b5e78b27c153e2044b5fe9eec5ef Mon Sep 17 00:00:00 2001 From: "Bollmann, Michael" Date: Thu, 9 Jan 2025 09:23:11 +0100 Subject: [PATCH 1/5] Fixed listing system and default webhooks --- models/webhook/webhook_system.go | 13 +++++++++++++ routers/api/v1/admin/hooks.go | 21 ++++++++++++++++++++- templates/swagger/v1_json.tmpl | 12 ++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/models/webhook/webhook_system.go b/models/webhook/webhook_system.go index a2a9ee321ae92..58d9d4a5c1b9d 100644 --- a/models/webhook/webhook_system.go +++ b/models/webhook/webhook_system.go @@ -11,6 +11,19 @@ import ( "code.gitea.io/gitea/modules/optional" ) +// GetSystemOrDefaultWebhooks returns webhooks by given argument or all if argument is missing. +func GetSystemOrDefaultWebhooks(ctx context.Context, isSystemWebhook optional.Option[bool]) ([]*Webhook, error) { + webhooks := make([]*Webhook, 0, 5) + if !isSystemWebhook.Has() { + return webhooks, db.GetEngine(ctx).Where("repo_id=? AND owner_id=?", 0, 0). + Find(&webhooks) + } + + return webhooks, db.GetEngine(ctx). + Where("repo_id=? AND owner_id=? AND is_system_webhook=?", 0, 0, isSystemWebhook.Value()). + Find(&webhooks) +} + // GetDefaultWebhooks returns all admin-default webhooks. func GetDefaultWebhooks(ctx context.Context) ([]*Webhook, error) { webhooks := make([]*Webhook, 0, 5) diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index 6b4689047b5fe..990f1ccf76f71 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -34,11 +34,30 @@ func ListHooks(ctx *context.APIContext) { // 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" - sysHooks, err := webhook.GetSystemWebhooks(ctx, optional.None[bool]()) + //for compatibility the default value is true + isSystemWebhook := optional.Some(true) + typeValue := ctx.FormString("type") + if typeValue == "default" { + isSystemWebhook = optional.Some(false) + } else if typeValue == "all" { + isSystemWebhook = optional.None[bool]() + } + + sysHooks, err := webhook.GetSystemOrDefaultWebhooks(ctx, isSystemWebhook) if err != nil { ctx.Error(http.StatusInternalServerError, "GetSystemWebhooks", err) return diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 82a301da2fe99..ec2123ee2ecdd 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -234,6 +234,18 @@ "description": "page size of results", "name": "limit", "in": "query" + }, + { + "type": "string", + "enum": [ + "system", + "default", + "all" + ], + "description": "system, default or both kinds of webhooks", + "name": "type", + "default": "system", + "in": "query" } ], "responses": { From b55dfd0577b5a475e80db9bba379b816028d695d Mon Sep 17 00:00:00 2001 From: "Bollmann, Michael" Date: Thu, 9 Jan 2025 16:47:26 +0100 Subject: [PATCH 2/5] Fixed linter finding --- routers/api/v1/admin/hooks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index 990f1ccf76f71..c65e141064fca 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -48,7 +48,7 @@ func ListHooks(ctx *context.APIContext) { // "200": // "$ref": "#/responses/HookList" - //for compatibility the default value is true + // for compatibility the default value is true isSystemWebhook := optional.Some(true) typeValue := ctx.FormString("type") if typeValue == "default" { From 517b01f2197bf6f8884cdd090648b554c9f18b87 Mon Sep 17 00:00:00 2001 From: "Bollmann, Michael" Date: Thu, 9 Jan 2025 17:32:37 +0100 Subject: [PATCH 3/5] Fixed spec generation --- routers/api/v1/admin/hooks.go | 16 ++++++++-------- templates/swagger/v1_json.tmpl | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index c65e141064fca..c812ca182d502 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -35,14 +35,14 @@ func ListHooks(ctx *context.APIContext) { // 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 + // enum: + // - system + // - default + // - all + // description: system, default or both kinds of webhooks + // name: type + // default: system + // in: query // // responses: // "200": diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index ec2123ee2ecdd..bbcf6efe42305 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -236,15 +236,15 @@ "in": "query" }, { - "type": "string", "enum": [ "system", "default", "all" ], + "type": "string", + "default": "system", "description": "system, default or both kinds of webhooks", "name": "type", - "default": "system", "in": "query" } ], From 4e24f52759464f0c56486554041a20c0174867eb Mon Sep 17 00:00:00 2001 From: "Bollmann, Michael" Date: Fri, 10 Jan 2025 10:53:23 +0100 Subject: [PATCH 4/5] Added unit test case for GetSystemOrDefaultWebhooks --- models/fixtures/webhook.yml | 20 +++++++++++++++ models/webhook/webhook_system_test.go | 37 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 models/webhook/webhook_system_test.go diff --git a/models/fixtures/webhook.yml b/models/fixtures/webhook.yml index f62bae1f311ce..f4b349013ab05 100644 --- a/models/fixtures/webhook.yml +++ b/models/fixtures/webhook.yml @@ -29,3 +29,23 @@ content_type: 1 # json events: '{"push_only":true,"branch_filter":"{master,feature*}"}' is_active: true + +- + id: 5 + repo_id: 0 + owner_id: 0 + url: www.example.com/url5 + content_type: 1 # json + events: '{"push_only":true,"branch_filter":"{master,feature*}"}' + is_active: true + is_system_webhook: true + +- + id: 6 + repo_id: 0 + owner_id: 0 + url: www.example.com/url6 + content_type: 1 # json + events: '{"push_only":true,"branch_filter":"{master,feature*}"}' + is_active: true + is_system_webhook: false \ No newline at end of file diff --git a/models/webhook/webhook_system_test.go b/models/webhook/webhook_system_test.go new file mode 100644 index 0000000000000..96157ed9c9d37 --- /dev/null +++ b/models/webhook/webhook_system_test.go @@ -0,0 +1,37 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package webhook + +import ( + "testing" + + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/optional" + + "github.com/stretchr/testify/assert" +) + +func TestGetSystemOrDefaultWebhooks(t *testing.T) { + assert.NoError(t, unittest.PrepareTestDatabase()) + + hooks, err := GetSystemOrDefaultWebhooks(db.DefaultContext, optional.None[bool]()) + assert.NoError(t, err) + if assert.Len(t, hooks, 2) { + assert.Equal(t, int64(5), hooks[0].ID) + assert.Equal(t, int64(6), hooks[1].ID) + } + + hooks, err = GetSystemOrDefaultWebhooks(db.DefaultContext, optional.Some(true)) + assert.NoError(t, err) + if assert.Len(t, hooks, 1) { + assert.Equal(t, int64(5), hooks[0].ID) + } + + hooks, err = GetSystemOrDefaultWebhooks(db.DefaultContext, optional.Some(false)) + assert.NoError(t, err) + if assert.Len(t, hooks, 1) { + assert.Equal(t, int64(6), hooks[0].ID) + } +} From b39947af2959c4faef6e326c532c396477149439 Mon Sep 17 00:00:00 2001 From: "Bollmann, Michael" Date: Fri, 10 Jan 2025 10:57:37 +0100 Subject: [PATCH 5/5] Fixed linter findings --- models/fixtures/webhook.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/fixtures/webhook.yml b/models/fixtures/webhook.yml index f4b349013ab05..ebc4062b60ba5 100644 --- a/models/fixtures/webhook.yml +++ b/models/fixtures/webhook.yml @@ -22,6 +22,7 @@ content_type: 1 # json events: '{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}' is_active: true + - id: 4 repo_id: 2 @@ -48,4 +49,4 @@ content_type: 1 # json events: '{"push_only":true,"branch_filter":"{master,feature*}"}' is_active: true - is_system_webhook: false \ No newline at end of file + is_system_webhook: false