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 }