mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-04 15:06:37 +08:00
fix(task): restore task metadata contract and type fields in task types api
This commit is contained in:
@@ -4,23 +4,137 @@
|
||||
package extpoints
|
||||
|
||||
import (
|
||||
"Wavelet/core/contracts"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TaskDefinition holds the definition and runtime options for an asynchronous background task.
|
||||
type TaskDefinition struct {
|
||||
Pattern string
|
||||
Handler any
|
||||
Concurrency int
|
||||
Retry int
|
||||
Timeout time.Duration
|
||||
Metadata map[string]any
|
||||
Pattern string
|
||||
Type string
|
||||
Name string
|
||||
DisplayName string
|
||||
Description string
|
||||
Category string
|
||||
SupportsTime bool
|
||||
Retryable bool
|
||||
Queue string
|
||||
Params []contracts.TaskParamDTO
|
||||
Handler any
|
||||
Concurrency int
|
||||
Retry int
|
||||
Timeout time.Duration
|
||||
Metadata map[string]any
|
||||
}
|
||||
|
||||
// TaskOption configures a TaskDefinition.
|
||||
type TaskOption func(*TaskDefinition)
|
||||
|
||||
// WithTaskType sets the admin task type identifier.
|
||||
func WithTaskType(taskType string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Type = taskType
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskName sets the task human-readable display name.
|
||||
func WithTaskName(name string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Name = name
|
||||
if td.DisplayName == "" {
|
||||
td.DisplayName = name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskDisplayName sets the task display name.
|
||||
func WithTaskDisplayName(displayName string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.DisplayName = displayName
|
||||
if td.Name == "" {
|
||||
td.Name = displayName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskDescription sets the task description.
|
||||
func WithTaskDescription(desc string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Description = desc
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskCategory sets the task category grouping.
|
||||
func WithTaskCategory(category string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Category = category
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskSupportsTime sets whether the task supports time range filtering.
|
||||
func WithTaskSupportsTime(supports bool) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.SupportsTime = supports
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskQueue sets the task queue.
|
||||
func WithTaskQueue(queue string) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Queue = queue
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskRetryable sets whether the task is retryable.
|
||||
func WithTaskRetryable(retryable bool) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Retryable = retryable
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskParams sets the task parameter definitions.
|
||||
func WithTaskParams(params ...contracts.TaskParamDTO) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
td.Params = append(td.Params, params...)
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskMeta sets all task metadata from a TaskMetaDTO.
|
||||
func WithTaskMeta(meta contracts.TaskMetaDTO) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
if meta.Type != "" {
|
||||
td.Type = meta.Type
|
||||
}
|
||||
if meta.Name != "" {
|
||||
td.Name = meta.Name
|
||||
}
|
||||
if meta.DisplayName != "" {
|
||||
td.DisplayName = meta.DisplayName
|
||||
}
|
||||
if meta.Description != "" {
|
||||
td.Description = meta.Description
|
||||
}
|
||||
if meta.Category != "" {
|
||||
td.Category = meta.Category
|
||||
}
|
||||
td.SupportsTime = meta.SupportsTime
|
||||
if meta.Queue != "" {
|
||||
td.Queue = meta.Queue
|
||||
}
|
||||
td.Retryable = meta.Retryable
|
||||
if meta.MaxRetry > 0 {
|
||||
td.Retry = meta.MaxRetry
|
||||
}
|
||||
if meta.Timeout > 0 {
|
||||
td.Timeout = meta.Timeout
|
||||
}
|
||||
if len(meta.Params) > 0 {
|
||||
td.Params = append([]contracts.TaskParamDTO(nil), meta.Params...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WithTaskConcurrency sets the concurrency limit for the task.
|
||||
func WithTaskConcurrency(concurrency int) TaskOption {
|
||||
return func(td *TaskDefinition) {
|
||||
@@ -52,6 +166,47 @@ func WithTaskMetadata(key string, val any) TaskOption {
|
||||
}
|
||||
}
|
||||
|
||||
// ToDTO converts TaskDefinition to contracts.TaskMetaDTO.
|
||||
func (td TaskDefinition) ToDTO() contracts.TaskMetaDTO {
|
||||
taskType := td.Type
|
||||
if taskType == "" {
|
||||
taskType = td.Pattern
|
||||
}
|
||||
name := td.Name
|
||||
if name == "" {
|
||||
name = td.DisplayName
|
||||
}
|
||||
if name == "" {
|
||||
name = td.Pattern
|
||||
}
|
||||
displayName := td.DisplayName
|
||||
if displayName == "" {
|
||||
displayName = name
|
||||
}
|
||||
queue := td.Queue
|
||||
if queue == "" {
|
||||
queue = "default"
|
||||
}
|
||||
retryable := td.Retryable
|
||||
if !retryable && td.Retry > 0 {
|
||||
retryable = true
|
||||
}
|
||||
return contracts.TaskMetaDTO{
|
||||
Type: taskType,
|
||||
AsynqTask: td.Pattern,
|
||||
Name: name,
|
||||
DisplayName: displayName,
|
||||
Description: td.Description,
|
||||
Category: td.Category,
|
||||
SupportsTime: td.SupportsTime,
|
||||
Params: td.Params,
|
||||
MaxRetry: td.Retry,
|
||||
Timeout: td.Timeout,
|
||||
Queue: queue,
|
||||
Retryable: retryable,
|
||||
}
|
||||
}
|
||||
|
||||
// TaskExtension defines the interface for registering and querying background task handlers.
|
||||
type TaskExtension interface {
|
||||
Register(pattern string, handler any, opts ...TaskOption)
|
||||
|
||||
Reference in New Issue
Block a user