65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package cron
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"show-rss/src/feeds"
|
|
"time"
|
|
|
|
"github.com/robfig/cron/v3"
|
|
)
|
|
|
|
func Main(ctx context.Context) error {
|
|
c := time.NewTicker(time.Minute)
|
|
defer c.Stop()
|
|
for {
|
|
if err := One(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
case <-c.C:
|
|
}
|
|
}
|
|
return ctx.Err()
|
|
}
|
|
|
|
func One(ctx context.Context) error {
|
|
f, err := feeds.New(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return f.ForEach(ctx, func(feed feeds.Feed) error {
|
|
if err := one(ctx, feed); err != nil {
|
|
return fmt.Errorf("failed to cron %s (%+v): %w", feed.Entry.ID, feed.Version, err)
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func one(ctx context.Context, feed feeds.Feed) error {
|
|
if schedule, err := cron.NewParser(
|
|
cron.SecondOptional |
|
|
cron.Minute |
|
|
cron.Hour |
|
|
cron.Dom |
|
|
cron.Month |
|
|
cron.Dow |
|
|
cron.Descriptor,
|
|
).Parse(feed.Version.Cron); err != nil {
|
|
return fmt.Errorf("illegal cron %q", feed.Version.Cron)
|
|
} else if next := schedule.Next(feed.Execution.Executed); time.Now().Before(next) {
|
|
return nil
|
|
}
|
|
|
|
return fmt.Errorf("should GET %s", feed.Version.URL)
|
|
|
|
f, err := feeds.New(ctx)
|
|
if err != nil {
|
|
return fmt.Errorf("failed new feeds to executed %s: %w", feed.Entry.ID, err)
|
|
}
|
|
return f.Executed(ctx, feed.Entry.ID, feed.Version.Created)
|
|
}
|