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  }