[#3132] added common cron expression macros
This commit is contained in:
		
							parent
							
								
									734f35c504
								
							
						
					
					
						commit
						5f21c4119f
					
				
							
								
								
									
										16
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										16
									
								
								CHANGELOG.md
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,19 @@
 | 
			
		|||
## v0.18.0 - WIP
 | 
			
		||||
 | 
			
		||||
- Reflected the latest JS SDK changes in the Admin UI.
 | 
			
		||||
 | 
			
		||||
- Added cron expression macros ([#3132](https://github.com/pocketbase/pocketbase/issues/3132)):
 | 
			
		||||
  ```
 | 
			
		||||
  "@yearly":   "0 0 1 1 *"
 | 
			
		||||
  "@annually": "0 0 1 1 *"
 | 
			
		||||
  "@monthly":  "0 0 1 * *"
 | 
			
		||||
  "@weekly":   "0 0 * * 0"
 | 
			
		||||
  "@daily":    "0 0 * * *"
 | 
			
		||||
  "@midnight": "0 0 * * *"
 | 
			
		||||
  "@hourly":   "0 * * * *"
 | 
			
		||||
  ```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## v0.17.5
 | 
			
		||||
 | 
			
		||||
- Added quotes around the wrapped view query columns introduced with v0.17.4.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,16 @@ func (s *Schedule) IsDue(m *Moment) bool {
 | 
			
		|||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var macros = map[string]string{
 | 
			
		||||
	"@yearly":   "0 0 1 1 *",
 | 
			
		||||
	"@annually": "0 0 1 1 *",
 | 
			
		||||
	"@monthly":  "0 0 1 * *",
 | 
			
		||||
	"@weekly":   "0 0 * * 0",
 | 
			
		||||
	"@daily":    "0 0 * * *",
 | 
			
		||||
	"@midnight": "0 0 * * *",
 | 
			
		||||
	"@hourly":   "0 * * * *",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSchedule creates a new Schedule from a cron expression.
 | 
			
		||||
//
 | 
			
		||||
// A cron expression is consisted of 5 segments separated by space,
 | 
			
		||||
| 
						 | 
				
			
			@ -72,10 +82,15 @@ func (s *Schedule) IsDue(m *Moment) bool {
 | 
			
		|||
//   - range:    1-30
 | 
			
		||||
//   - step:     */n or 1-30/n
 | 
			
		||||
//   - list:     1,2,3,10-20/n
 | 
			
		||||
//   - macros:   @yearly (or @annually), @monthly, @weekly, @daily (or @midnight), @hourly
 | 
			
		||||
func NewSchedule(cronExpr string) (*Schedule, error) {
 | 
			
		||||
	if v, ok := macros[cronExpr]; ok {
 | 
			
		||||
		cronExpr = v
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	segments := strings.Split(cronExpr, " ")
 | 
			
		||||
	if len(segments) != 5 {
 | 
			
		||||
		return nil, errors.New("invalid cron expression - must have exactly 5 space separated segments")
 | 
			
		||||
		return nil, errors.New("invalid cron expression - must be a valid macro or to have exactly 5 space separated segments")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	minutes, err := parseCronSegment(segments[0], 0, 59)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -208,6 +208,43 @@ func TestNewSchedule(t *testing.T) {
 | 
			
		|||
			false,
 | 
			
		||||
			`{"minutes":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"4":{},"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{},"48":{},"49":{},"5":{},"50":{},"51":{},"52":{},"53":{},"54":{},"55":{},"56":{},"57":{},"58":{},"59":{},"6":{},"7":{},"8":{},"9":{}},"hours":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"1":{},"2":{},"4":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// macros
 | 
			
		||||
		{
 | 
			
		||||
			"@yearly",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@annually",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@monthly",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@weekly",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@daily",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@midnight",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"@hourly",
 | 
			
		||||
			false,
 | 
			
		||||
			`{"minutes":{"0":{}},"hours":{"0":{},"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"days":{"1":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"2":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"3":{},"30":{},"31":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"months":{"1":{},"10":{},"11":{},"12":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{}},"daysOfWeek":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}}}`,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, s := range scenarios {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue