diff --git a/docs/docs.go b/docs/docs.go index c5339922..1b758a10 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -5356,7 +5356,7 @@ const docTemplate = `{ "type": "boolean" }, "Type": { - "description": "类型:string, text, number", + "description": "类型:string, text, number, boolean", "type": "string" } } diff --git a/docs/swagger.json b/docs/swagger.json index 0919451a..70f4a70e 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -5349,7 +5349,7 @@ "type": "boolean" }, "Type": { - "description": "类型:string, text, number", + "description": "类型:string, text, number, boolean", "type": "string" } } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index ff58a143..68dcc41a 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -764,7 +764,7 @@ definitions: description: 是否必填 type: boolean Type: - description: 类型:string, text, number + description: 类型:string, text, number, boolean type: string type: object task.UpdateScheduleRequest: diff --git a/internal/task/meta.go b/internal/task/meta.go index fb16b005..8c11301b 100644 --- a/internal/task/meta.go +++ b/internal/task/meta.go @@ -43,6 +43,11 @@ var ( func RegisterTaskMeta(meta TaskMeta) { dispatchableTasksMutex.Lock() defer dispatchableTasksMutex.Unlock() + for _, t := range dispatchableTasks { + if t.Type == meta.Type { + return + } + } dispatchableTasks = append(dispatchableTasks, meta) } diff --git a/internal/task/meta_test.go b/internal/task/meta_test.go new file mode 100644 index 00000000..e91c1b6b --- /dev/null +++ b/internal/task/meta_test.go @@ -0,0 +1,31 @@ +// Copyright 2026 Arctel.net +// SPDX-License-Identifier: Apache-2.0 + +package task_test + +import ( + "testing" + + "github.com/Rain-kl/Wavelet/internal/task" + taskhandlers "github.com/Rain-kl/Wavelet/internal/task/handlers" +) + +func TestDuplicateTaskMeta(t *testing.T) { + // Call Register twice to simulate being imported by multiple packages (routers, worker, etc.) + taskhandlers.Register() + taskhandlers.Register() + + metas := task.GetDispatchableTasks() + + // Check if we have duplicates by checking if a Type appears more than once + seen := make(map[string]int) + for _, m := range metas { + seen[m.Type]++ + } + + for taskType, count := range seen { + if count > 1 { + t.Errorf("Task type %q registered %d times, expected at most 1", taskType, count) + } + } +}