github.com/goravel/framework@v1.13.9/event/task.go (about)

     1  package event
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/goravel/framework/contracts/event"
     7  	queuecontract "github.com/goravel/framework/contracts/queue"
     8  )
     9  
    10  type Task struct {
    11  	args      []event.Arg
    12  	event     event.Event
    13  	listeners []event.Listener
    14  	queue     queuecontract.Queue
    15  }
    16  
    17  func NewTask(queue queuecontract.Queue, args []event.Arg, event event.Event, listeners []event.Listener) *Task {
    18  	return &Task{
    19  		args:      args,
    20  		event:     event,
    21  		listeners: listeners,
    22  		queue:     queue,
    23  	}
    24  }
    25  
    26  func (receiver *Task) Dispatch() error {
    27  	if len(receiver.listeners) == 0 {
    28  		return fmt.Errorf("event %v doesn't bind listeners", receiver.event)
    29  	}
    30  
    31  	handledArgs, err := receiver.event.Handle(receiver.args)
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	var mapArgs []any
    37  	for _, arg := range handledArgs {
    38  		mapArgs = append(mapArgs, arg.Value)
    39  	}
    40  
    41  	for _, listener := range receiver.listeners {
    42  		var err error
    43  		task := receiver.queue.Job(listener, eventArgsToQueueArgs(handledArgs))
    44  		queue := listener.Queue(mapArgs...)
    45  		if queue.Connection != "" {
    46  			task.OnConnection(queue.Connection)
    47  		}
    48  		if queue.Queue != "" {
    49  			task.OnQueue(queue.Queue)
    50  		}
    51  		if queue.Enable {
    52  			err = task.Dispatch()
    53  		} else {
    54  			err = task.DispatchSync()
    55  		}
    56  
    57  		if err != nil {
    58  			return err
    59  		}
    60  	}
    61  
    62  	return nil
    63  }
    64  
    65  func eventArgsToQueueArgs(args []event.Arg) []queuecontract.Arg {
    66  	var queueArgs []queuecontract.Arg
    67  	for _, arg := range args {
    68  		queueArgs = append(queueArgs, queuecontract.Arg{
    69  			Type:  arg.Type,
    70  			Value: arg.Value,
    71  		})
    72  	}
    73  
    74  	return queueArgs
    75  }