github.com/goravel/framework@v1.13.9/schedule/event.go (about) 1 package schedule 2 3 import ( 4 "strings" 5 6 "github.com/goravel/framework/contracts/schedule" 7 ) 8 9 type Event struct { 10 callback func() 11 command string 12 cron string 13 delayIfStillRunning bool 14 name string 15 onOneServer bool 16 skipIfStillRunning bool 17 } 18 19 func NewCallbackEvent(callback func()) *Event { 20 return &Event{callback: callback} 21 } 22 23 func NewCommandEvent(command string) *Event { 24 return &Event{command: command, name: command} 25 } 26 27 //At Schedule the command at a given time. 28 func (receiver *Event) At(time string) schedule.Event { 29 return receiver.DailyAt(time) 30 } 31 32 //Cron The Cron expression representing the event's frequency. 33 func (receiver *Event) Cron(expression string) schedule.Event { 34 receiver.cron = expression 35 36 return receiver 37 } 38 39 //Daily Schedule the event to run daily. 40 func (receiver *Event) Daily() schedule.Event { 41 event := receiver.Cron(receiver.spliceIntoPosition(1, "0")) 42 43 return event.Cron(receiver.spliceIntoPosition(2, "0")) 44 } 45 46 //DailyAt Schedule the event to run daily at a given time (10:00, 19:30, etc). 47 func (receiver *Event) DailyAt(time string) schedule.Event { 48 segments := strings.Split(time, ":") 49 event := receiver.Cron(receiver.spliceIntoPosition(2, segments[0])) 50 51 if len(segments) == 2 { 52 return event.Cron(receiver.spliceIntoPosition(1, segments[1])) 53 } else { 54 return event.Cron(receiver.spliceIntoPosition(1, "0")) 55 } 56 } 57 58 //DelayIfStillRunning Do not allow the event to overlap each other. 59 func (receiver *Event) DelayIfStillRunning() schedule.Event { 60 receiver.delayIfStillRunning = true 61 62 return receiver 63 } 64 65 //EveryMinute Schedule the event to run every minute. 66 func (receiver *Event) EveryMinute() schedule.Event { 67 return receiver.Cron(receiver.spliceIntoPosition(1, "*")) 68 } 69 70 //EveryTwoMinutes Schedule the event to run every two minutes. 71 func (receiver *Event) EveryTwoMinutes() schedule.Event { 72 return receiver.Cron(receiver.spliceIntoPosition(1, "*/2")) 73 } 74 75 //EveryThreeMinutes Schedule the event to run every three minutes. 76 func (receiver *Event) EveryThreeMinutes() schedule.Event { 77 return receiver.Cron(receiver.spliceIntoPosition(1, "*/3")) 78 } 79 80 //EveryFourMinutes Schedule the event to run every four minutes. 81 func (receiver *Event) EveryFourMinutes() schedule.Event { 82 return receiver.Cron(receiver.spliceIntoPosition(1, "*/4")) 83 } 84 85 //EveryFiveMinutes Schedule the event to run every five minutes. 86 func (receiver *Event) EveryFiveMinutes() schedule.Event { 87 return receiver.Cron(receiver.spliceIntoPosition(1, "*/5")) 88 } 89 90 //EveryTenMinutes Schedule the event to run every ten minutes. 91 func (receiver *Event) EveryTenMinutes() schedule.Event { 92 return receiver.Cron(receiver.spliceIntoPosition(1, "*/10")) 93 } 94 95 //EveryFifteenMinutes Schedule the event to run every fifteen minutes. 96 func (receiver *Event) EveryFifteenMinutes() schedule.Event { 97 return receiver.Cron(receiver.spliceIntoPosition(1, "*/15")) 98 } 99 100 //EveryThirtyMinutes Schedule the event to run every thirty minutes. 101 func (receiver *Event) EveryThirtyMinutes() schedule.Event { 102 return receiver.Cron(receiver.spliceIntoPosition(1, "0,30")) 103 } 104 105 //EveryTwoHours Schedule the event to run every two hours. 106 func (receiver *Event) EveryTwoHours() schedule.Event { 107 event := receiver.Cron(receiver.spliceIntoPosition(1, "0")) 108 109 return event.Cron(receiver.spliceIntoPosition(2, "*/2")) 110 } 111 112 //EveryThreeHours Schedule the event to run every three hours. 113 func (receiver *Event) EveryThreeHours() schedule.Event { 114 event := receiver.Cron(receiver.spliceIntoPosition(1, "0")) 115 116 return event.Cron(receiver.spliceIntoPosition(2, "*/3")) 117 } 118 119 //EveryFourHours Schedule the event to run every four hours. 120 func (receiver *Event) EveryFourHours() schedule.Event { 121 event := receiver.Cron(receiver.spliceIntoPosition(1, "0")) 122 123 return event.Cron(receiver.spliceIntoPosition(2, "*/4")) 124 } 125 126 //EverySixHours Schedule the event to run every six hours. 127 func (receiver *Event) EverySixHours() schedule.Event { 128 event := receiver.Cron(receiver.spliceIntoPosition(1, "0")) 129 130 return event.Cron(receiver.spliceIntoPosition(2, "*/6")) 131 } 132 133 func (receiver *Event) GetCron() string { 134 if receiver.cron == "" { 135 receiver.cron = "* * * * *" 136 } 137 138 return receiver.cron 139 } 140 141 func (receiver *Event) GetCommand() string { 142 return receiver.command 143 } 144 145 func (receiver *Event) GetCallback() func() { 146 return receiver.callback 147 } 148 149 func (receiver *Event) GetName() string { 150 return receiver.name 151 } 152 153 func (receiver *Event) GetSkipIfStillRunning() bool { 154 return receiver.skipIfStillRunning 155 } 156 157 func (receiver *Event) GetDelayIfStillRunning() bool { 158 return receiver.delayIfStillRunning 159 } 160 161 //Hourly Schedule the event to run hourly. 162 func (receiver *Event) Hourly() schedule.Event { 163 return receiver.Cron(receiver.spliceIntoPosition(1, "0")) 164 } 165 166 //HourlyAt Schedule the event to run hourly at a given offset in the hour. 167 func (receiver *Event) HourlyAt(offset []string) schedule.Event { 168 return receiver.Cron(receiver.spliceIntoPosition(1, strings.Join(offset, ","))) 169 } 170 171 func (receiver *Event) IsOnOneServer() bool { 172 return receiver.onOneServer 173 } 174 175 func (receiver *Event) Name(name string) schedule.Event { 176 receiver.name = name 177 178 return receiver 179 } 180 181 func (receiver *Event) OnOneServer() schedule.Event { 182 receiver.onOneServer = true 183 184 return receiver 185 } 186 187 //SkipIfStillRunning Do not allow the event to overlap each other. 188 func (receiver *Event) SkipIfStillRunning() schedule.Event { 189 receiver.skipIfStillRunning = true 190 191 return receiver 192 } 193 194 //spliceIntoPosition Splice the given value into the given position of the expression. 195 func (receiver *Event) spliceIntoPosition(position int, value string) string { 196 segments := strings.Split(receiver.GetCron(), " ") 197 198 segments[position-1] = value 199 200 return strings.Join(segments, " ") 201 }